使用超类引用调用重载的继承方法

罗伯特

我不了解这种Java行为。我有两节课:

class C1 {
    public void m1(double num) {
        System.out.println("Inside C1.m1(): " + num);
    }
}

class C2 extends C1 {
    public void m1(int num) {
        System.out.println("Inside C2.m1(): " + num);
    }
}

这是我的主要内容:

public class Main {

    public static void main(String[] args) {
        C1 c = new C2();
        c.m1(10);
    }
}

结果是:

Inside C1.m1(): 10.0

当我期望的时候:

Inside C2.m1(): 10

另外,当我尝试完成代码语法时,我发现了这一点:

在此处输入图片说明

C2类的其他m1在哪里?

我还检查了Main.class的字节码,我看到了:

Compiled from "Main.java"
public class com.company.Main {
  public com.company.Main();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/company/C2
       3: dup
       4: invokespecial #3                  // Method com/company/C2."<init>":()V
       7: astore_1
       8: aload_1
       9: ldc2_w        #4                  // double 10.0d
      12: invokevirtual #6                  // Method com/company/C1.m1:(D)V
      15: return
}

字节码告诉我它将调用C1.m1(D)V(第12行)。

为什么采用C1的方法?我试图了解这种行为。

克莱里斯-谨慎乐观-

您命名的两个方法m1没有相同的签名;超类中的一个取一个double,子类中一个的取一个int这意味着编译器将根据变量的编译时类型(C1和将调用)选择要调用的方法签名m1(double)由于该类在运行时C2没有的重写版本m1(double),因此C1将调用from的版本

规则是方法签名是在编译时根据编译时类型计算的;在运行时根据匹配的签名调度方法调用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在多重继承中调用超类方法

来自分类Dev

继承调用超类方法java

来自分类Dev

C ++继承的方法调用基类的方法,而不是重载的方法

来自分类Dev

使用超类引用时方法重载不起作用

来自分类Dev

Java反射:从超类继承的类中调用GetDeclaredFields()方法

来自分类Dev

Java转换为超类并调用重载方法

来自分类Dev

由于循环依赖,重载弱引用的属性类型与从超类继承的类型不兼容

来自分类Dev

如何从重写的子类方法调用超类的继承方法?

来自分类Dev

Java:在跳过中间继承的超类时调用基本超类方法

来自分类Dev

重写超类继承的方法

来自分类Dev

C ++继承:调用重载的基类函数

来自分类Dev

在继承的类中使用调用方法发出

来自分类Dev

超类引用无法在Java中调用子类方法

来自分类Dev

有什么方法可以在超类中定义泛型方法以引用继承类的类型?

来自分类Dev

从超类调用方法

来自分类Dev

从超类调用方法

来自分类Dev

当子类调用超类的方法时,如何获得超类来引用子类中的属性?

来自分类Dev

让继承的类实现超类的方法

来自分类Dev

从超类的超类调用方法

来自分类Dev

可以在子类的方法内部使用“ super”来调用相应的超类方法而无需直接引用吗?

来自分类Dev

重载类方法的歧义调用

来自分类Dev

将继承的类的对象关联到超类的引用

来自分类Dev

在Java中,“ this”在继承该方法的子类上调用的超类方法中表示什么?

来自分类Dev

使用类的引用调用接口方法

来自分类Dev

函数继承-child.apply()上的超类中的调用方法

来自分类Dev

toString()方法不是从其超类继承的

来自分类Dev

模拟超类方法调用

来自分类Dev

调用超类方法operator ==

来自分类Dev

Clojure:调用超类方法

Related 相关文章

  1. 1

    在多重继承中调用超类方法

  2. 2

    继承调用超类方法java

  3. 3

    C ++继承的方法调用基类的方法,而不是重载的方法

  4. 4

    使用超类引用时方法重载不起作用

  5. 5

    Java反射:从超类继承的类中调用GetDeclaredFields()方法

  6. 6

    Java转换为超类并调用重载方法

  7. 7

    由于循环依赖,重载弱引用的属性类型与从超类继承的类型不兼容

  8. 8

    如何从重写的子类方法调用超类的继承方法?

  9. 9

    Java:在跳过中间继承的超类时调用基本超类方法

  10. 10

    重写超类继承的方法

  11. 11

    C ++继承:调用重载的基类函数

  12. 12

    在继承的类中使用调用方法发出

  13. 13

    超类引用无法在Java中调用子类方法

  14. 14

    有什么方法可以在超类中定义泛型方法以引用继承类的类型?

  15. 15

    从超类调用方法

  16. 16

    从超类调用方法

  17. 17

    当子类调用超类的方法时,如何获得超类来引用子类中的属性?

  18. 18

    让继承的类实现超类的方法

  19. 19

    从超类的超类调用方法

  20. 20

    可以在子类的方法内部使用“ super”来调用相应的超类方法而无需直接引用吗?

  21. 21

    重载类方法的歧义调用

  22. 22

    将继承的类的对象关联到超类的引用

  23. 23

    在Java中,“ this”在继承该方法的子类上调用的超类方法中表示什么?

  24. 24

    使用类的引用调用接口方法

  25. 25

    函数继承-child.apply()上的超类中的调用方法

  26. 26

    toString()方法不是从其超类继承的

  27. 27

    模拟超类方法调用

  28. 28

    调用超类方法operator ==

  29. 29

    Clojure:调用超类方法

热门标签

归档