Если переменная объявлена в теле класса и является static - значит это переменная класса
Если переменная объявлена в теле класса и не является static - то это переменная объекта класса
Если переменная объявлена в теле метода - то это локальная переменная
Теперь вопрос:
Как называется переменная которая находится в {} и как называется переменная в static{}? Оба, в смысле {} и static{} находятся в теле класса.
Вот, к примеру:
abstract class AnyName{
{int k;}
static{int k;}
}
Дополнительно: не разрешается объявлять переменные в таких скобках ключевым словом static.
Во-первых, неинициализированные переменные компилятор просто выкинет из результирующего модуля. Поэтому стоит как минимум присвоить им хоть какие-то значения.
public class Example {
static { int a = 1; }
{ int b = 2; }
public static void main(String[] args) { }
}
Во-вторых, все инструкции из нестатического блока инициализации будут просто перенесены в конструктор по умолчанию, а инструкции из статического блока инициализации будут перенесены в специальный метод <clinit>. Так что переменная a станет локальной переменной конструктора по умолчанию, а переменная b локальной переменной метода <clinit>.
public class Example {
public Example(); // Конструктор по умолчанию
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: iconst_2
5: istore_1 // Переменная b
6: return
public static void main(java.lang.String[]);
Code:
0: return
static {}; // Статический инициализатор
Code:
0: iconst_1
1: istore_0 // Переменная a
2: return
}