Java抽象类实现接口。

9

我有以下接口和实现它的抽象类:

interface Walk {
    String walk();
}

public abstract class Animal implements Walk {
    abstract String MakeNoise();
}

以下是具体的实现方式:
class Cat extends Animal {
    String MakeNoise() {
        return "Meow";
    }

    @Override
    String walk() {
        return "cat is walking";
    }
}

class Dog extends Animal {
    @Override
    String walk() {
        return "Dog is walking";
    }

    @Override
    String MakeNoise() {
        return "bark";
    }
}

class Human {
    public void Speak() {
        System.out.println("...Speaking...");
    }
}

把所有的东西放在一起:
class MainClass {
    public static void main(String[] args) {
        Random randomGen = new Random();

        Animal[] zoo = new Animal[4];
        zoo[0] = new Cat();
        zoo[1] = new Dog();
        zoo[2] = new Cat();
        zoo[3] = new Cat();
        // System.out.println(zoo[ randomGen.nextInt(2)].MakeNoise());
        for (Animal animal : zoo) {
            if (animal instanceof Dog) {
                Dog jeffrey = (Dog) animal;
                System.out.println(jeffrey.MakeNoise());
            }

        }
    }
}

我遇到了这个错误

"Cat类中的walk()无法实现Walk接口中的walk()方法"。

有什么想法吗?谢谢。


2
那不是错误信息所说的。 - Mark Peters
我自己的问题...Animal类是否应该提供walk()方法的“实现”(即使它是一个抽象方法)? - SJuan76
2
我仍然怀疑那是否是错误信息。如果您想要有效的帮助,请提供有效的信息:将错误信息逐字逐句复制到您的问题中。 - Mark Peters
@SJuan:你可以从两个方面争论一些观点,但是不重新声明它会使更改接口变得更容易。如果您不使用@Override注释,则重新声明方法的风险会略微增加。我能想到重新声明它们的唯一收益是,这样您就可以事先看到需要实现什么,但在我看来,这就是IDE的作用。 - Mark Peters
1
在输入错误信息时,你的手指应该触碰的唯一键是 ctl/command-cctl/command-v - Wayne
显示剩余3条评论
4个回答

20

接口中的方法默认为public,但类中的方法默认为包可见。您无法降低重写方法的可见性,不能执行以下操作:

class A {
    public foo() {}
}

class B extends A {
    private foo() {}  // No!
}

class C extends A {
    foo() {}          // No! foo is package-visible, which is lower than public
}
在您的情况下,解决方案是在 DogCat 中将 walk() 声明为 public

1
让我惊讶的是,接口被声明为包而不是公共的。谢谢 - Marin
1
那是个不错的发现,Oli。我告诉你,我所处理的最糟糕的漏洞总是归结于这种愚蠢的事情。 - Inversus

2
错误提示为:eclipse 给出的错误提示为:“无法降低从 Walk 继承的方法的可见性”。该方法必须是 public,因为它是在接口中定义的。

1

接口方法必须是公共的。您需要在Cat中声明walk()为公共方法。


1

String walk()的实现改为public。这样就可以解决问题了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接