Java-如何上调和下调同一对象

时间:2019-02-27 03:53:20

标签: java oop object casting

说我们有两个班。

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.

谢谢!

2 个答案:

答案 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.