Java 在类层次结构中强制转换

Java 在类层次结构中强制转换,java,Java,Object aThing=新整数(25) 根据我的课本,表达式(Integer)aThing将aThing(typeobject)引用的对象类型转换为typeInteger只有当aThing引用的对象实际上是类型Integer时,强制转换操作才会成功;如果没有,则会出现ClassCastException 我不明白那粗体的句子在说什么。你能简要说明一下吗 “被引用的对象”是什么?如果您有 Object aThing = "foo"; 然后,一个字符串实际上就是一个字符串。在这种情况下,(整数

Object aThing=新整数(25)

根据我的课本,表达式
(Integer)aThing
aThing
(type
object
)引用的对象类型转换为type
Integer
只有当
aThing
引用的对象实际上是类型
Integer
时,强制转换操作才会成功;如果没有,则会出现
ClassCastException

我不明白那粗体的句子在说什么。你能简要说明一下吗

“被
引用的对象”是什么?

如果您有

Object aThing = "foo";
然后,
一个字符串
实际上就是一个
字符串
。在这种情况下,
(整数)aThing
将抛出一个
ClassCastException

Object aThing = new Integer(25);
现在,由于
aThing
引用指向一个
整数对象
。因此,您可以将该引用强制转换为
整数
。因为
整数
引用可以指向
整数
对象

Integer intRef = (Integer)aThing; // Ok, `aThing` points to an Integer object
// Exception. A String reference cannot point to `Integer` object
String strRef = (String)aThing; 
但是,当您尝试将该引用类型转换为
字符串
引用时,您将得到
ClassCastException
,因为字符串不是
整数
,因此不能包含对
整数
对象的引用

Integer intRef = (Integer)aThing; // Ok, `aThing` points to an Integer object
// Exception. A String reference cannot point to `Integer` object
String strRef = (String)aThing; 

请注意,从一个类型转换为另一个类型仅在转换表示法位于继承树的一部分时有效

因此
对象x=(String)“x”
是有效的,因为“x”是字符串对象
(Object)“x”
也是有效的
对象y=(整数)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
是类型为
B
i接口的对象。
你不能做的是

C c = (C) a; 
A不是C类型,会抛出你得到的ClassCastException

aThing
引用的对象将是您初始化它的对象

String s = "Hello World" 
s持有指向“Hello World”对象的指针/引用

person持有对所创建对象的引用。

请考虑以下代码:

FooClass foo = new FooClass();
Object aThing = foo;
Integer anInt = (Integer) aThing;
Integer int1 = new Integer(1);
Object aThing = int1;
Integer int2 = (Integer) aThing;
此代码将抛出一个
ClassCastException
,因为原始对象
foo
不是
Integer
对象。现在考虑这个代码:

FooClass foo = new FooClass();
Object aThing = foo;
Integer anInt = (Integer) aThing;
Integer int1 = new Integer(1);
Object aThing = int1;
Integer int2 = (Integer) aThing;
这段代码可以工作,因为原始对象
int1
是一个
Integer
,因此如果它存储为更一般的类型,如
object
,则可以将其转换回原始类

我不明白那粗体的句子在说什么。你能简要说明一下吗? 运行时的Java对象包含标识对象是哪个类的信息。当您尝试将对象强制转换为其他类型时,JRE将首先验证您实际上是在兼容对象之间进行强制转换。粗体的句子在一般意义上也不太正确;它还允许您将对象强制转换为该对象的任何超类或该对象实现的任何接口

关于可强制转换为超类的这一特殊部分就是为什么可以将
整数
存储为
对象
无论如何-
对象
隐式地是所有类的超类

这就是为什么您可以编写正确的语句,如:

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
不兼容

什么是“被
引用的对象”
? 行后:

Object aThing = new Integer(25); // cast Integer to superclass (Object)

aThing
是对存储值25的
整数的引用。请再次记住,对象类标识在运行时保持,并且在强制转换时不会丢失。

什么是“被
aThing
引用的对象”?@user133466
aThing
object
类型的引用,如示例中的
LHS
所示。它指向一个
整型对象
,就像在
RHS
上一样。什么是“被
引用的对象”
?您的最终语句“对象类标识在运行时保持,在强制转换时不会丢失”。这意味着
整型对象将保持为
对象
,这就是您最终语句的含义吗?不,它的意思恰恰相反
aThing
是对知道它是
整数的某个事物的引用。您可以将
整数
强制转换为
对象
,因为
整数
对象
的子类,但实例不会忘记它是一个
整数
,并且不会让您稍后将其强制转换为
字符串
,因为
整数
字符串
不兼容。它是一个
整数
,存储在对
对象的引用中
@downvoter声明您的downvote原因。