Почему я должен объявлять реализованные методы интерфейса как "публичные"?
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, поэтому его жалуются.