为什么 Java 父类构造函数调用被重写的方法会调用到子类的

2022-11-17 13:45:05 +08:00
 movq
   public static void main(String[] args) {
        class Parent {

            Parent() {
                print();
            }

            void print() {
                System.out.println(10);
            }
        }

        class Child extends Parent {


            void print() {
                System.out.println(20);
            }
        }
        Parent parent = new Child();
    }

上面这段代码输出是 20.

感觉这样很奇怪,为什么父类的构造函数调用 print 给调用到子类了呢?这样难道不是一种反直觉的结果吗?

9685 次点击
所在节点    程序员
125 条回复
movq
2022-11-19 17:50:05 +08:00
@wenzhoou 你现在在这里补充的内容,和题目相关,但是你在 10 楼本身的内容,是和题目无关的。我不是针对你,你说的也没错,但是有些人逼逼赖赖的说什么让我多看 10 楼的内容几遍,意思我不懂运行时多态,有啥意思呢
Keen06
2022-11-19 17:55:38 +08:00
@geelaw 谢谢回复,我设想了一下在虚函数中调用另一个虚函数的场景,感觉可能修改虚表指针相比于继续将该虚函数解析为非虚函数更简单,修改虚表指针只需要在构造函数调用的第一个虚函数那里修改即可,后面自然可以调用合适的虚函数。再次感谢!
zsdroid
2022-11-19 19:55:47 +08:00
op 写的太高深了,让小白(包括我)看不出问题在哪。
改造了一下应该可以看出问题了:
```java
/**
输出:
Parent!
Child.print
Child!
*/
class Main {
public static void main(String[] args) {
class Parent {
public Parent() {
System.out.println("Parent!");
print();
}
public void print() {
System.out.println("Parent.print");
}
}

class Child extends Parent {
public Child() {
System.out.println("Child!");
}
public void print() {
System.out.println("Child.print");
}
}
Parent parent = new Child();

}
}
```
wenzhoou
2022-11-20 11:23:57 +08:00
TO OP ,可以可以,我们不扣字眼。你开心就行。
恰好我也是 20 多年 java 经验,jvm 也深入研究过,对于小白问题,我回答不回答,我又不损失什么。
我也不是为了别人点赞才回复的。
你是我的第一个 block ,以后你的问题我也不会回答了。谢谢。
book1925
2022-11-21 16:29:04 +08:00
@mind3x
学习了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/895919

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX