Вначале вспомним что такое локальный класс. Это класс, описанный в блоке кода, то есть, по-простому — между кавычек {}. Наиболее часто эти кавычки являются телом метода. Но могут они быть и просто блоком, статическим блоком, телом if-ов, циклов и т.д.
Локальный класс наделён особенностями внутренних классов, но имеет отличительные черты, а именно:
1)он имеет доступ только к финальным полям и аргументам обрамляющего метода, а также ко всем полям обрамляющего класса, в том числе приватным и статическим;
2)локальный класс виден и может создаваться только в блоке, в котором описан;
3)у локального класса не ставиться модификатор доступа;
4)не может иметь статических полей, методов, классов (за исключением финальных);
5)локальный класс, объявленный в статическом блоке может обращаться только к статическим полям внешнего класса.
public class TestLocalClass { int x = 1; static int y = 2; final int z = 3; public void someMethod(int a, final double b){ int c = 0; final int d = 100; class LocalClass{ static final int stat = 10; // static int stat = 10; Ошибка компиляции public LocalClass() { // System.out.println(a); Ошибка компиляции System.out.println(b); // System.out.println(c); Ошибка компиляции System.out.println(x); System.out.println(y); System.out.println(z); System.out.println(d); } } new LocalClass(); } public static void main(String[] args) { new TestLocalClass().someMethod(10,20); } } Вывод: 20.0 1 2 3 100
Но! Начиная с Java8 мы можем обращаться в локальных классах к не финальным локальным переменным, если они не были изменены до момента инициализации класса. Также теперь стало возможным обращение к не финальным параметрам метода.
public class TestLocalClassJava8 { private static void someMethod(String s1, String s2){ int finalInt = 100; //<-Локальная переменная class LocalClass{ public LocalClass() { System.out.println(finalInt); //<-Обращение в локальном классе к локальной переменной System.out.println(s1+s2); } } new LocalClass(); } public static void main(String[] args) { someMethod("Java", "Way"); } }
«// System.out.println(a); Ошибка компиляции
// System.out.println(c); Ошибка компиляции»
зачем путать людей? нет там ошибки компиляции. Вывод будет:
10
20.0
0
1
2
3
100