java如何在运行时解析隐藏方法

时间:2017-11-05 02:27:49

标签: java inheritance access-modifiers method-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 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的反对者。

2 个答案:

答案 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。