java中不同对象的数组?

时间:2017-09-28 21:42:02

标签: java

所以,例如,让我们说我有这个名为例如#34; Animals",一个名为" Dogs"的子类。和其他一个名为" Cats"和一个运行程序的类。

class Animals{
    int size;
    String name;
}
class Dogs extends Animals{
    void bark(){
        System.out.println("Woff");
    }
}

class Cats extends Animals{
    void meow(){
        System.out.println("Meow");
    }
}

在类Test中我想创建一个包含它们的数组。我该如何声明它们以便我也可以访问他们的方法?例如,我在想这样的事情:

class Test{
    public static void main(String[] args){
        Animals [] array = new Animals[2];
        array[0] = new Dogs();
        array[1] = new Cats();
        array[0].bark();
    }
}

但是,由于Java将该方法识别为动物,因此它似乎不会那样工作。方法

4 个答案:

答案 0 :(得分:1)

为什么这不起作用

由于数组是动物,它不会让你调用子类方法,因为编译器不能确定任何动物会有树皮或喵喵方法。

如何修复

您可以执行以下操作之一:

  • 向animal添加一个抽象的makeSound方法,并将其用于两者,因此编译器知道该方法存在。
  • 有2个数组,1个狗和1个猫,因此编译器知道该方法存在。
  • 使用instanceof检查每个项目的类型,并在转换为正确的类型后调用方法,因此在运行时检查类型。

答案 1 :(得分:1)

您需要使用instanceof检查动物是猫还是狗,然后安全施放并称之为好方法:

public static void main(String[] args){
    Animals [] array = new Animals[2];
    array[0] = new Dogs();
    array[1] = new Cats();
    array[0].bark();
}

public static void makeSound(Animal[] animals){
    for(Animal a : animals){
        if(a instanceof Dogs){
            ((Dogs)a).bark();
        }else if(a instanceof Cats){
            ((Cats)a).meow();
        }
}

这将打印:

Woff
Meow

更好的练习:

class Animals{
    int size;
    String name;
    abstract void makeSound();
}
class Dogs extends Animals{
    void makeSound(){
        System.out.println("Woff");
    }
}

class Cats extends Animals{
    void makeSound(){
        System.out.println("Meow");
    }
}

答案 2 :(得分:0)

您可以在数组位置请求对象的实例,然后通过将对象强制转换为dogs类来调用该方法是安全的:

if(array[0] instanceof Dogs) {
    ((Dogs)array[0]).bark()
}

答案 3 :(得分:0)

作为继承的良好实践,您应该将超类Animals视为所有子类的蓝图。因此,barkmeow方法应该与您使用DogCat的方式一样在超类中,

class Animals{
    int size;
    String name;
    void bark(){
    }
    void meow(){
    }
}

这样,根据您初始化Animal的未来实例的方式,他们将使用超类中的默认barkmeow方法或这些方法中提供的任何覆盖版本子类。