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)"); }
}
ここで学んだことは
- メソッドのシグネチャは、コンパイル時のデータ型に基づいて決定されます
- 実際に呼び出されるメソッドは、メソッドが呼び出されるオブジェクトの動的タイプによって異なります。
それに基づいて、最初の 2 つの呼び出しの結果は期待どおりです。ただし、例 3 と 4 の結果がわかりません。
Java言語仕様で規定されているようですが、よくわかりません。