Java抽象类实现接口

Mar*_*rin 8 java interface class abstract

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

interface Walk {
    String walk();
}

public abstract class Animal implements Walk {
    abstract String MakeNoise();
}
Run Code Online (Sandbox Code Playgroud)

以下具体实现:

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...");
    }
}
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

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());
            }

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

"cat中的walk()无法在Walk中实现walk()".

有任何想法吗?谢谢

Oli*_*rth 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
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,解决方案是声明walk()publicin DogCat.