给定以下类层次结构

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。为什么javamethodOne()中使用class Aclass B相反。

最佳答案

这是因为,尽管有名称,但这两种方法完全不同。类methodOne中的B不会覆盖类A中具有相同名称的方法。如您所说,B无法看到私有methodOne,因此它不可能覆盖它。因此,Java创建了两个互不相关的独立方法。然后AmethodTwo调用methodOne中定义的A。如果它是公共的或受保护的,那么其他类可能会覆盖它,从而导致后期绑定,我们对Java的了解非常清楚。但是,它看到的methodOne从未被覆盖,因为B不知道这样做。

tl; dr:在内部,它们是两个不同且不相关的方法,即使名称相同。

07-28 13:46