如何确定派生类的类型?

时间:2015-03-14 19:34:57

标签: java oop inheritance

假设我有一个名为animal的超类,以及分别称为DogCatLion的三个子类,它们扩展了animal类。 然后,我为子类创建一个对象,并将它们添加到ArrayList<animal>

当我浏览该列表时,如何区分DogCat对象,因为ArrayList中的每个对象都属于animal类型?

5 个答案:

答案 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");
    }
}