给定以下类层次结构
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
的反对者。
答案 0 :(得分:1)
这是因为,尽管名称,两种方法完全不同。类methodOne
中的B
不会覆盖类A
中具有相同名称的方法。正如您所说,B
无法看到私有methodOne
,因此它无法覆盖它。因此,Java创建了两个不相关的单独方法。然后A
methodTwo
调用methodOne
中定义的A
。如果它是公共的或受保护的,那么其他类可能已经覆盖了它,从而导致后期绑定我们对Java的了解非常多。但是,它看到的methodOne
从未被覆盖,因为B
并不知道这样做。
tl; dr :在内部,他们是两种不同且无关的方法,即使名称相同。
答案 1 :(得分:1)
首先,您的代码开始执行代码
public static void main(String[] args)
{
System.out.println(new B().methodOne(101)); // it invokes methodOne() of class B.
}
以上代码调用methodOne()
的{{1}}。现在,class B
是私有的,因此无法在MethodOne()
现在定义B类中的Class B
methodOne()
此代码将int methodOne(int i)
{
return methodTwo(++i); // calling methodTwo() from class A which is a super class of class B.
}
的值增加1.因此,现在i
。现在再次使用方法在下面的代码中调用i = 102
methodOne()
。
class B
现在是public int methodTwo(int i) //methodTwo in class A. part of object due to public access modifier.
{
return methodOne(++i); // it increase the value of i by 1. Now i =103.
}
的值。现在它调用了i = 103
methodOne()
,因为class A
中的methodOne()
是私有的
Class A
将private int methodOne(int i)
{
return ++i; //again this increase the value of i by 1. Now i =104.
}
的值增加1.因此,变量i
。所以,i = 104
的最终值是104 Now。
所以,最终输出是104。