gpt4 book ai didi

java - java中方法是如何继承的

转载 作者:行者123 更新时间:2023-12-01 18:30:18 25 4
gpt4 key购买 nike

我有以下类(class):

package com.zee.main;
import com.zee.sub.Sub;

public class MainClass {
public static void main(String[] args) {
Sub sub = new Sub();
sub.add();
}
}

package com.zee.sup;
public class Super
{
private int a = 2;
private int b = 3;

public void add(){
System.out.println("Result: "+(a+b));
System.out.println("Class:" +this.getClass().getName());
}
}

package com.zee.sub;
import com.zee.sup.Super;

public class Sub extends Super {
}

输出:

Result: 5
Class:com.zee.sub.Sub

如何做Subclass继承其Superclass的方法?我假设 Superclass 中定义的方法成为 Subclass 的一部分但是当我检查Sub编译后的字节码时,发现没有add Super 类中定义的方法。

// Compiled from Sub.java (version 1.6 : 50.0, super bit)
public class com.zee.sub.Sub extends com.zee.sup.Super {

// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public Sub();
0 aload_0 [this]
1 invokespecial com.zee.sup.Super() [8]
4 return
Line numbers:
[pc: 0, line: 5]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: com.zee.sub.Sub
}

以下是我的问题:

  1. 因为没有add Sub 编译后的字节码中的方法,add方法Superclass必须在运行时调用。

  2. 与第一点相矛盾的是 this.getClass().getName()它返回此对象的运行时类,但其打印 Sub作为运行时类。

  3. 如果运行时类是 Sub,那么它如何访问私有(private)字段 ab super 类的 add方法?

有人可以解释一下吗?提前致谢

最佳答案

您的“问题”并不完全是问题,而是回答它们:

  • 如果反汇编 main 方法,您会看到对 add()invokevirtual 的调用。这告诉 JVM 在类层次结构中查找要调用的适当方法,从子类开始,如果没有找到实现,则向上查找。

  • Object#getClass() 是 Java 中特殊的基础结构方法之一。 It's implemented with native code并 Hook JVM 内部来识别相关对象的类。

  • Sub访问私有(private)成员。 Super 中的代码访问它们。

关于java - java中方法是如何继承的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24514081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com