Object aThing = new Integer(25);
根据我的教科书,表达式将(type )(Integer) aThing
引用的对象的类型转换为 type 。只有当所引用的对象实际上是 type 时,转换操作才会成功;如果没有,a将被抛出aThing
Object
Integer
aThing
Integer
ClassCastException
我不明白粗体字在说什么。你能简要说明一下吗?
什么是“被引用的对象aThing
”?
Object aThing = new Integer(25);
根据我的教科书,表达式将(type )(Integer) aThing
引用的对象的类型转换为 type 。只有当所引用的对象实际上是 type 时,转换操作才会成功;如果没有,a将被抛出aThing
Object
Integer
aThing
Integer
ClassCastException
我不明白粗体字在说什么。你能简要说明一下吗?
什么是“被引用的对象aThing
”?
如果你有
Object aThing = "foo";
那么aThing
就真的是一个String
。在那种情况下,(Integer) aThing
会抛出一个ClassCastException
.
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;
请注意,从一种类型转换为另一种类型仅在转换表示法是继承树的一部分时才有效。
所以Object x = (String)"X"
是有效的,因为“X”是一个字符串对象(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 a 不是 C 类型,会抛出你得到的 ClassCastException 。
引用的对象aThing
将是您初始化它的对象。
String s = "Hello World"
s 持有指向“Hello World”对象的指针/引用。
Person person = new Person();
person 持有对所创建对象的引用。
考虑这段代码:
FooClass foo = new FooClass();
Object aThing = foo;
Integer anInt = (Integer) aThing;
此代码将抛出 aClassCastException
因为原始对象foo
不是Integer
对象。现在考虑这段代码:
Integer int1 = new Integer(1);
Object aThing = int1;
Integer int2 = (Integer) aThing;
这段代码可以工作,因为原始对象int1
是一个Integer
,所以如果它被存储为更通用的类型,就像Object
它可以被强制转换回原始类一样。
我不明白粗体字在说什么。你能简要说明一下吗?
运行时的 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
是对Integer
存储值 25 的引用。再次记住,对象类标识在运行时维护,并且在强制转换时不会丢失。