调用方法来自Java

时间:2017-11-23 13:15:02

标签: java class methods interface

我试图在我的DogOwner类中创建一个名为makeDogsBark()的方法,它应该执行当前DogOwner所有狗的bark()方法。

当我尝试调用该方法时,我收到了以下错误。 DogOwner.java:21:错误:狗是抽象的;无法实例化

这是我的界面Dog.java:

public interface Dog {
String getName();
String getBreed();
void bark();
}

这是我的第一堂课Doggo.java:

public class Doggo implements Dog {
    private String name;

    public Doggo(String name){
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getBreed() {
        return "doggo";
    }

    @Override
    public void bark() {
        System.out.println("The doggo " + name + " made a noise: Woof!, it said.");
    }
}

这是我的第二课Pupper.java:

public class Pupper implements Dog {
    private String name;

    public Pupper(String name){
        this.name = name;
    }

    @Override
    public String getName() {
        return this.name;
    }

    @Override
    public String getBreed() {
        return "pupper";
    }

    @Override
    public void bark() {
        System.out.println("The pupper " + name + " made a noise: Bark! Bark! Bark!, it said.");
    }
}

这是我的第三类DogOwner.java:

public class DogOwner {

private String name;
private ArrayList<Dog> dogsOwned;

public DogOwner(String name){
    this.name = name;
}

public void adoptDog(Dog newDog){
    if(!this.dogsOwned.contains(dogsOwned)){
        this.dogsOwned.add(newDog);
    }

}

public void makeDogsBark(){
    System.out.println("The person " + name + " made all his/hers dogs bark.");
    Dog dog = new Dog();
    dog.bark();
}
}

3 个答案:

答案 0 :(得分:1)

强制性(用于编译)

无法实例化接口:

Dog dog = new Dog();  // <-- This cannot possibly compile

您必须在:

之间进行选择
Dog dog = new Doggo("good boy");

Dog dog = new Pupper("good boy");

然后让每只狗都吠叫的方法应该在列表中循环:

public void makeDogsBark() {
    this.dogsOwned.forEach(Dog::bark);
}

或Java 7-版本:

public void makeDogsBark() {
    for (Dog dog : this.dogsOwned) {
        dog.bark();
    }
}

可选(代码质量)

可选)属性dogsOwned也应该是List

private List<Dog> dogsOwned;

并在构造函数中实例化:

public DogOwner(String name) {
    this.name = name;
    this.dogsOwned = new ArrayList<>();  // new ArrayList<Dog>() Java 7-
}

optional )此外,如果您希望Dog集合是唯一的,请使用Set而不是列表。

private Set<Dog> dogsOwned;

public DogOwner(String name) {
    this.name = name;
    this.dogsOwned = new HashSet<>();  // new HashSet<Dog>() Java 7-
}

这样你就可以:

public void adoptDog(Dog newDog) {
    this.dogsOwned.add(newDog);  // Won't add anything that already exists in the Set
}

问题是,这将比较并不总是理想的对象引用。 为了避免这种比较,您可以覆盖equals()hashcode()方法,以想要的方式比较对象。检查&#34;实现equals和hashcode&#34;在你最喜欢的搜索引擎上。

答案 1 :(得分:0)

public void makeDogsBark(){
    dogsOwned.forEach(it -> it.bark());
}

答案 2 :(得分:0)

您无法实例化界面。

--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param2"

paramVal2
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param1"

paramVal1
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file1.xml"
Content-Type: text/xml


--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file2.xml"
Content-Type: text/xml


--85d945c02ac04c9fbdcd9979e34e6d04--

这是一段错误的代码。

而不是这样,你可以遍历 dogsOwned 列表,让每只狗都吠叫。

Dog dog = new Dog();

您也可以使用此功能跳过Java 8中的循环。

for(Dog dog : dogsOwned){
        dog.bark();   
}

希望这可以帮助你。