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));
    }
}

以上程序的输出为104Class B创建自己的 methodOn() 版本,因为 methodOne()Class A 中的 private。但是,在运行时,当在 methodTwo() 内时,运行时对象的类型为 Class B。为什么 javaclass A 中使用 methodOne() 而不是 class B.

这是因为,尽管名称不同,这两种方法是完全不同的methodOne in class B 不会覆盖 class A 中的同名方法。正如您所说,B 看不到私有 methodOne,因此它不可能覆盖它。所以 Java 创建了两个完全不相关的独立方法。然后 AmethodTwo 调用 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 BmethodOne()。现在,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 BmethodOne()

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 AmethodOne() ,因为 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.