java - 为什么这段代码打印的是 20 20 而不是 20 10?

标签 java core

<分区>

package package1;
public class MyClassA {
    protected int size;
    public MyClassA() {
    }
    protected int getAge() {
        return 10;
    }
    public int callAge() {
        return getAge();
    }
}

package package2;
import package1.MyClassA;
public class MyClassB extends MyClassA {
    protected int getAge() {
    return 20;
    }
    private int superesult() {
        return super.callAge();
    }
    public static void main(String args[]) {
        MyClassB classb = new MyClassB();
        System.out.println(classb.getAge());
        System.out.println(classb.superesult());
    }
}

当我调用 getAge 和 superresult 方法时,我期望 20 10 作为输出,但代码正在打印 20 20。提前致谢。

最佳答案

简答:您调用 callAge,因为它在 A 中实现。但是该方法调用被重写的 getAge(因此 Java 遵循它在 B 中完成的实现)。

更长的版本:

当你打电话时:

classb.superesult();

它将调用super.callAge(),这意味着A类的callAge()被执行了。 callAge() 在他的部分调用了 getAge() 但由于该对象是类 BgetAge( ) 被覆盖,它返回 20

请注意,如果您调用 super.foo(),您只会调用 super foosuper 因此并不意味着您“改变了上下文”:super 调用产生的所有调用仍然通过对象上的动态绑定(bind)(以及对象仍然是 B 的实例)。所有 foo 调用都可以被覆盖(除非这些调用被标记为 final)。在大多数情况下,这是所需的行为。

关于java - 为什么这段代码打印的是 20 20 而不是 20 10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43868404/

相关文章:

java - 数据源监控

java - WebSphere MQ 消息读取器(来自文件)

lucene - Elasticsearch : when to set omit_norms option as false

python - 什么代表 Python 中 print/repr 上显示的十六进制整数?

java存储可能被垃圾收集的对象

java - Android Firebase 排序

java - 如何检查有多少 EditText 为空?

android - 如何将 ZXing 库集成到 Android Studio 进行条码扫描?

linux:如何生成核心文件?

javascript - Kendo Core - 需要基本帮助