Абстрактный класс Java реализует интерфейс

у меня есть следующий интерфейс и абстрактный класс, который реализует его:

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

        }
    }
}

Я получаю эту ошибку

"walk () в Cat не может реализовать walk () в Walk" .

какие идеи? спасибо

4 ответов


методы в интерфейсах имплицитно public. Однако методы в классах по умолчанию являются package-visible. Вы не можете уменьшить видимость переопределенного метода, т. е. вы не можете делать такие вещи:

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() as public на Dog и Cat.


ошибка eclipse дает:

Не удается уменьшить видимость унаследованного метода из Walk

метод должен быть общедоступным, поскольку он определен в интерфейсе.


методы интерфейса должны быть общедоступными. Вам нужно объявить walk() как публичный метод в Cat.


сделать String walk() реализации public. Это поможет