#java #class #methods
#java #класс #методы
Вопрос:
Я прочитал инструкцию, в которой говорится: «метод определен и содержится в классе Java.» Но мне любопытно, насколько определенно это утверждение.
Возможно ли когда-либо создать метод (функцию) в Java, который не содержится внутри класса?
Комментарии:
1. И как бы вы это назвали? Каждый метод должен быть определен в классе, потому что вне классов больше ничего нет.
2. Почему у вас есть сомнения?
3. @Dadou Потому что в C #
struct
может использоваться для замены aclass
. Я думаю, что в 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 это связано с тем, что он никогда не был объектно-ориентированным, но был изменен для работы в объектном режиме.