Object aThing = new Integer(25);
根据我的教科书,表达式(Integer) aThing
将aThing
引用的对象的类型(类型Object
)转换为Integer
类型。 仅当aThing
引用的对象实际上是类型Integer
时,转换操作才会成功;如果没有,将会发现ClassCastException
我不明白粗体句子在说什么。你能简单地详细说明一下吗?
什么是“aThing
引用的对象”?
答案 0 :(得分:2)
如果你有
Object aThing = "foo";
然后aThing
真的是String
。在这种情况下,(Integer) aThing
会抛出ClassCastException
。
答案 1 :(得分:0)
Object aThing = new Integer(25);
现在,aThing
引用指向Integer object
。因此,您可以将该引用强制转换为Integer
。因为integer
引用可以指向Integer
对象。
Integer intRef = (Integer)aThing; // Ok, `aThing` points to an Integer object
但是当你试图对那个String
引用的引用进行类型转换时,你会得到ClassCastException
,因为String不是Integer
,因此不能包含对Integer
的引用// Exception. A String reference cannot point to `Integer` object
String strRef = (String)aThing;
对象。
{{1}}
答案 2 :(得分:0)
请注意,从类型转换为另一个类型仅在强制转换符号位于继承树的一部分时才有效。
所以Object x = (String)"X"
有效,因为“X”是一个String对象(Object)"X"
也是有效的
Object y = (Integer) 1
有效。 (对象)1有效。
然而,你不能做的是将一种类型转换为完全不同的类型。
Object x = (Integer)"X"
它无效,因为“X”不属于Integer
类型;
另外需要注意的是,这将有效。
class A extends B implements IInterface.
class C implements IInterface
A a = new A() ;
B b = (B)a;
IInterface c = (IInterface)a ;
以上内容有效,因为A a
是B
和IInterface
类型的对象。
你不能做的是
C c = (C) a;
a不是C类型,会抛出你得到的ClassCastException。
aThing
引用的对象将是您初始化它的对象。
String s = "Hello World"
拥有指向“Hello World”对象的指针/引用。
Person person = new Person();
person拥有对创建对象的引用。
答案 3 :(得分:0)
考虑以下代码:
FooClass foo = new FooClass();
Object aThing = foo;
Integer anInt = (Integer) aThing;
此代码会抛出ClassCastException
,因为原始对象foo
不是Integer
对象。现在考虑这段代码:
Integer int1 = new Integer(1);
Object aThing = int1;
Integer int2 = (Integer) aThing;
此代码可以使用,因为原始对象int1
是Integer
,因此如果将其存储为更通用的类型,例如Object
,则可以将其转换回原班。
答案 4 :(得分:0)
我不明白粗体句子在说什么。你能简单地详细说明一下吗?
运行时的Java对象包含标识对象所在类的信息。当您尝试将对象转换为其他类型时,JRE将首先验证您是否在兼容对象之间进行转换。粗俗的句子在一般意义上也不完全正确;它还允许您转换和反对该对象的任何超类,或者该对象实现的任何接口。
关于可以转换为超类的这个特殊部分是你无论如何都可以将Integer
存储为Object
的原因 - Object
隐含地是所有类的超类。
这就是为什么你可以编写一个正确的语句,如:
Object aThing = new Integer(25); // cast Integer to superclass (Object)
请记住,java中的对象包含确定对象的确切标识的运行时信息。向下转换为对象不会删除此信息,这就是为什么java不会让您逃脱以下内容:
Object aThing = new Integer(25); // cast Integer to superclass (Object)
String something = (String) aThing; // cast Integer (stored as object) to String
该语句将编译,但由于ClassCastException
与Integer
不兼容,因此您将在运行时获得String
。
什么是“
aThing
引用的对象”?
行后:
Object aThing = new Integer(25); // cast Integer to superclass (Object)
aThing
是对存储值25的Integer
的引用。再次记住,对象类标识在运行时维护,并且在转换时不会丢失。