Java抽象类实现接口

时间:2011-12-14 22:09:56

标签: java class interface abstract

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

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()”。

有什么想法吗?感谢

4 个答案:

答案 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。这将解决它