Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定派生类的类型?_Java_Oop_Inheritance - Fatal编程技术网

Java 如何确定派生类的类型?

Java 如何确定派生类的类型?,java,oop,inheritance,Java,Oop,Inheritance,假设我有一个名为animal的超类和三个子类,分别名为Dog、Cat、和Lion,它们扩展了animal类。 然后,我为每个子类创建一个对象,并将它们添加到ArrayList中 当我浏览该列表时,如何区分狗或猫对象,因为数组列表中的每个对象都是动物类型 您应该使用instanceof运算符: if (animal instanceof Dog) { //something } else if (animal instanceof Cat) { //something } else i

假设我有一个名为
animal
的超类和三个子类,分别名为
Dog
Cat
、和
Lion
,它们扩展了
animal
类。 然后,我为每个子类创建一个对象,并将它们添加到
ArrayList


当我浏览该列表时,如何区分
对象,因为
数组列表中的每个对象都是
动物
类型

您应该使用
instanceof
运算符:

if (animal instanceof Dog) {
   //something
} else if (animal instanceof Cat) {
   //something
} else if (animal instanceof Lion) {
   //something
}

然而,如果你真的需要使用它,你应该三思而后行。在大多数情况下,
instanceof
是一种糟糕的OOP实践。

您应该使用
instanceof
操作符:

if (animal instanceof Dog) {
   //something
} else if (animal instanceof Cat) {
   //something
} else if (animal instanceof Lion) {
   //something
}

然而,如果你真的需要使用它,你应该三思而后行。在大多数情况下,
instanceof
是一种糟糕的OOP实践。

继承的要点是,您不需要知道每个对象的动物类型,当您调用必须用于动物对象的方法时,每个子类都可以根据需要实现此方法


如果您需要知道可以使用关键字instanceof的类型,但如果您需要使用它,则可能在OOP编程时出错了继承的要点是您不需要知道每个对象的类型,当您调用必须调用animal对象的方法时,每个子类都可以根据需要实现该方法


如果您需要知道可以使用关键字instanceof的类型,但是如果您需要使用它,则可能在Java中进行OOP编程时出错,您必须使用instanceof。你会发现人们不鼓励使用实例。大多数人认为它是代码气味。为什么?因为使用打字系统的全部原因是,您可以将不同的类型视为相同的类型。换句话说,如果你收集了一堆不同的类型,基于它们在基类中的相似性,你应该对通过基类引用访问每一种类型感到满意。如果您编写的代码检查每个类型,然后执行不同的操作,则意味着您的类型系统存在漏洞

例如,考虑一些可能需要执行的操作。也许你必须给每只动物喂食(在救援中心)。您可以在基类中定义一个操作,如“喜欢吃”,以指示动物想要什么。每个子类将提供该方法的自己的实现。但是,在主代码中,您可以只遍历集合并从基类引用调用方法,而不知道每个方法的细节。在这个场景中,您的模型提供了扩展。记住这句格言:开放的扩展,封闭的修改(归因于伯特兰梅耶)


如果你只是把一堆相关的对象扔进一个集合,然后决定‘好吧,我会根据我发现的情况来决定如何处理每个对象’,那么你就没有遵循这个原则。

在Java中,你必须使用instanceof。你会发现人们不鼓励使用实例。大多数人认为它是代码气味。为什么?因为使用打字系统的全部原因是,您可以将不同的类型视为相同的类型。换句话说,如果你收集了一堆不同的类型,基于它们在基类中的相似性,你应该对通过基类引用访问每一种类型感到满意。如果您编写的代码检查每个类型,然后执行不同的操作,则意味着您的类型系统存在漏洞

例如,考虑一些可能需要执行的操作。也许你必须给每只动物喂食(在救援中心)。您可以在基类中定义一个操作,如“喜欢吃”,以指示动物想要什么。每个子类将提供该方法的自己的实现。但是,在主代码中,您可以只遍历集合并从基类引用调用方法,而不知道每个方法的细节。在这个场景中,您的模型提供了扩展。记住这句格言:开放的扩展,封闭的修改(归因于伯特兰梅耶)


如果您只是将一组相关对象扔进一个集合中,然后决定“好吧,我会根据我发现的情况找出如何处理每个对象”,那么您就没有遵循这一原则。

使用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");
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类继承{
公共静态void main(字符串[]args){
//创建一个包含所有动物的列表
列出动物=新建ArrayList();
//添加动物
添加(新动物());
添加(新狗());
添加(新的Cat());
(动物a:动物){
//使用instanceof确定对象的类型
如果(狗的实例){
Dog Dog=(Dog)a;
dog.displayDog();
}else if(Cat实例){
Cat=(Cat)a;
cat.displayCat();
}否则{
a、 显示();
}
}
}
}
类动物{
公共空间显示(){
System.out.println(“这是一种动物”);
}
}
狗类动物{
公共图书馆{
System.out.println(“这是一只狗”);
}
}
猫科动物{
公共目录{
System.out.println(“这是一只猫”);
}
}

使用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");
    }
}
import java.util.ArrayList;
导入java.util.List;
公共类继承{
公共静态void main(字符串[]args){
//创建一个包含所有动物的列表
列出动物=新建ArrayList();
//添加动物
添加(新动物());
添加(新狗());
动物。添加(新猫)