所以,例如,让我们说我有这个名为例如#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将该方法识别为动物,因此它似乎不会那样工作。方法
答案 0 :(得分:1)
由于数组是动物,它不会让你调用子类方法,因为编译器不能确定任何动物会有树皮或喵喵方法。
您可以执行以下操作之一:
答案 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
视为所有子类的蓝图。因此,bark
和meow
方法应该与您使用Dog
和Cat
的方式一样在超类中,
class Animals{
int size;
String name;
void bark(){
}
void meow(){
}
}
这样,根据您初始化Animal
的未来实例的方式,他们将使用超类中的默认bark
和meow
方法或这些方法中提供的任何覆盖版本子类。