Tôi đang cố gắng để có được vòng đầu của tôi như thế nào Java lựa chọn phương pháp nào được thực hiện:Java phương pháp quá tải lựa chọn
//Example 1 prints Square:add(Figure)
Figure fs = new Square();
fs.add(fs);
//Example 2 prints Square:add(Figure)
Rectangle rs = new Square();
rs.add(fs);
//Example 3 prints Rectangle:add(Rectangle). Expected Square:add(Square)
rs.add(new Square());
//Example 4 prints Rectangle:add(Rectangle). Expected Square:add(Figure)
Square ss = new Square();
ss.add(rs);
class Figure
{
public void add(Figure f){ System.out.println("Figure:add(Figure)"); }
}
class Rectangle extends Figure
{
@Override
public void add(Figure f){ System.out.println("Rectangle:add(Figure)"); }
public void add(Rectangle r){ System.out.println("Rectangle:add(Rectangle)"); }
}
class Square extends Rectangle
{
@Override
public void add(Figure f){ System.out.println("Square:add(Figure)"); }
public void add(Square s){ System.out.println("Square:add(Square)"); }
}
Những gì tôi đã học được here là
- Phương pháp chữ ký được xác định dựa trên các kiểu dữ liệu thời gian biên dịch
- Phương thức thực tế được gọi phụ thuộc vào loại động của đối tượng mà phương thức được gọi.
Dựa trên đó, kết quả của hai cuộc gọi đầu tiên như mong đợi. Tuy nhiên, tôi không hiểu kết quả của ví dụ 3 và 4.
Dường như được chỉ định trong số java language specification, nhưng tôi không hiểu.
Là tác giả của câu hỏi chuyển nhượng này, tôi có thể xác nhận rằng các câu trả lời được cung cấp là chính xác. – Dominik