Java中的转换如何工作?

时间:2019-04-17 16:40:24

标签: java casting

我试图了解对象转换在Java内部如何工作。

这是我的小代码示例

public interface Processor {

}


public class Mainclass {

    Object getObject(){

        return new Object();
    }
    public static void main(String[] args){


        Mainclass ob = new Mainclass();
        Processor prcsr = (Processor) ob.getObject();
   }
}

当调用ob.getObject()时,它返回一个Object引用类型,该引用类型保存着一个Object类实例的位置。是吗?

因此,当我们将Object引用类型转换为Processor时,实际上发生了什么?是否会将Object参考类型转换为处理器类型,并将其保留为Object类实例位置?

如果是,那么Processor是此处的接口,那么谁在这里实现此接口?

我很困惑,有人可以帮我内部运作吗?

谢谢

2 个答案:

答案 0 :(得分:0)

  

是否将Object参考类型转换为Processor类实例位置的Object类型?

否,因为Object未实现接口Processor。同样由于这个原因,转换将失败,并抛出ClassCastException

将类型(Object)铸造为另一个不相关的类型(Processor)通常会失败。

  

实际上发生了什么?

铸造是在告诉编译器变量实际上应该是什么类型,因为您比编译器了解得更多。

这里

Processor prcsr = (Processor) ob.getObject();

您正在告诉编译器

  

嘿,编译器,您只知道obj.getObject返回的类型为Object,但是我比您更了解。我知道obj.getObject将返回实现Processor的类型。

编译器听到此消息,并“正常”进行操作,并允许您将其分配给变量prcsr,该变量的类型为Processor

但是,在运行时,事实证明obj.getObject返回了Object的一个实例,该实例没有实现Processor,所以您告诉编译器的错误和一个异常被抛出。

现在假设obj.getObject实际上返回了FooProcessor的一个实例,该实例确实实现了Processor(此处未显示声明):

Object getObject(){

    return new FooProcessor();
}

现在,在运行时,强制转换成功,因为您告诉编译器的信息是正确的。

因此,基本上,转换主要是编译时的事情。实际上很少在运行时发生。在运行时,它只是检查您说的话是否正确。如果错误,则引发异常。

答案 1 :(得分:-2)

public class Q31A {
    public void test1(){
        System.out.println("test1");
        }

}

public class Q31B extends Q31A {
    public void test2(){
        System.out.println("test2");
    }
}

Q31A b = new Q31B();
        Q31B b1 = new Q31B();
        b1.test2();
        ((Q31B)b).test2();

结果: 测试2 测试2