我正在尝试编写一个程序(Driver
),该程序将创建Humans
及其Pets
和特定类型,如下所示。
我遇到了多个错误:在Driver程序中,错误是当我尝试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());
}
}
答案 0 :(得分:2)
你看到的第一个问题是你试图不向Humans构造函数传递任何参数,但你没有定义一个不带参数的构造函数。这个特定错误的简单修复是向Humans添加一个默认构造函数:
public Humans() {}
可能更多内联你想要做的就是调用你拥有的构造函数。要做到这一点,你需要将一个名字和宠物传递给Humans(String, Pets)
,就像你似乎已经想到的那样。
创建一个Pets对象很简单,但是你没有像你正在尝试那样指定宠物的类型:Pets的每个子类本身就是一个类,所以你可以调用new Pets.Cat(...)
而不是试图调用某些东西在宠物上。
这让我们:
Pets bb = new Pets.Cat("Bertha", "meow", true);
Humans b = new Humans("Jane", bb);
这会导致更多编译错误,但希望这有助于解决您提出的构造问题。
关于命名约定/结构的评论:
Humans
类的实例代表单个人,而不是多个人(目前至少,不确定您使用population
的位置),所以它将更恰当地命名为Human
。Dog
和Cat
更典型地放在Pets
类之外:extends Pets
的继承通知用户/编译器与Pets
的关系,位置类定义不需要。答案 1 :(得分:0)
遇到了多个错误:在Driver程序中,错误是当我尝试执行Humans b = new Humans()时出现的错误;我得到:构造函数Humans in class不可以将人类应用于给定类型。
因为您创建了一个参数化构造函数,所以没有无参数化构造函数。
注意:-如果我们手动创建构造函数,则编译器不会自动放置默认构造函数。
因此,要解决此问题,您需要创建
人类b =新人类(“ John Doe”,新Pet(“ Lassy”,“ Meyyeww”,true));