Какие ограничения есть у локальных классов?

Вначале вспомним что такое локальный класс. Это класс, описанный в блоке кода, то есть, по-простому — между кавычек {}. Наиболее часто эти кавычки являются телом метода. Но могут они быть и просто блоком, статическим блоком, телом 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");
            }
        }

 

Понравилась статья? Поделиться с друзьями:

Комментарии:

Комментарии: 1
  1. вася

    «// System.out.println(a); Ошибка компиляции
    // System.out.println(c); Ошибка компиляции»
    зачем путать людей? нет там ошибки компиляции. Вывод будет:
    10
    20.0
    0
    1
    2
    3
    100

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: