java 为什么这个代码是20 20而不是20 10?

1l5u6lss  于 2024-01-05  发布在  Java
关注(0)|答案(3)|浏览(275)

此问题在此处已有答案

Polymorphism vs Overriding vs Overloading(21个回答)
6年前关闭。
当我调用getAgesuperresult方法时,我期望输出 20 10,但代码打印 20 20。为什么我得到不同的结果?

  1. package package1;
  2. public class MyClassA {
  3. protected int size;
  4. public MyClassA() {
  5. }
  6. protected int getAge() {
  7. return 10;
  8. }
  9. public int callAge() {
  10. return getAge();
  11. }
  12. }
  13. package package2;
  14. import package1.MyClassA;
  15. public class MyClassB extends MyClassA {
  16. protected int getAge() {
  17. return 20;
  18. }
  19. private int superesult() {
  20. return super.callAge();
  21. }
  22. public static void main(String args[]) {
  23. MyClassB classb = new MyClassB();
  24. System.out.println(classb.getAge());
  25. System.out.println(classb.superesult());
  26. }
  27. }

字符串

6l7fqoea

6l7fqoea1#

简答:你调用callAge,因为它是在A中实现的。但是那个方法调用了getAge,它被重写了(因此Java遵循了B中的实现)。
较长版本

当您致电:

  1. classb.superesult();

字符串
它将调用super.callAge(),所以这意味着类AcallAge()被执行。callAge()在他的部分调用getAge(),但由于对象是类B的示例,getAge()被重写,它返回20
请注意,如果你调用super.foo(),你只是调用了super foosuper并不意味着你“改变了上下文”**:超级调用产生的所有调用仍然通过对象上的动态绑定来解析(对象仍然是B的示例)。所有foo的调用都可以被覆盖(除非这些调用被标记为final)。这在大多数情况下都是所需的对象。

v7pvogib

v7pvogib2#

它是polymorphism。你在getAge()方法中有ovveridden。所以当你调用这个方法时,ovverdien方法总是执行。
Java虚拟机(JVM)为每个变量中引用的对象调用适当的方法。它不调用由变量类型定义的方法。这种行为称为虚拟方法调用,并演示了Java语言中重要的多态性特性的一个方面。

relj7zay

relj7zay3#

这是因为你在子类中覆盖了getAge()方法。现在因为MyClassB classb = new MyClassB();指向子类,所以它的方法将被调用,而不是父方法

相关问题