说我们有两个班。
class Animal{/*code*/}
class Cat extends Animal{/*code*/}
据我了解,向上转换和向下转换的工作方式如下
Cat c1 = new Cat();
Animal a = c1; //Upcasted to Animal
Cat c2 = (cat) a; //Downcasted back to Cat
但是唯一的问题是,每次上变换或下变换时,都创建一个新的对象。无论如何,是否有将一个对象从Cat转换为Cast并转换为Cat并向下转换为Cat的过程,以便仅投射一个对象?例如
Cat c --> Animal c --> Cat c //Upcasted to Animal, and downcasted back to Cat, but done all on one object.
谢谢!
答案 0 :(得分:4)
这3行仅在堆中创建一个对象,并创建3个引用,它们指向同一对象
Cat c1 = new Cat(); //this is where object is created in heap
Animal a = c1; //Upcasted to Animal, only reference is created not new object
Cat c2 = (cat) a; //Downcasted back to Cat, only reference is created not new object
您可以启动调试器并检查这些引用是否指向同一对象。
答案 1 :(得分:2)
在内存中仅创建一个对象,并且对该对象有三个引用。值得注意的是,类型Animal
的引用将无法访问特定于Cat
类型的任何内容。如果您想了解更多信息,请继续阅读。
这里要注意的重要一点是,如果您更改该对象中的任何内容,则任何引用都会反映出来。如下所示。假设有一个抽象的Animal
类,它具有一个name
和适当的getter和setter。
请注意,即使在setName()
变量上调用了cat
,在getName()
上调用animal
时,名称仍然会更改。
Cat cat = new Cat("foo");
Animal animal = cat;
System.out.println(animal.getName()); // foo
cat.setName("bar");
System.out.println(animal.getName()); // bar <-- The name of animal changed when we changed cat1.