java - 向下类型转换对象和调用方法

标签 java

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() 是正确的。
  • 运行时,机器会找到正确的方法来执行。作为 aRefbRefcRef 引用相同的 C 对象,该对象重新定义了方法 display,这个叫做。

关于java - 向下类型转换对象和调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33103031/

相关文章:

Java Android 比较字符串格式的时间

java - 如何将值输入到通用定义的数组列表中?

java - 使用 hibernate 和 Netbeans 获取数据

java - mysql在java中使用spring框架创建程序

打开外部 URL 时出现 "startActivityForResult(Intent,int) in Fragment has been deprecated"的 Java 解决方案?

java - jvm 在这两条 java 行 : 上有什么区别吗

java - 捕获括号是否会影响单独的负前瞻?

java - java中的无限fifo

java - 如何获取JLabel[ ] [ ]中鼠标点击的标签索引?

java - 平面组织结构到 Java 中的 TreeView