Java 在类层次结构中强制转换
Java 在类层次结构中强制转换,java,Java,Object aThing=新整数(25) 根据我的课本,表达式(Integer)aThing将aThing(typeobject)引用的对象类型转换为typeInteger只有当aThing引用的对象实际上是类型Integer时,强制转换操作才会成功;如果没有,则会出现ClassCastException 我不明白那粗体的句子在说什么。你能简要说明一下吗 “被引用的对象”是什么?如果您有 Object aThing = "foo"; 然后,一个字符串实际上就是一个字符串。在这种情况下,(整数
Object aThing=新整数(25)代码>
根据我的课本,表达式(Integer)aThing
将aThing
(typeobject
)引用的对象类型转换为typeInteger
只有当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
引用的对象”?@user133466aThing
是object
类型的引用,如示例中的LHS
所示。它指向一个整型对象
,就像在RHS
上一样。什么是“被引用的对象”
?您的最终语句“对象类标识在运行时保持,在强制转换时不会丢失”。这意味着整型对象将保持为对象
,这就是您最终语句的含义吗?不,它的意思恰恰相反aThing
是对知道它是整数的某个事物的引用。您可以将整数
强制转换为对象
,因为整数
是对象
的子类,但实例不会忘记它是一个整数
,并且不会让您稍后将其强制转换为字符串
,因为整数
与字符串
不兼容。它是一个整数
,存储在对对象的引用中
@downvoter声明您的downvote原因。