我最近读过一本关于Java设计模式的书,并且遇到了从其他类继承并通过放置实例化的类
Superclass s = new Subclass()
而不是
Subclass s = new Subclass()
我最初的想法是,从设计的角度来看,更多是由于抽象或信息隐藏。但是,我仍然不确定,并且未能找到明确的解释。
为什么有人会使用Superclass s = new Subclass()
进行实例化,是否可以使用Subclass s = new Subclass()
?
我非常感谢能够帮助我解决这个问题的人的任何帮助。
答案 0 :(得分:3)
想象一下具有子类Animal
和Dog
的类Cat
。您现在想要创建一个动物管理系统。为了简单起见,您希望将所有动物放在一个列表中。你现在可以写:
List<Animal> managementList = new ArrayList<>();
并在其中添加Dog
和Cat
,就像这样:
managementList.add(new Dog());
managementList.add(new Cat());
这很容易维护,因为Dog
和Cat
s 都是 Animal
。
现在,您可以从列表中检索动物:
Animal theFirstAnimal = managementList.get(0);
由于你是一位聪明的经理,你知道第一只动物是Dog
。所以你也可以写:
Dog theFirstAnimal = (Dog) managementList.get(0);
如果你不确定第一只动物是狗还是狗,但你真的想用它来做一些事情,你可以用instanceof
检查它是否真的是狗。
if(managementList.get(0) instanceof Dog)
{
doSomething();
}
如果可以简单地实例化子类,那么回答你的最后一个问题:当然可以。如果你不喜欢猫,只想与狗一起工作,没有人会让你回过头来做:
List<Dog> dogManagementList = new ArrayList<>();
答案 1 :(得分:0)
谈到Upcasting,它也有助于函数参数的形式:
public class Music {
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void main(String[] args) {
Wind flute = new Wind(); //Wind extends Instrument
tune(flute); // Upcasting
}
}
方法Music.tune( )
接受乐器参考,但也接受从乐器派生的任何内容。
从Wind到Instrument的向上转换可以“缩小”该接口,但它不能使它低于Instrument的完整接口。