Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java将子对象强制转换为父对象_Java - Fatal编程技术网

Java将子对象强制转换为父对象

Java将子对象强制转换为父对象,java,Java,狮子类动物 这是我的密码: 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(); } 动物a=新动物(); 狮子b=新狮子();

狮子类动物

这是我的密码:

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();
}
动物a=新动物();
狮子b=新狮子();
动物c=(动物)b;
动物[]arr={a,b,c};
对于(int i=0;i
结果是:

试验2.动物

动物赛跑

测试2.狮子

狮子跑

测试2.狮子

狮子跑


从这个例子看来,“c”是“狮子”,而不是“动物”。为什么会发生这种情况?

您正在调用
getClass


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

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

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

因为
c
是一头狮子:

Lion b = new Lion();   // Creates a Lion
Animal c = (Animal) b; // Refers to the Lion through an Animal variable
现在,
c
是一个
Animal
类型的对
Lion
对象的引用。该对象仍然是一头
狮子
,只是对它的引用仅限于
动物
东西。因此,当您询问该对象它的类是什么(而不是数组中
c
变量/第三个条目中的接口是什么)时,它会告诉您它是
Lion

这正是这种情况:

Map m = new HashMap();

m
引用是类型化的
Map
,因此您只能使用它访问
Map
接口定义的内容,但它引用的对象是一个
HashMap
实例。

强制转换不会使被引用的对象更改其类型,它只是将自身限制为超类型的方法。由于这些原因,您无法将
香蕉
抛给
动物

你队伍中的演员

Animal c = (Animal) b;
无论如何都会自动发生。您只需在向下转换时指定转换:

Animal a = new Dog();
Dog d = (Dog) a;
但是
a
d
仍然指向堆中的
Dog
,因此如果它们重写
Animal
类的方法,将使用
Dog
类的实例方法。
换句话说,
a
是一只
,但只要它被声明为(或被类型转换为)一只
动物
,它就只能使用
动物
方法。

也许这个问题可以帮助你理解:这叫做“polimorphism”你好,你能解释一下,即使参考狮子物体被铸造成动物,它是如何被回收的吗?在C++中,这将导致狮子中所有不在动物中的字段的修剪。@ ValeReuly- java和C++使用完全不同的语义。java的对象变量是对象的引用而不是直接包含对象,所以它们更像C++指针。(警告:我在22年内还没有做过真正的C++)。在上面的例子中,java的<代码> RunBu/Cuff>就像C++的代码>代码>b
指向对象,而不是直接包含对象。所以
动物c=(动物)类似于
Animal*c=(Animal*)b C++中,它只是指向同一个对象的第二个变量。@ ValeRead -FWW,类似于(再一次,警告,我的C++是生疏的)。谢谢,这就解释了。当你使用动物A=狮子时,我检查了,确实切片了,我猜分配操作符不会复制到动物身上,因为它不能被执行。C++的意思是。所以java和C++在这方面是相似的,只是java隐藏了指针语法。