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