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隐藏了指针语法。