-1

Подскажите пожалуйста, что тут происходит?

Я создал интерфейс VariablesAndMethodsWithoutModifiers, указал в нем 2 метода и 1 константу (переменную или свойство ?).
В main мне разрешило создать объект (?) этого интерфейса, с описанием реализации всех методов.
Далее через этот "объект" я могу использовать методы и свойства, описанные в интерфейсе.

Но после последней фигурной скобки требовало точку с запятой (;) и от интерфейсов нельзя создавать обьекты.

Что же было создано?

введите сюда описание изображения

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29

1 Answers1

1

1 константу (переменную или свойство ?)

В интерфейсах в качестве полей можно объявлять только константы.

JLS 9.3: Каждое объявление поля внутри интерфейса по умолчанию является public, static, final. Для таких полей допускается избыточное указание нескольких или всех таких модификаторов.

Аналогично, все методы в интерфейсе неявно имеют модификаторы public.


В main мне разрешило создать объект (?) этого интерфейса с описанием реализации всех методов.

Экземпляр интерфейса создать невозможно, так как интерфейсы по умолчанию абстрактные, в том числе даже если интерфейс является маркером и не содержит никаких абстрактных методов или содержит только реализации статических/дефолтных методов:

interface MyInterface {
    default void foo() {}
}

MyInterface interfaceInstance = new MyInterface(); // compilation error: MyInterface is abstract; cannot be instantiated

Serializable serializable = new Serializable(); // compilation error: Serializable is abstract; cannot be instantiated

При описании реализации всех методов (множество абстрактных методов интерфейса может быть пустым) создаётся анонимный внутренний класс и соответственно экземпляр такого класса.

MyInterface myInstance = new MyInterface() {}; // ok, only default method
System.out.println(myInstance.getClass());
// class MyClass$1
System.out.println(Arrays.toString(myInstance.getClass().getInterfaces()));
// [interface MyInterface]

Serializable serializable = new Serializable() {}; // ok, marker interface System.out.println(serializable.getClass()); // class MyClass$2 System.out.println(Arrays.toString(serializable.getClass().getInterfaces())); // [interface java.io.Serializable]

Nowhere Man
  • 15,995
  • 33
  • 19
  • 29
  • 1
    @AAlex Rudenko Спасибо огромное, помогли разобраться Почитал про анонимный класс – Mr.StupidQuestions Dec 19 '21 at 18:50