[英]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
类的成员和C
类A
实现(如果有的话)。
现在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
调用方法,则必须将其cast
为C
,因此必须执行以下操作:
if(a2 instanceof C)
{
C castedA2 = (C)a2;
castedA2.m3();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.