子类引用对基类对象的使用 - java

时间:2010-03-20 11:17:37

标签: java oop

在Java

中使用子类引用创建基类对象有什么用?

3 个答案:

答案 0 :(得分:4)

如果我理解正确,你的意思是:

class Parent {
   ...
}

class Child extends Parent {
   ...
}

Parent p = new Child ();

原因有很多:

  1. 灵活性:您可以使用Parent作为参数类型,并将任何子类(即Child和其他子句)作为此参数传递。

  2. 多态性:您可以在几个子类中重写父方法,并在需要父对象的地方依次使用它们(如在策略模式中)

  3. 如果您正在处理某些公共API,则可以将Parent类设置为public并对所有人可见,但所有Childs对外部用户都是不可见的。它可以使您的API更窄。好的例子是Collections API。有32个实现(即Childs)被隐含地使用,但只有少数公共接口。您可以通过Collection(即Parent)接口获取同步,不可修改和其他集合,但不了解实现细节。

答案 1 :(得分:2)

Animal myAnimal1 = new Dog();
Animal myAnimal2 = new Cat();
Animal myAnimal3 = new Horse();

假设Animal有一个名为 getAnimalSound()的方法,Dog,Cat,Horse都会根据它们覆盖该方法。现在,这段代码非常易于扩展,你的API只有一个方法 getAnimalSound()来表示任何一种动物的声音,每个动物类已经实现了自己的版本getAnimalSound()

System.out.println(getAnimalSound(myAnimal1)); //runtime finds animal1 is dog, prints Bark
System.out.println(getAnimalSound(myAnimal2));//runtime finds animal2 is cat, prints Meow
System.out.println(getAnimalSound(myAnimal3));//runtime finds animal3 is horse, prints Niih

正如您所看到的,一个方法 getAnimalSound()是标准API,但我们实现了如此多的可扩展性。

答案 2 :(得分:0)

如果你的意思是

List<String> list = new ArrayList<String>()

那么你实际上并没有创建超类的实例。您只是告诉用户将其处理为一个。关键是您通常不需要知道所选择的确切实现,并希望保留更改实现的能力。因此,您只告诉用户某个API是某个List,如果您的算法需要它,您可以更改实现以使用LinkedList,而无需更改API。