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

对象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类成员和C类实现(如果有任何重写)。

现在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

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

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

  A a2 = new C(); 

所以在这里,你只能访问C中inheritance自A 。 你基本上把它看作A 如果你想在C调用方法,你必须cast它转换为C ,所以你必须做这样的事情:

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

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

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

阅读更多: Java中的多态性