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

时间:2014-07-30 08:59:56

标签: java inheritance methods

对象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();
   }
}

5 个答案:

答案 0 :(得分:2)

A a2=new C();

这意味着您只能访问类A的成员和类C的实现(如果有任何重写)。

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

答案 1 :(得分:1)

当你写这行时

 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

答案 2 :(得分:0)

如果使用父/超类引用并尝试在子类上调用方法,则应在父/超类中定义该方法。即你可以在对象上调用的方法(rhs)取决于lhs(引用类型)。

答案 3 :(得分:0)

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

请注意, 在运行时调用方法时,JVM引用Reference引用的对象。在你的情况下,类A的引用引用了C类的对象。

阅读详情:Polymorphism in Java

答案 4 :(得分:0)

您将子类C视为A的一个实例,因为A没有m3所拥有的函数C

  A a2 = new C();

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

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