构造函数不能应用于给定类型,在Java中创建对象,面向对象编程

时间:2015-05-11 02:19:46

标签: java oop object subclass superclass

我正在尝试编写一个程序(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());
    }
}

2 个答案:

答案 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);

这会导致更多编译错误,但希望这有助于解决您提出的构造问题。

关于命名约定/结构的评论:

  1. 对象名称通常不是复数:您的Humans类的实例代表单个人,而不是多个人(目前至少,不确定您使用population的位置),所以它将更恰当地命名为Human
  2. 不需要将子类放在其父级中。 DogCat更典型地放在Pets类之外:extends Pets的继承通知用户/编译器与Pets的关系,位置类定义不需要。

答案 1 :(得分:0)

遇到了多个错误:在Driver程序中,错误是当我尝试执行Humans b = new Humans()时出现的错误;我得到:构造函数Humans in class不可以将人类应用于给定类型。

因为您创建了一个参数化构造函数,所以没有无参数化构造函数。

  

注意:-如果我们手动创建构造函数,则编译器不会自动放置默认构造函数。

因此,要解决此问题,您需要创建

人类b =新人类(“ John Doe”,新Pet(“ Lassy”,“ Meyyeww”,true));