ОБНОВЛЕНИЕ Поскольку методы Java 8 могут быть вложены с использованием лямбда-выражений, см. этот другой вопрос .
Этот ответ действителен для версий Java до Java 8
Далее следует исходный ответ:
Могут ли методы в java быть вложенными [...]?
Нет, это невозможно.
Ближайшее, что вы можете получить, это:
class Name {
void methodOne() {
class InnerClass {
void methodTwo() {
}
}
}
}
То есть второй метод, определенный во внутреннем классе, определенном в методе.
Вы можете объявить метод статическим внутри внутреннего класса, поэтому вам не нужно вызывать new
Это недопустимый синтаксис; такая функция не поддерживается. (Хотя это рассматривается для Java 7)
Вместо этого вы можете использовать вложенные классы, о которых вы только что спросили .
Не проверяя, я бы сказал, что это не принимается компилятором, потому что на данный момент методы должны быть определены внутри класса. Однако вы можете определить внутренний класс внутри метода (см. «Локальные и анонимные внутренние классы»).
http://java.sun.com/docs/books/tutorial/java/javaOO/innerclasses.html
Нет.
Одно из решений - просто объявить методы, которые вы хотите вызвать, как частные методы вне «родительского» метода - если вы действительно беспокоитесь, вы можете использовать какое-либо соглашение об именах, чтобы указать, что они «принадлежат» «родительскому». метод.
Еще одна вещь, которую вы могли бы рассмотреть - и которая, кажется, не широко известна среди программистов, - это то, что вы можете объявить любой произвольный блок области видимости и пометить его, а затем использовать break для выхода из этого блока.
Итак, следующее является совершенно законным для Java:
void method() {
myInnerMethod : {
// do some stuff
if (condition) {
break myInnerMethod;
}
// do some more stuff
}
}
Конечно, блок области видимости на самом деле не является методом, но в некоторых случаях его можно использовать для выполнения того, для чего вам нужен «внутренний метод».
Не поддерживается на Java. Похоже, вы хотите выполнить рекурсию, просто вызовите тот же метод еще раз.
method(){
method();
}
Нет. Это неверный синтаксис. И это досадно - это одна из вещей, по которой мне не хватает Ады. Отсутствие возможности определять вложенные методы действительно создает множество проблем при организации классов с большим количеством частных методов. Отсюда скользкий спуск в землю, где нет сплоченности.
Вы можете использовать вложенные классы, но они имеют свою цену. Каждый вложенный класс создает класс с именем $ named. У каждого есть свои дескрипторы с точки зрения открытых файлов (если они не извлечены из архива), а также памяти, занятой определением его класса. Некоторые системы имеют ограничение на количество файлов (то есть общее количество сгенерированных классов), которые они могут развернуть (например, Google Apps.)
Другими словами, я бы не стал использовать вложенные классы для имитации вложенных методов (на всякий случай, если вы решите попробовать это.)
Теперь, предполагая, что вы можете использовать вложенные методы (как в Ada), эти методы будут будут видны только внутри включающего метода (они будут более ограниченными, чем типичные частные методы). Они смогут видеть переменные и параметры, определенные во внешней области (но, вероятно, только если они определены как final).
Это позволит вам организовать ваши методы и алгоритмы во вложенных пространствах имен. При разумном использовании вложенные методы действительно помогают в организации кода.