Что такое неявное объявление методов интерфейса в Java 8?
Я читал мою старую книгу SCJP 6 (автор Кэти Сьерра, Берт Бейтс) упоминал
- Все
interface
методы неявноpublic
а такжеabstract
по умолчанию interface
методы не должны бытьstatic
Например, если мы объявим
interface Car
{
void bounce(); //no need of public abstract
void setBounceFactor(int b); //no need of public abstract
}
Что видит компилятор
interface Car
{
public abstract void bounce();
public abstract void setBounceFactor(int b);
}
Но из Java 8 интерфейсы теперь могут определять статические методы. смотреть эту статью все о-java-8
Мой вопрос, что такое неявное объявление методов интерфейса в Java 8? Только public
или ничего?
3 ответа
Правила для неявных модификаторов не меняются. Неявные модификаторы используются, когда другие модификаторы не указаны. abstract
подразумевается, когда ни static
ни default
был указан. И все методы всегда public
будь то явный или явный. Обратите внимание, что interface
поля всегда были неявно public
static
, Это тоже не изменится.
Но для последних слов нам следует дождаться завершения Java 8.
Afaik это то, что вы можете добавить и добавляется без изменений в реализации классов.
Например. В класс List будет добавлен метод sort(). У подкласса уже мог бы быть этот метод, но если бы каждый класс нуждался в этом методе, он сломал бы много кода и сделал бы использование по умолчанию немного бесполезным.
Я полагаю, что ожидается, что метод по умолчанию будет простым и вызовет статический метод или вспомогательный класс, чтобы оставить интерфейс незагроможденным.
короче говоря, методы по умолчанию являются публичными, но не абстрактными.
Кстати, у интерфейсов есть метод для инициализации статического поля.
Что такое неявное объявление методов интерфейса в Java 8? Только публичный или ничего?
Ответ: это все еще public
, private
или же protected
ограничены. Посмотрите на следующие два примера
public interface A {
static void foo() {// Its ok. public will implicitly call.
System.out.println("A.foo");
}
private static void foo2() {// Compile time error
System.out.println("A.foo2");
}
}