Java абстрактный класс реализует интерфейс - PullRequest
8 голосов
/ 15 декабря 2011

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

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 ]

19 голосов
/ 15 декабря 2011

Методы в интерфейсах неявно 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.

2 голосов
/ 15 декабря 2011

Ошибка Eclipse дает:

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

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

1 голос
/ 15 декабря 2011

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

1 голос
/ 15 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...