Java继承实例化

时间:2018-06-13 11:29:14

标签: java class object inheritance

我最近读过一本关于Java设计模式的书,并且遇到了从其他类继承并通过放置实例化的类

Superclass s = new Subclass()

而不是

Subclass s = new Subclass()

我最初的想法是,从设计的角度来看,更多是由于抽象或信息隐藏。但是,我仍然不确定,并且未能找到明确的解释。

为什么有人会使用Superclass s = new Subclass()进行实例化,是否可以使用Subclass s = new Subclass()

我非常感谢能够帮助我解决这个问题的人的任何帮助。

2 个答案:

答案 0 :(得分:3)

想象一下具有子类AnimalDog的类Cat。您现在想要创建一个动物管理系统。为了简单起见,您希望将所有动物放在一个列表中。你现在可以写:

List<Animal> managementList = new ArrayList<>();

并在其中添加DogCat,就像这样:

managementList.add(new Dog());
managementList.add(new Cat());

这很容易维护,因为DogCat 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的完整接口。