#java #initialization
#java #инициализация
Вопрос:
Я использую двойную инициализацию в java только для классов, например: new ArrayList(){{add()}}
Но недавно я по ошибке написал приведенный ниже код, и JVM не разозлилась на мою ошибку.
public void test(){
{
{
....
}
}
}
После этого привел простой пример и увидел следующее, но все еще ничего не понял, ожидая порядка выполнения инструкций.
public class HelloWorld{
public static void main(String []args){
HelloWorld hw=new HelloWorld();
hw.test1();
System.out.println("----------");
hw.test2();
}
public void test1(){
{
{
System.out.println("1");
}
System.out.println("2");
}
System.out.println("3");
}
public void test2(){
System.out.println("a");
{
System.out.println("b");
{
System.out.println("c");
}
}
}
}
Результат:
1
2
3
----------
a
b
c
Итак, мой вопрос заключается в том, что означают двойные или тройные инициализации etc в Java?
Комментарии:
1. Вам следует настоятельно рассмотреть возможность вообще не использовать инициализацию в виде двойной фигурной скобки. Это обманчивая синтаксическая выдумка, которая открывает вам всевозможные проблемы, такие как сериализуемые ошибки, утечки памяти и т.д. Если вам нужен ArrayList с заданными элементами, используйте
new ArrayList<>(Arrays.asList("your", "elements"))
.
Ответ №1:
Это не инициализация в виде двойной фигурной скобки. Это оператор block. Из документов:
Блок представляет собой группу из нуля или более операторов между сбалансированными фигурными скобками и может использоваться везде, где разрешен один оператор.
Оператор block заключает операторы внутри него в другую область видимости. Итак, если вы сделали:
public static int foo() {
{
int foo = 0;
}
return foo;
}
foo
не будет находиться в области видимости в строке return foo;
, и вы получите сообщение об ошибке
В вашем коде эти вложенные блоки не имеют значения, поскольку вы просто печатаете, но каждый блок будет иметь разную область видимости
Комментарии:
1. Спасибо. @gblodgett. Но все еще не понял, почему это существует. Когда этот блок кода может быть полезен?
2. @demdem Если вы подумаете об этом,
if
операторы,while
циклы,for
циклы и т.д., Все выполняют оператор или блок . Обычно блок используется в паре с этими конструкциями, но законно использовать их без