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


您可以通过在答案上打勾来批准一个正确答案,该答案完全适合您的问题。打勾表示被询问用户批准的验证答案。