我有以下接口和实现它的抽象类:
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()”。
有什么想法吗?感谢
答案 0 :(得分:19)
接口中的方法是隐式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
}
在您的情况下,解决方案是在walk()
和public
中将Dog
声明为Cat
。
答案 1 :(得分:2)
eclipse给出的错误是:
无法降低Walk
中继承方法的可见性
该方法必须是公共的,因为它是在接口中定义的。
答案 2 :(得分:1)
接口方法必须是公开的。您需要将walk()
声明为Cat。
答案 3 :(得分:1)
进行String walk()
次实施public
。这将解决它