我試圖讓我的頭一輪的Java如何選擇哪個方法被執行:Java的重載方法選擇
//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)"); }
}
我所學到here是
- 方法簽名系統會根據確定編譯時間數據類型
- 調用的實際方法取決於調用該方法的對象的動態類型。
基於此,前兩次調用的結果與預期相同。但是,我不明白例3和4的結果。
它似乎在java language specification中指定,但我不明白。
作爲這個作業問題的作者,我可以確認提供的答案是正確的。 – Dominik