繁体   English   中英

为什么我无法使用父类型访问子对象方法

[英]Why I cannot access Child Object method with Parent Type

对象a2的类型为A,但引用了类C的对象。因此,a2应该能够访问m3()。 但是,为什么不发生呢? 如果在类A中定义了m3()方法,则代码可以正常运行

class A {

   int var = 7;

   void m1() {
      System.out.println("A's m1 ,");
   }

   void m2() {
      System.out.println("A's m2 ,");
   }
}

class B extends A {

   void m1() {
      System.out.println("B's m1 ,");
   }
}

class C extends B {

   void m3() {
      System.out.println("c's m3 ," + (var + 6));
   }
}

class Mixed {

   public static void main(String[] args) {
      A a = new A();
      B b = new B();
      C c = new C();
      A a2 = new C();
      a2.m1();
      a2.m2();
      a2.m3();
   }
}
A a2=new C();

这意味着您只能访问A类的成员和CA实现(如果有的话)。

现在m3不是A的成员。 清楚吗?

当你写这行

 A a2=new C();

a2将只能访问A类中定义的方法。

即使a2引用类C的实例,它也不能调用在C中定义的方法。

但是,如果您具有以下条件:

class A {
    void m3() {
        System.out.println("in A");
    }
}

class C extends A {
    void m3() {
        System.out.println("in C");
    }
}

...
A a2 = new C();
a2.m3();

将输出

在C

在这种情况下,将重写m3()方法,并且所调用的方法将由a2所引用的实例的类型(即C)确定。

我将在这里查看Java教程: http : //docs.oracle.com/javase/tutorial/java/IandI/subclasses.html

如果使用父/超类引用并尝试在子类上调用方法,则应在父/超类中定义该方法。 也就是说,你可以在对象(右)上所说的方法依赖于LHS(引用类型)。

编译器检查调用方法的对象的引用...在您的情况下, A a2=...是编译器可以看到的,它发现A类中没有定义m3()方法。 因此,代码将无法编译。

请注意,在运行时调用方法时,JVM会引用参考所引用的对象。 在您的情况下,类A的引用是指类C的对象。

阅读更多信息: Java中的多态性

您将子类C视为A的实例,因为A不具有C具有的函数m3

  A a2 = new C();

因此,在这里,您只能访问C中从A继承的方法。 您基本上将其视为A 如果要在C调用方法,则必须将其castC ,因此必须执行以下操作:

 if(a2 instanceof C)
 {
     C castedA2 = (C)a2;
     castedA2.m3();
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM