Возможно ли создать метод, который не содержится ни в одном классе?

#java #class #methods

#java #класс #методы

Вопрос:

Я прочитал инструкцию, в которой говорится: «метод определен и содержится в классе Java.» Но мне любопытно, насколько определенно это утверждение.

Возможно ли когда-либо создать метод (функцию) в Java, который не содержится внутри класса?

Комментарии:

1. И как бы вы это назвали? Каждый метод должен быть определен в классе, потому что вне классов больше ничего нет.

2. Почему у вас есть сомнения?

3. @Dadou Потому что в C # struct может использоваться для замены a class . Я думаю, что в Java его нет struct , но просто для перестраховки я хочу уточнить у всех экспертов здесь, является ли это определенным.

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

5. » … который не содержится ни в одном классе? » учитываются ли интерфейсы?

Ответ №1:

До Java-8 утверждение о том, что все методы «содержатся в классе Java», было полностью верным. Однако с введением лямбда-выражений в Java-8 появилось дополнительное место, где может появиться фрагмент кода — лямбда-функция. В отличие от анонимного класса, который все еще является классом, лямбды — это другой вид объекта, размещающего код.

Java-8 добавляет еще одно место, где может появиться метод — интерфейс. Добавление нового языка позволяет указать реализацию метода по умолчанию внутри интерфейса. Это не означает, что вы можете его вызывать, но вы, безусловно, можете разместить некоторый исполняемый код внутри интерфейса Java-8.

Что касается «автономных» методов, то ни одно языковое дополнение не разрешило их: вся исполняемая логика должна быть контейнером внутри чего-то другого, но не обязательно класса.

Комментарии:

1. Вы имеете в виду Java 8, не так ли? 😉

2. Если я не ошибаюсь, функции lamda находятся внутри классов. Интерфейсы — это классы. Несмотря на это, интерфейсы всегда могли иметь методы — просто до версии 8 все методы интерфейса были общедоступными и абстрактными.

3. Интерфейсы @emory определенно не являются классами (во всяком случае, вне отражения). Что касается лямбд, то это на самом деле довольно сложно: компилятор использует его с умом, избегая создания класса за сценой, когда лямбды не захватываются.

4. @dasblinkenlight Я поверю вам на слово насчет lamdas. Если мы допустим, что интерфейсы не являются классами, то в java 8 нет ничего нового. мы всегда могли создать метод, который не содержится ни в одном классе.

5. @emory Не могли бы вы объяснить, как вы могли бы реализовать метод, который не содержится ни в одном классе? Методы интерфейса не реализуют методы; реализации методов внутри анонимных классов находятся внутри классов.

Ответ №2:

ну … не полностью. Вы не можете сделать это во время компиляции, но вы можете сделать это на лету. Вы можете добавлять байты в класс «на лету». Если вы знаете спецификацию виртуальной машины Java, вы можете это сделать, но я думаю, вы также могли бы сделать это с помощью BCEL от Apache:

http://jakarta.apache.org/bcel/index.html

Есть и другие варианты. Сделайте свой класс абстрактным и не реализуйте этот метод. создайте интерфейс. Но, да, вы могли бы создать байт-код для метода и привязать его к классу во время выполнения.

Ответ №3:

Нет, методы являются функциями для класса и должны быть созданы внутри класса.

Вне класса они незаконны.

Ответ №4:

Но мне любопытно, насколько определенно это утверждение.

Это очень определенно.

Нет, это невозможно. Методы должны быть в классе.

И если вы также будете мыслить логически, то вы можете обнаружить, что вне вашего класса ничего нет. Итак, откуда вы будете вызывать свой метод.

Ответ №5:

Нет, это невозможно. Поскольку Java всегда была объектно-ориентированной, всякий раз, когда запускается программа, она выполняется внутри класса, чтобы упростить создание и интеграцию объектов. Однако существуют некоторые объектно-ориентированные языки, в которых вы можете создавать методы вне классов, такие как PHP. В PHP это связано с тем, что он никогда не был объектно-ориентированным, но был изменен для работы в объектном режиме.