【问题标题】:How does java resolve hidden methods at runtimejava如何在运行时解析隐藏方法
【发布时间】:2018-04-17 11:23:08
【问题描述】:

给定以下类层次结构

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

【问题讨论】:

  • 您可以通过在答案上打勾来批准一个答案作为完全适合您的问题的正确答案。 Marking Tick 表示它是被询问的用户批准的经过验证的答案。

标签: java inheritance access-modifiers overriding


【解决方案1】:

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

tl;dr:在内部,它们是两种不同且不相关的方法,尽管名称相同。

【讨论】:

    【解决方案2】:

    首先你的代码开始执行代码

    public static void main(String[] args)
        {
            System.out.println(new B().methodOne(101)); // it invokes methodOne() of class B.
        }
    

    以上代码调用methodOne()class B。现在,MethodOne() 是私有的,因此它不会在 Class 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。现在在下面的代码中再次调用class BmethodOne() 的methodTwo。

    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.
        }
    

    i 的值增加1。因此,变量i = 104。所以,i 的最终值现在是 104。

    所以,最终输出是 104。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      相关资源
      最近更新 更多