有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

类层次结构中的java强制转换

Object aThing = new Integer(25);

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

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

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


共 (5) 个答案

  1. # 1 楼答案

    I don't understand what the bolded sentence is saying. Can you briefly elaborate on that?

    运行时的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,因为IntegerString不兼容

    What is "the object referenced by aThing"?

    行后:

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

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

  2. # 2 楼答案

    如果你有

    Object aThing = "foo";
    

    那么aThing就真的是一个String。在这种情况下,(Integer) aThing将抛出一个ClassCastException

  3. # 3 楼答案

    Object aThing = new Integer(25);
    

    现在因为aThing引用指向Integer object。因此,您可以将该引用强制转换为Integer。因为integer引用可以指向Integer对象

    Integer intRef = (Integer)aThing; // Ok, `aThing` points to an Integer object
    

    但是,当您尝试将该引用类型转换为String引用时,您将得到ClassCastException,因为字符串不是Integer,因此不能包含对Integer对象的引用

    // Exception. A String reference cannot point to `Integer` object
    String strRef = (String)aThing; 
    
  4. # 4 楼答案

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

    因此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是类型为BIInterface的对象。 你不能做的是

    C c = (C) a; 
    

    A不是C类型,会抛出你得到的ClassCastException

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

    String s = "Hello World" 
    

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

    Person person = new Person();
    

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

  5. # 5 楼答案

    考虑此代码:

    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,那么它就可以转换回原始类