我正在尝试编写一个程序(Driver),该程序将创建Humans及其Pets和特定类型,如下所示。

我遇到了多个错误:在驱动程序中,错误是当我尝试执行Humans b = new Humans();时得到:constructor Humans in class Humans cannot be applied to given types.
另外,如果我尝试写出Humans b = new Humans("Jane", Pet/Dog...),则不确定如何指定此人的宠物类型。

任何帮助和指示,将不胜感激。

public class Humans {
    String name;
    Pets pet;
    int popcount;

    public Humans(String hname, Pets hpet) {
        name = hname;
        pet = hpet;
    }

    public int populationCount() {
        return popcount;
    }

    public void makePetMakeNoise() {
        int randnum = (int) (Math.random() * 10);
        pet.makeNoise(randnum);
    }

    public void feedPet() {
        pet.eat();
    }
}
public class Pets {
    String name;
    String noise;
    boolean canMakeNoise;

    public Pets(String pname, String pnoise, boolean pcanmakenoise) {
        name = pname;
        noise = pnoise;
        pcanmakenoise = canMakeNoise;
    }

    public void makeNoise(int number) {
        if (canMakeNoise != false) {
            for (int i = 0; i < number; i++) {
                System.out.println(noise + name);
            }
        } else {
            System.out.println(name + " *remains silent*");
        }
    }

    public void eat() {
        System.out.println(name + " is eating...");
    }

    class Dog extends Pets {
        public Dog(String pname, String pnoise, boolean pcanmakenoise) {
            super(pname, pnoise, pcanmakenoise);
        }

        public void eat() {
            System.out.println(name + " is eating...");
        }
    }

    class Cat extends Pets {
        public Cat(String pname, String pnoise, boolean pcanmakenoise) {
            super(pname, pnoise, pcanmakenoise);
        }

        public void eat() {
            super.eat();
            System.out.println("I'm still hungry, meow");
        }
    }
}
public class Driver {
    public Driver() {
        Humans b = new Humans();
        b.name = "Jane";
        Pets bb = new Pets(Cat);
        b.pet = bb;
        bb.canMakeNoise = true;
        bb.name = "Bertha";
        ArrayList<String> list = new ArrayList<String>();
        list.add(b);

        ListIterator<String> itr = list.listIterator();
        while (itr.hasNext()) {
            String str = itr.next();
            str.makePetMakeNoise();
            str.feedPet();
        }
        System.out.println(Humans.populationCount());
    }
}

最佳答案

您看到的第一个问题是,您尝试不传递任何参数给Humans构造函数,但是您没有定义不接受任何参数的构造函数。解决此特定错误的简单方法是向Humans添加默认构造函数:

public Humans() {}

可能与您要执行的操作更加内联的是调用您拥有的构造函数。为此,您需要将名称和宠物传递给Humans(String, Pets),好像您已经知道了。

创建Pets对象很简单,但是您不必像尝试那样指定pet的类型:Pets的每个子类本身都是一个类,因此您将调用new Pets.Cat(...)而不是尝试在Pets上调用某些东西。

这使我们能够:
Pets bb = new Pets.Cat("Bertha", "meow", true);
Humans b = new Humans("Jane", bb);

这将导致更多的编译错误,但希望对您提出的构造问题有所帮助。

关于命名约定/结构的评论:
  • 对象名称通常不是复数形式:Humans类的实例表示一个人,而不是多个人(当前,至少,不确定您要与population一起使用),因此将其更恰当地命名为Human
  • 不需要将子类放置在其父类中。 DogCat通常会放置在Pets类的外部:extends Pets的继承会通知用户/编译器与Pets的关系,而类定义的位置不需要。
  • 10-06 08:33