假设我有一个名为animal
的超类,以及分别称为Dog
,Cat
和Lion
的三个子类,它们扩展了animal
类。
然后,我为子类创建一个对象,并将它们添加到ArrayList<animal>
。
当我浏览该列表时,如何区分Dog
或Cat
对象,因为ArrayList
中的每个对象都属于animal
类型?
答案 0 :(得分:4)
您应该使用instanceof
运算符:
if (animal instanceof Dog) {
//something
} else if (animal instanceof Cat) {
//something
} else if (animal instanceof Lion) {
//something
}
但是,如果你真的需要使用它,你应该三思而后行。在大多数情况下,instanceof
是一种糟糕的OOP练习。
答案 1 :(得分:3)
继承点是你不需要知道每个对象的动物类型,当你调用必须使用动物对象的方法时,每个subClass都可以根据需要实现这个方法。
如果你无论如何需要知道你可以使用关键字instanceof的类型,但如果你需要使用它可能你做错了OOP编程
答案 2 :(得分:1)
Chief Two Pencils在他的评论中试图说的是你可以使用instanceof
,但在你的情况下,有一个更好的OOP设计模式可供使用。例如,为什么不在Animal
中简单地使用基本方法并覆盖每个子类型,而不是区分对象类型?例如,apply
。这样您就可以调用animal.apply()
,并且该类型的正确方法将适用。
以下是他的意思:
import java.util.ArrayList;
import java.util.List;
abstract class Animal {
abstract void apply();
}
class Dog extends Animal {
@Override
void apply() {
System.out.println("Bark bark!");
}
}
class Cat extends Animal {
@Override
void apply() {
System.out.println("Meeeeeow!");
}
}
class Lion extends Animal {
@Override
void apply() {
System.out.println("Rrrrrroar");
}
}
public class Main {
public static void main(final String[] args) {
final List<Animal> animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
animals.add(new Lion());
// Dog
animals.get(0).apply();
// Cat
animals.get(1).apply();
// Lion
animals.get(2).apply();
}
}
正如您所看到的,我不需要检查它的类型,以便为每只动物调用正确的行为。这就是多态性的全部内容。
答案 3 :(得分:0)
在Java中,您必须使用instanceof。你会发现人们不鼓励使用实例。大多数人认为它是代码味道。为什么?因为使用打字系统的全部原因是您可以将不同类型视为相同。换句话说,如果你收集了一堆不同的类型,基于它们在你的基类中体现的相似性,你应该满足于通过该基类引用访问每个类型。如果您正在编写检查每种类型然后执行不同操作的代码,则表示您的类型系统已泄漏。
例如,考虑一些您可能想要执行的操作。也许你必须喂养每只动物(在救援中心)。您可以在基类中定义一个操作,例如“喜欢吃”,表示该动物想要的东西。每个子类都提供自己的方法实现。但是,从您的主代码中,您可以遍历集合并从基类引用调用该方法,而不知道每个方法的详细信息。在这种情况下,您的模型已提供扩展。请记住这句格言:开放延伸,关闭修改(归功于Bertrand Meyer)。
如果你只是将一堆相关的对象扔进一个集合中,并且根据我发现的情况决定“我会弄清楚如何处理每一个”,那么你就不会遵循这个原则了。
答案 4 :(得分:-2)
使用instanceof来区分类层次结构中的不同对象类型
import java.util.ArrayList;
import java.util.List;
public class Inheritance {
public static void main(String[] args) {
//create a list to hold all animals
List<Animal> animals = new ArrayList<Animal>();
//add animals
animals.add(new Animal());
animals.add(new Dog());
animals.add(new Cat());
for (Animal a:animals) {
//Use instanceof to determine type of object
if(a instanceof Dog){
Dog dog = (Dog)a;
dog.displayDog();
}else if (a instanceof Cat) {
Cat cat = (Cat)a;
cat.displayCat();
}else{
a.display();
}
}
}
}
class Animal{
public void display(){
System.out.println("This is a Animal");
}
}
class Dog extends Animal{
public void displayDog(){
System.out.println("This is a Dog");
}
}
class Cat extends Animal{
public void displayCat(){
System.out.println("This is a Cat");
}
}