【问题标题】:Java cast child to parentJava将孩子强制转换为父母
【发布时间】:2015-04-13 07:50:44
【问题描述】:

Lion 类扩展了 Animal。

这是我的代码:

Animal a = new Animal();
Lion b = new Lion();
Animal c = (Animal) b;

Animal[] arr = { a, b, c };

for (int i = 0; i < arr.length; i++) {
    System.out.println(arr[i].getClass().getName());
    arr[i].run();
}

结果是:

test2.Animal

动物奔跑...

test2.Lion

狮子奔跑...

test2.Lion

狮子奔跑...

从这个例子看来,“c”是“狮子”,而不是“动物”。为什么会这样?

【问题讨论】:

标签: java


【解决方案1】:

您正在调用getClass

方法调用在运行时解析,因此它打印Lion 而不是Animal

【讨论】:

    【解决方案2】:

    您的对象c 是对对象的引用,并且该对象必须是Animal 类型或任何子类。仅仅因为对象引用是Animal 并不能保证该对象是Animal,它只是意味着它将表现为Animal,并且您可以调用该类上您想要的所有方法。这是多态性的一部分。

    【讨论】:

      【解决方案3】:

      从这个例子看来,“c”是“狮子”,而不是“动物”。为什么会这样?

      因为c 狮子:

      Lion b = new Lion();   // Creates a Lion
      Animal c = (Animal) b; // Refers to the Lion through an Animal variable
      

      现在,c 是对Lion 对象的Animal 类型引用。该对象仍然是Lion,只是对它的引用仅限于Animal 的东西。所以当你问那个对象它的类是什么(不是你的接口在你的数组中的c变量/第三个条目中),它告诉你它是一个Lion。 p>

      这正是这种情况:

      Map m = new HashMap();
      

      m 引用类型为Map,因此您只能使用它来访问Map 接口定义的内容,但它所指的对象HashMap 实例.

      【讨论】:

      • 你好,你能解释一下即使它已经被铸造成动物,如何才能恢复参考狮子对象?在 C++ 中,这将导致对 Lion 中所有不在 Animal 中的字段进行修剪。
      • @Vallerious - Java 和 C++ 使用完全不同的语义。 Java 的对象变量是对对象的引用,而不是直接包含对象,因此它们更像 C++ 指针。 (警告:我在大约 22 年内没有做过任何真正的 C++。)在上面,Java 的 Lion b 就像 C++ 的 Lion *bb 指向 对象而不是直接包含它。所以 Java 中的 Animal c = (Animal); 就像 C++ 中的 Animal *c = (Animal*)b; 一样,它只是将第二个变量指向同一个对象。
      • @Vallerious - FWIW,this Java code 类似于 this C++ code(再次警告,我的 C++ 真的生锈了)。
      • 谢谢,这就解释了。我检查过,当你使用 Animal a = lion 时确实会发生切片,我猜赋值运算符不会将字段复制到 Animal,因为它无法实现。
      • 我的意思是 C++。所以 Java 和 C++ 在这方面是相似的,只是 Java 为我们隐藏了指针语法。 :)
      【解决方案4】:

      强制转换不会使被引用的对象改变其类型,它只是将自身限制为超类型的方法。由于这些原因,您无法将 Banana 转换为 Animal

      你的演员阵容

      Animal c = (Animal) b;
      

      无论如何都会自动发生。您只需要在向下转换时指定您的演员:

      Animal a = new Dog();
      Dog d = (Dog) a;
      

      但是ad 仍然指向堆中的Dog,因此如果它们覆盖Animal 类的方法,它们将使用Dog 类的实例方法。 换句话说,a 是一个Dog,但只要它被声明为(或类型转换为)Animal,它就只能使用Animal 方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多