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

Posted

技术标签:

【中文标题】java如何在运行时解析隐藏方法【英文标题】:How does java resolve hidden methods at runtime 【发布时间】: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 表示它是被询问的用户批准的经过验证的答案。 【参考方案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。

【讨论】:

以上是关于java如何在运行时解析隐藏方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时发出和执行 Java 字节码?

Java错误和异常解析

在触发方法运行时隐藏按钮

当android应用程序后台运行时如何在android中隐藏视图(在后台运行时不停止android拍摄快照)[重复]

如何在运行时解析 dll 中的外部符号,而不是使用 Cygwin 进行链接时

jvm运行时内存解析