给定以下类层次结构
package pack1;
public class A
{
private int methodOne(int i)
{
return ++i;
}
public int methodTwo(int i)
{
return methodOne(++i);
}
}
package pack2;
import pack1.A;
class B extends A
{
int methodOne(int i)
{
return methodTwo(++i);
}
}
public class MainClass
{
public static void main(String[] args)
{
System.out.println(new B().methodOne(101));
}
}
上面程序的输出是104。
Class B
创建自己的methodOn()
版本,因为methodOne()
在private
中是Class A
。但是,在运行时期间,在methodTwo()
内时,运行时对象的类型为Class B
。为什么java
在methodOne()
中使用class A
与class B
相反。 最佳答案
这是因为,尽管有名称,但这两种方法完全不同。类methodOne
中的B
不会覆盖类A
中具有相同名称的方法。如您所说,B
无法看到私有methodOne
,因此它不可能覆盖它。因此,Java创建了两个互不相关的独立方法。然后A
的methodTwo
调用methodOne
中定义的A
。如果它是公共的或受保护的,那么其他类可能会覆盖它,从而导致后期绑定,我们对Java的了解非常清楚。但是,它看到的methodOne
从未被覆盖,因为B
不知道这样做。
tl; dr:在内部,它们是两个不同且不相关的方法,即使名称相同。