undefined

Локальные классы — классы внутри методов

Java Multithreading
4 уровень , 5 лекция
Открыта
Локальные классы — классы внутри методов - 1

— Привет, Амиго!

Еще одна небольшая тема – это локальные классы.

Как ты уже видел, классы можно создавать не только в отдельных файлах, но и внутри других классов. Так вот, это еще не все. Классы можно создавать и внутри методов. Такие классы называются локальными. Они работают как обычные внутренние классы, но их можно использовать в пределах того метода, где их объявили.

Внимание на экран:

Пример
class Car {

public ArrayList<Car> createPoliceCars(int count) {

    ArrayList<Car> result = new ArrayList<Car>();

    class PoliceCar extends Car {

    int policeNumber;
    PoliceCar(int policeNumber) {

    this.policeNumber = policeNumber;
    }

    }

    for(int i=0; i<count; i++)
    result.add(new PoliceCar(i));
    return result;
}
}

— А зачем такие классы нужны?

Класс внутри метода, да еще с методами и конструкторами – это очень плохо читаемый код, разве не так?

— Именно так. Ты абсолютно прав.

В методах также можно использовать анонимные внутренние классы. Но есть одно маленькое преимущество у таких классов, из-за чего их довольно-таки часто используют внутри методов.

Класс, объявленный внутри метода, может использовать локальные переменные этого метода:

class Car {

public ArrayList<Car> createPoliceCars(int count) {

    ArrayList<Car> result = new ArrayList<Car>();

    for(int i=0; i<count; i++) {

    final int number = i;
    result.add(new Car() {

    int policeNumber = number;
    });

    }
    return result;
 }
}

Но есть одно ограничение – переменные можно только «читать», изменять их нельзя.

Поэтому классы, объявленные внутри метода, могут иметь доступ только к тем переменным метода, которые помечены ключевым словом final. В примере выше ты можешь видеть, что я не могу сразу присвоить переменной policeNumber значение переменной i, а сначала сохраняю его в final-переменную number.

— То, что можно использовать переменные метода – это действительно классная штука. Надеюсь, я оценю ее по достоинству. Плохо только, что нельзя менять переменные.

— Почему их нельзя менять, тебе сегодня расскажет Элли, а я пойду пока часок вздремну.

— Спокойной ночи, Ким. Спасибо за интересный урок.

Комментарии (84)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Darth Nihilus 26 уровень, Казань
11 мая 2021

Класс внутри метода, да еще с методами и конструкторами – это очень плохо читаемый код, разве не так?

— Именно так. Ты абсолютно прав. (НО ТЫ ВСЕ РАВНО БУДЕШЬ ТАК ПИСАТЬ)
Альфир Нуркаев 28 уровень, Пермь
13 марта 2021
Вся моя логика разрушена(
Виталий 26 уровень, Санкт-Петербург
27 февраля 2021
В первом примере на 20 строке скобка должна быть синей вроде бы
Sasha Motorin 35 уровень, Кострома
27 февраля 2021
забавно что в лекции в конце прошлого уровня говорили, что так было только до Java 8. Зачем запутывать? (про final переменные)
Herr Ives 30 уровень
22 февраля 2021
Внимание на экран: пара-па-па пара-па па ра пааа пара-пара-паааа пара-па пара-па параааааа Что? Где? Когда? Когда выносят чёрный ящик
Alena 26 уровень, Halifax
9 февраля 2021
"Начиная с Java 8 локальный класс имеет доступ не только к final-локальным переменным и параметрам, но и к effective-final. Effective-final называют переменную, значение которой не менялось после инициализации."
Regina Kazan 35 уровень, Казань
15 января 2021
блин, а картинка опять смешная.
Valua Sinicyn 41 уровень, Харьков
3 января 2021
Кто нибудь может вывести примеры выше в консоль для наглядности ?
Pig Man 41 уровень
4 декабря 2020
Ну и зачем нам эти полицейские машины, если мы все равно вернем их как обычные машины? У PoliceCar есть поле policeNumber, замечательно, вот только у Car его нет. После возвращения списка этих PoliceCar, мы один фиг достать значение поля policeNumber не сможем. Сузить их потом до класса PoliceCar? Отличная идея, только у нас нет класса PoliceCar, он локальный и никто вне метода не знает о его существовании. Снова использовать потом анонимный класс? Уже идиотизм получается. Бесполезные примеры, которые, видимо, направлены на то, чтобы не шокировать нас сложной информацией, но в результате лишь приводят в недоумении, зачем это нужно и как можно использовать. Кину ниже нормальный пример и пояснение
Алексей Мирный 41 уровень, Москва
20 ноября 2020
Синяя фигурная скобка закрылась красной, наверное это для улучшения читаемости... upd Белая круглая скобка закрылась синей, это видимо тоже для улучшения читаемости))