public class ExampleClass {
public static void main(String[] args) {
// Upcasting from subclass to super class.
A aRef=new C();
//aRef.setMessage(); compilation Error
aRef.display();
B bRef = (B)aRef;
//bRef.setMessage(); compilation Error
bRef.display();
C cRef = (C)aRef;
cRef.setMessage("ayaz");
cRef.display();
}
}
interface A
{
void display();
}
class B implements A
{
public void display() {
System.out.println("Am in class B");
}
}
class C extends B
{
String msg = "Am in class C";
@Override
public void display() {
System.out.println(msg);
}
public void setMessage(String s){
msg = s;
}
}
在上面的代码中,在将 aRef 对象向下转换为 B 类型的对象后,无法调用 setMessage(),但在使用 bRef Obj 调用显示时,会调用 C 类的显示方法。当我们向下转换到 C 的 Obj 时,我们可以调用,为什么? aRef 只是指向 C 类型的对象,我认为引用没有被复制。
最佳答案
两件事:
- 在编译时,编译器查看引用的类型以确定该方法是否存在(至少已声明)。所以
aRef.display()
与bRef.display()
和cRef.display()
一样是正确的。但是aRef.setMessage()
和bRef.setMessage()
是不正确的(setMessage
不是在A< 中声明或定义的方法
或B
。当然cRef.setMessage()
是正确的。 - 在运行时,机器会找到正确的方法来执行。作为
aRef
,bRef
和cRef
引用相同的C
对象,该对象重新定义了方法display
,这个叫做。
关于java - 向下类型转换对象和调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33103031/