java如何在运行时解析隐藏方法
给定以下类层次结构java如何在运行时解析隐藏方法,java,inheritance,access-modifiers,overriding,Java,Inheritance,Access Modifiers,Overriding,给定以下类层次结构 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 me
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()
在Class A
中是private
。但是,在运行时,当在methodTwo()
内时,运行时对象的类型为类B
。为什么java
会在class A
中使用methodOne()
来反对class B
这是因为,尽管名称不同,这两种方法是完全不同的<类B
中的code>methodOne不会重写类A
中同名的方法。正如您所说,B
无法看到私有的methodOne
,因此它不可能覆盖它。因此,Java创建了两个完全不相关的独立方法。然后A
的methodTwo
调用methodOne
中定义的A
。如果它是公共的或受保护的,那么其他类可能已经覆盖了它,导致了我们从Java中非常熟悉的后期绑定。但是,它看到的methodOne
从未被覆盖,因为B
不知道该怎么做
tl;dr:在内部,它们是两个不同且不相关的方法,即使名称相同。首先,代码开始执行代码
public static void main(String[] args)
{
System.out.println(new B().methodOne(101)); // it invokes methodOne() of class B.
}
上述代码调用了class B
的methodOne()。现在,MethodOne()
是私有的,因此它不会在类B中重写
现在定义类B中的methodOne()
int methodOne(int i)
{
return methodTwo(++i); // calling methodTwo() from class A which is a super class of class B.
}
此代码将i
的值增加1。所以,现在i=102
。现在,在下面的代码中,方法二再次调用类B
的methodOne()
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的值。现在它调用class A
的methodOne()
,因为methodOne()
在class A
中是私有的
private int methodOne(int i)
{
return ++i; //again this increase the value of i by 1. Now i =104.
}
将i
的值增加1。因此,变量i=104
。所以,i
的最终值现在是104
所以,最终的输出是104
您可以通过在答案上打勾来批准一个正确答案,该答案完全适合您的问题。打勾表示被询问用户批准的验证答案。