Что такое неявное объявление методов интерфейса в 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 поля всегда были неявно publicstatic, Это тоже не изменится.

Но для последних слов нам следует дождаться завершения 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");
    }
}
Другие вопросы по тегам