有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将派生对象引用分配给基类的变量将不起作用

这里有一个例子

Class A {
    Method A();
    Method B();
    Method C();
}
// A and B are not interfaces 

Class B extends A {
    Method C(int);
}

Class Harness {
    A ob = new B ();
    ob.C(3);
}

IDE抱怨说ob.C(3)不能被设置为A中的方法C,因为C不需要任何参数。但据我所知,我正在B中调用方法C

据我所知,变量类型决定了要调用的方法集,方法集的引用被分配给了对象,但实际对象决定了要调用的确切方法。那么为什么它不起作用呢


共 (3) 个答案

  1. # 1 楼答案

    您已将B类型的对象分配给A类型的变量。类A上没有方法C,编译器正在抱怨,因为它必须链接到基于变量的声明的类型的方法,即A。除非类型A具有方法C的某种声明,否则编译器无法知道对A类型的引用调用该方法是安全的

  2. # 2 楼答案

    正如您在问题中提到的,变量的类型决定了可以使用它调用的所有方法。在您的示例中,class A没有签名为C(int)的方法。它只有一个签名为C()的方法。因此,B中的方法C(int)甚至不是被重写的方法。这是一个重载方法

    运行时多态性仅适用于重写的方法

    您必须使用class A方法C(int)才能成功编译此代码

  3. # 3 楼答案

    您已声明new BA的实例,并且a没有方法C使其工作,您必须再次至少强制转换obit B。因此,假设这是一个伪代码,这将工作:

     A ob=new B ();
      ((B)ob).C ();