Интерфейс без методов

Почему Java вводит некоторый интерфейс, который не имеет в нем методов? Например Cloneable, Serializable, Type и многие другие.

Второе: в пакете Class.class существует один метод, определенный registerNatives() без тела и вызывается из статического блока, но Class.class не является абстрактным, а final. Почему так? и почему Java нужен какой-то метод без тела, который вызывается из статического блока.?

Ответ 1

  Почему Java представляет какой-то интерфейс, в котором не определены методы?

Это называется Tagged или Marker interface. Они не используются ни для какого использования или операции. Эти методы используются для маркировки или маркировки класса. Чтобы вы могли определить, является ли someclass дочерним по отношению к этим классам.

о втором вопросе

Если вы посмотрите внимательно, то увидите, что объявление

 private static native void registerNatives();

Так что registerNatives это нативные методы.

Итак, что такое родные методы. Если вы видите это так вопрос

Метод реализован в "родном" коде. То есть код, который делает не работать в JVM. Обычно написано на C или C++.

Собственные методы обычно используются для взаимодействия с системными вызовами или библиотеки, написанные на других языках программирования.

Таким образом, эти методы загружаются из нативных кодов. Поэтому вам не нужно объявлять тело методов, но они не являются абстрактными, так как имеют реализацию из собственных кодов.

Ответ 2

Интерфейс маркера используется в качестве тега для сообщения сообщения в java-компиляторе, чтобы он мог добавить к классу, реализующему его, особое поведение. Интерфейс маркера Java не имеет в нем элементов.

Цель Маркерных интерфейсов заключается в том, чтобы заставить какую-то функциональность в классах, предоставляя некоторую функциональность классу, если он реализует интерфейс маркера.

Прочитайте Интерфейс маркера Java также см. Что такое использование интерфейсов маркеров в Java?

Ответ 3

Для первого вы действительно запрашиваете интерфейс маркера. Маркерные интерфейсы по дизайну не должны ничего добавлять к поведению, но поддерживают только полиморфное преобразование объекта. например Serializable создает объект, способный передавать потоки через границы JVM. Маркерные интерфейсы следуют философии универсальной подстановки типов.

Во-вторых, вы действительно просите JNI. Java не реализует весь свой код в форме Java. Я имею в виду классы и код, которые следуют синтаксису Java. Некоторое время или другое вам нужно перейти к API собственной платформы, чтобы реализовать что-то для этого API. например сокетов и TCP-связи. Именно эта особенность Java фактически делает ее независимой от платформы. Время выполнения JVM зависит от платформы, поскольку оно использует встроенные методы на основе платформы и библиотеки dll или .so для реализации и интеграции с платформой. Мы, как программисты, вызываем вызовы API Java высокого уровня Java.

Ответ 4

registerNatives()

собственный метод реализован в JVM. Что делает метод registerNatives()?

Why Java need some method without body to be called from static block.?

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

Ответ 5

Одна из "чистых" особенностей языка программирования Java заключается в том, что он требует разделения между интерфейсами (чистое поведение) и классами (состояние и поведение). Интерфейсы используются в Java для определения поведения производных классов. Часто вы сталкиваетесь с интерфейсами в Java, которые не имеют поведения. Другими словами, это просто пустые определения интерфейса. Они известны как маркерные интерфейсы. Вот некоторые примеры интерфейсов маркеров в Java API:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.util.EventListener

Интерфейсы маркеров также называют интерфейсами "тегов", так как они маркируют все производные классы в категорию в зависимости от их назначения. Например, все классы, которые реализуют интерфейс Cloneable, могут быть клонированы (то есть метод clone() может быть вызван для них). Компилятор Java проверяет, вызывается ли метод clone() для класса, и этот класс реализует интерфейс Cloneable. Например, рассмотрим следующий вызов метода clone() для объекта o:

SomeObject o = new SomeObject();
SomeObject ref = (SomeObject)(o.clone());

Если класс SomeObject не реализует интерфейс Cloneable (а Cloneable не реализован ни одним из суперклассов, от которых наследуется SomeObject), компилятор пометит эту строку как ошибку. Это связано с тем, что метод clone() может вызываться только объектами типа "Cloneable". Следовательно, хотя Cloneable является пустым интерфейсом, он служит важной цели.