【问题标题】:How to make array of inherited objects - Java如何制作继承对象的数组 - Java
【发布时间】:2018-11-29 21:48:17
【问题描述】:

我有抽象类 Animal 和继承类 Fish 和 Dog。 我需要创建鱼和狗的各种对象,并给它们命名和品种,并为它们的移动方式制定方法。 最后,我需要创建一个它们的数组并随机打印 4 次显示它们的名称和品种。

主类:

public class JavaApplication38 {


public static void main(String[] args) {


   Animal[] arr = new Animal[20];

    arr[0] = new Fish("Riby", "Sea Fish");
    arr[1] = new Dog("Any", "Great Dane");
    arr[2] = new Fish("Ribytsa", "River fish");
    arr[3] = new Dog("Jackie", "Pug");
    arr[4] = new Fish("Bobi", "Mix");
    arr[5] = new Dog("Ruby", "Labrador");    

    }

}

动物类

public abstract class  Animal {

  public Animal(String name, String breed){

  } 



   public Animal(){
   }

   public abstract void moving();

}

狗类

Public class Dog extends Animal{


private String breed;
private String name;

public Dog(){
}

 public Pas(String name, String breed){
     this.name = name;
     this.breed =breed;
}


@Override
public void moving() {
    System.out.print("Walk\n");
}

}

鱼类

public class Fish extends Animal {


private String breed;


private String name;

public Fish(){

}

public Fish(String name, String breed){
    this.name = name;
    this.breed= breed;
}

@Override
public void moving(){
    System.out.print("Swims\n");
}

}

问题是,我必须在循环中写什么来通过数组打印名称和品种?

【问题讨论】:

  • 您没有将breedname 放入抽象Animal 类中的任何特殊原因?
  • 当然,您应该将这些字段移至超类并将每个条目视为 Animal 实例

标签: java inheritance abstract


【解决方案1】:

问题是您在Animal 的每个子类中分别定义了namebreed。您需要在Animal 中创建namebreed 实例变量。这样一来,Java 就知道每一个 Animal 都有一个 namebreed

public abstract class Animal {
    private String name;
    private String breed;

    public Animal(String name, String breed) {
        this.name = name;
        this.breed = breed;
    }

    public getName() { return name; }
    public getBreed() { return breed; }

    public abstract void moving();
}

public class Dog extends Animal {
    public Dog(String name, String breed) {
        super(name, breed);
    }

    @Override
    public void moving(){
        System.out.print("Walks\n");
    }
}

public class Fish extends Animal {
    public Fish(String name, String breed) {
        super(name, breed);
    }

    @Override
    public void moving(){
        System.out.print("Swims\n");
    }
}

现在您可以为任何Animal 打印namebreed,无论是Dog 还是Fish

Animal[] arr = new Animal[6];

arr[0] = new Fish("Riby", "Sea Fish");
arr[1] = new Dog("Any", "Great Dane");
arr[2] = new Fish("Ribytsa", "River fish");
arr[3] = new Dog("Jackie", "Pug");
arr[4] = new Fish("Bobi", "Mix");
arr[5] = new Dog("Ruby", "Labrador");

for (Animal a : arr) {
   System.out.println(a.getName() + " " + a.getBreed());
   a.moving();
}

【讨论】:

  • arr[0] = new Fish("someName", "someBreed");表示将名称和品种分配给鱼构造函数而不是动物构造函数。当我编译它时,它给我 null null 的名称和品种。
  • 哎呀!你是对的。我忘了为 Dog 和 Fish 添加构造函数。我将它们添加到示例中。它们接受名称和品种,然后将它们传递给超类(动物)构造函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 2015-09-30
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多