Если у меня есть этот код.
public class Test{
{
class People {
}
}
public static void main(String[] args) {
People person = new People();//Compile ERROR
}
}
Я не могу создать экземпляр People.
Означает ли это, что блок инициализатора нельзя использовать для определения классов?
(Добавив второй ответ, поскольку у меня был неправильный, у него было три upvotes уже.)
Вы можете объявить класс внутри блока инициализатора, но его область действия - это блок инициализатора, как если бы вы объявили его в методе. Итак, это работает:
public class Test {
{
class People {
}
People people = new People();
System.out.println("In initializer block!");
}
public static void main(String[] args) {
new Test();
}
}
Я не могу сказать, что я когда-либо делал это раньше, и не могу себе представить, что я хочу сделать это в ближайшее время. Обратите внимание, что это локальный класс, который всегда является неявным внутренним классом. (Хотя, если вы объявляете локальный класс в статическом методе, нет закрывающего экземпляра, просто чтобы сделать терминологию немного странной...)
Если вы хотите создать класс, код которого вне блока инициализатора может "видеть", вам нужно объявить его вне блока инициализатора. (Как и любое другое объявление - если вы объявили переменную в блоке инициализатора, вы не ожидали бы, что сможете увидеть ее снаружи?)
Вы должны сделать внутренний класс static
:
static class People {
Ты можешь сделать
Test t = new Test();
People person = t. new People();
Поскольку у людей иначе нет закрывающего экземпляра
РЕДАКТИРОВАТЬ:
Поскольку определение класса находится в блоке инициализации, оно видимо и доступно только локально, INSIDE блок инициализации (что делает его особым местом для определения класса). Класс " People
" не может быть видимым в main
поскольку для People
нет видимого типа. Подход, описанный выше, будет работать только в том случае, если не было блока инициализации вокруг определения класса.
People
- это локальный класс, который относится только к области инициализации блока.
person
в main
Блок инициализатора (определяемый дополнительными скобками) изменяет область действия объявленного класса, поэтому он не будет виден снаружи, как и переменная не будет. Таким образом, единственное место, где может быть создано объект People
, находится внутри самого блока, например
{
class People {
}
People person = new People();
}
Без блока инициализации есть два варианта, которым вы можете следовать:
People
" как статическийВ первом случае единственное, что меняется, - это строка
static class People
Во втором случае main
метод будет выглядеть примерно так:
public static void main(String[] args) {
People person = new Test().new People();
}
Да, мы можем объявить блок инициализации и область действия класса. Люди будут в нем. Обновите код, как показано ниже:
public class Test {
{
class People {
/// Stuff
}
People people = new People(); // Create object of People
System.out.println("Initializer block");
}
public static void main(String[] args) {
Test obj = new Test();
}
}
static
, как вы предлагали ранее и другие ответы.