我试图了解对象转换在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是此处的接口,那么谁在这里实现此接口?
我很困惑,有人可以帮我内部运作吗?
谢谢
答案 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