Почему я должен объявлять реализованные методы интерфейса как "публичные"?

interface Rideable {
    String getGait();
}

public class Camel implements Rideable {
    int weight = 2;

    String getGait() {
        return " mph, lope";
    }

    void go(int speed) {++speed;
        weight++;
        int walkrate = speed * weight;
        System.out.print(walkrate + getGait());
    }

    public static void main(String[] args) {
        new Camel().go(8);
    }
}

При компиляции приведенного выше кода у меня есть ошибка компиляции, связанная с модификатором доступа getGait() метод. Пожалуйста, объясните, почему я должен объявить getGait() с public модификатор доступа?

5 ответов

Решение

getGait() из Camel реализует метод Rideable интерфейс. Все методы интерфейса public по умолчанию (даже если вы не указываете это явно в определении интерфейса), поэтому все реализующие методы также должны быть открытыми, так как вы не можете уменьшить видимость метода интерфейса.

В интерфейсе у вас есть метод getGait() объявлен как public, Даже если вы не объявляете метод как открытый в интерфейсе, он является открытым.

Но в вашем классе вы объявили этот метод как пакет private. Это не разрешено, потому что это уменьшает видимость реализованного метода.

Чтобы избежать этой проблемы. либо объявите этот метод как общедоступный в вашем классе, либо удалите объявление (implements Rideable) что ваш класс реализует интерфейс с этой сигнатурой метода.

Согласно объектно-ориентированным основам, интерфейс содержит только публичные методы. поэтому, когда вы реализуете интерфейс, вы должны объявить его как общедоступный, иначе он даст вам ошибку времени компиляции.

Благодарю.

Одним из основных способов использования интерфейсов может быть проверка соответствия. Например, класс, реализующий Comparable интерфейс должен обеспечивать compareTo метод и, следовательно, обеспечение механизма для сравнения объектов класса. Причина, по которой эти методы являются публичными, имеет смысл, потому что любой класс, который использует это соответствие, должен иметь возможность использовать эти методы без каких-либо ограничений. Например, метод сортировки Arrays Класс будет достаточно хорош для сортировки объектов класса, только если он реализует Comparable и выставляет compareTo метод (Если это механизм, который вы хотите предоставить для сортировки. Конечно, Comparator тоже есть). Таким образом, в двух словах, контракт достаточно хорош, только если его можно прочитать или использовать в случае интерфейсов (таким образом, делая методы public императив).

В интерфейсе поля неявно public static final и методы в интерфейсе по умолчанию public,

Пожалуйста, ознакомьтесь с правилами наследования:

http://www.codejava.net/java-core/the-java-language/12-rules-of-overriding-in-java-you-should-know

Один из них гласит: "Переопределяющий метод не должен иметь более ограничительного модификатора доступа". Таким образом, вы ovveriding getGait() в Camel учебный класс. Если вы не предоставите модификатор доступа в методах класса, то по умолчанию его default, Что означает, что вы ограничиваете модификатор доступа от public в default, Следовательно нарушая правило ovveriding, поэтому его жалуются.

Другие вопросы по тегам