【发布时间】:2013-02-03 19:33:27
【问题描述】:
我试图弄清楚 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里指定的,不过没看懂。
【问题讨论】:
-
作为这个作业问题的作者,我可以确认提供的答案是正确的。
标签: java overloading