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