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

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

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.

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

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

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

Комментарии (126)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
ProphetName Уровень 38
12 ноября 2024
Ты раньше сказать не могла? Пойду вздремну? А до этого ты была настолько занята, что таже не могла пять минут выделить для простого упоминания? Вот это логика! Впрочем, как и всегда. На предыдущей лекции во время выполнения первой задачи мы уже поняли что такое локальный класс.Теперь данная лекция просто закрепление информации путём повторения. Во время всего обучения на JavaRush я чувствую себя Сельвой из песни "Сельва" Сергея Курехина и Владимира Болучевского 1983 г. "Твоя строил башня слоновой кости, Твоя улыбчив, как юный Бог. Твоя не слушал советов сбоку, И вот твоя башня упал... Упал, упал. Прямо на песок. Слишком влажный песок наша Сельва, А ты не знал. Потому что не слушал советов. Амигос. ............................................." Где "Твоя не слушал советов с боку" - не пользовался гуглом и решал всё напролом.
JavaRusher853 Уровень 2
9 ноября 2024
Но и это еще не все! Классы также можно создавать в арифметических выражениях, и даже в условном операторе!)))
JavaRusher853 Уровень 2
9 ноября 2024
https://proglang.su/java/inner-classes/ Я просто не смог найти сайт лучше для того, чтобы понять все эти внутренние, вложенные, локальные, анонимные классы и прочую бесовщину.
Aspect Уровень 42
12 июня 2024

ArrayList&ltCar> result = new ArrayList&ltCar>();
Что это такое? Как это понимать? В первый раз вижу такую конструкцию
13 июня 2024
Коряво напечатали, должно быть ArrayList<Car>
Long_byte Уровень 14
26 мая 2024
как я понял метод createPoliceCars просто возвращает список наследников класса Car? первом примере показали явно создали внутренний локальный класс во втором примере с использованием анонимного класса?
ryukzakk Уровень 35
1 марта 2024
А где локальные классы хранят информацию о локальных переменных? Вот пример:

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
А, это дальше по лекциям 😅
29 ноября 2023
Норм отпетлял: — А зачем такие классы нужны? Класс внутри метода, да еще с методами и конструкторами – это очень плохо читаемый код, разве не так? — Именно так. Ты абсолютно прав.
Skotique Уровень 35
12 октября 2023
наверняка это гумно преподают не для того, чтобы мы его использовали, а для того, чтобы могли распознать
Dmitriy Уровень 41
27 июля 2023
Rolik Уровень 41
15 апреля 2023
За создание классов внутри методов нужно бить палкой по рукам. Когда пишите код, думайте о человеке который будет его поддерживать.