我正在尝试编写一个程序(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
。 Dog
和Cat
通常会放置在Pets
类的外部:extends Pets
的继承会通知用户/编译器与Pets
的关系,而类定义的位置不需要。