JavaRush/Курсы/Java Multithreading/Локальные классы — классы внутри методов

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

Открыта
Локальные классы — классы внутри методов - 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.

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

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

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

Комментарии (126)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Марк Зенин
Уровень 48
25 июля, 13:22
Пример 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;
    }
}
Пример 2:
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;
    }
}
ProphetName
Уровень 38
12 ноября 2024, 10:35
Ты раньше сказать не могла? Пойду вздремну? А до этого ты была настолько занята, что таже не могла пять минут выделить для простого упоминания? Вот это логика! Впрочем, как и всегда. На предыдущей лекции во время выполнения первой задачи мы уже поняли что такое локальный класс.Теперь данная лекция просто закрепление информации путём повторения. Во время всего обучения на JavaRush я чувствую себя Сельвой из песни "Сельва" Сергея Курехина и Владимира Болучевского 1983 г. "Твоя строил башня слоновой кости, Твоя улыбчив, как юный Бог. Твоя не слушал советов сбоку, И вот твоя башня упал... Упал, упал. Прямо на песок. Слишком влажный песок наша Сельва, А ты не знал. Потому что не слушал советов. Амигос. ............................................." Где "Твоя не слушал советов с боку" - не пользовался гуглом и решал всё напролом.
JavaRusher853
Уровень 36
9 ноября 2024, 20:59
Но и это еще не все! Классы также можно создавать в арифметических выражениях, и даже в условном операторе!)))
Aspect Студент
12 июня 2024, 07:11
ArrayList&ltCar> result = new ArrayList&ltCar>();
Что это такое? Как это понимать? В первый раз вижу такую конструкцию
13 июня 2024, 20:39
Коряво напечатали, должно быть ArrayList<Car>
Long_byte
Уровень 60
26 мая 2024, 11:59
как я понял метод createPoliceCars просто возвращает список наследников класса Car? первом примере показали явно создали внутренний локальный класс во втором примере с использованием анонимного класса?
ryukzakk
Уровень 35
1 марта 2024, 11:05
А где локальные классы хранят информацию о локальных переменных? Вот пример:
public class Cat implements Pet {
    public Sayable toSayable(final int i) {
        class CatPet implements Sayable {
            @Override
            public String say() {
                return "" + i;
            }
        }
        return new CatPet();
    }
}
Код toSayable отработал, вернул экземпляр CatPet. И хотя ни Cat, ни CatPet не имеет полей, хранящих i, можно без проблем вызвать catPet.say(). В чём магия?
ryukzakk
Уровень 35
1 марта 2024, 12:02
А, это дальше по лекциям 😅
29 ноября 2023, 15:34
Норм отпетлял: — А зачем такие классы нужны? Класс внутри метода, да еще с методами и конструкторами – это очень плохо читаемый код, разве не так? — Именно так. Ты абсолютно прав.
Skotique
Уровень 35
12 октября 2023, 08:31
наверняка это гумно преподают не для того, чтобы мы его использовали, а для того, чтобы могли распознать
Dmitriy
Уровень 41
27 июля 2023, 06:52
Rolik
Уровень 41
15 апреля 2023, 03:59
За создание классов внутри методов нужно бить палкой по рукам. Когда пишите код, думайте о человеке который будет его поддерживать.