java 如何在运行时解析隐藏方法
How does java resolve hidden methods at runtime
给定以下 class 层次结构
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()
内时,运行时对象的类型为 Class B
。为什么 java
在 class A
中使用 methodOne()
而不是 class B
.
这是因为,尽管名称不同,这两种方法是完全不同的。 methodOne
in class B
不会覆盖 class A
中的同名方法。正如您所说,B
看不到私有 methodOne
,因此它不可能覆盖它。所以 Java 创建了两个完全不相关的独立方法。然后 A
的 methodTwo
调用 A
中定义的 methodOne
。如果它是 public 或受保护的,那么其他 class 可能会覆盖它,从而导致我们从 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()
是私有的,因此它不会在 Class B
中被覆盖
现在 Class 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
。现在 methodTwo 在下面的代码中再次调用 class 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。
So, The Final Output is 104.
给定以下 class 层次结构
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()
内时,运行时对象的类型为 Class B
。为什么 java
在 class A
中使用 methodOne()
而不是 class B
.
这是因为,尽管名称不同,这两种方法是完全不同的。 methodOne
in class B
不会覆盖 class A
中的同名方法。正如您所说,B
看不到私有 methodOne
,因此它不可能覆盖它。所以 Java 创建了两个完全不相关的独立方法。然后 A
的 methodTwo
调用 A
中定义的 methodOne
。如果它是 public 或受保护的,那么其他 class 可能会覆盖它,从而导致我们从 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()
是私有的,因此它不会在 Class B
现在 Class 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
。现在 methodTwo 在下面的代码中再次调用 class 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。
So, The Final Output is 104.