Class

Проработать:

  1. Классы, виды вложенных классов с примерами

Основные разделы

Виды классов

О классах

Class

Class - обычный класс для создания объектов.

Абстрактный класс(Abstract Class)

Абстрактный класс(Abstract Class) - Для описания того из чего нельзя создать объект(например мебель). Могут иметь абстракт методы и реализации. Наследование возможно только от одного класса.

Record(since v.14)

Record - immutable класс для хранения записей.

record Point(int x, int y) { }
        

Описание

Можно описывать конструктор вручную

public Person(String name) {
    this(name, "Unknown");
}
        

Внутренние классы

Примечание - при создании нескольких классов в одном файле. С доступом public может быть только один. Тот который соответствует имени файла. Или ошибка компиляции.

Nested Inner classes(вложенные внутренние классы)

Создание объекта: Outer.Inner inner = new Outer().new Inner();

Static Nested classes or Member of outer class (статические вложенные классы)

Anonymous Inner classes (анонимные классы)

interface AnimalActions {
    void eat();
}

AnimalActions animal = new AnimalActions() {
    @Override
    public void eat() {
        System.out.println("Animal %s eating...");
    }

};
animal.eat();
        

Method Local Inner classes (внутренние классы в локальном методе)

Интерфейс(Interface)

Интерфейс(Interface) - специальный класс-контракт для добавления функционала в другие классы.

Enum(Перечисления)

Enum(перечисление) - это набор логически связанных констант именованных констант. Все константы пишутся большими буквами.

Возможности:

  1. Может иметь конструктор(только private).
  2. Может иметь методы, в том числе скрытые и абстрактные.
  3. Может переопределять общий метод описанный в Enum в отдельных константах.
  4. Может реализовывать интерфейс.
  5. Можно использовать в операторе switch.

Методы

  1. values() - возвращает массив, содержащий список всех констант перечисления.
  2. valueOf() - возвращает константу перечисления, значение которой передается строкой при вызове.
  3. equals() - сравнивает эквивалентность.

Примеры

Пример создания простого Enum

enum Cat {
    LEOPARD, PUMA, LION, TIGER, MANUL
}
        

Пример использования

Cat a = Cat.PUMA;
        

Пример создания Enum c полем и переопределенным методом в отдельной константе

enum SideOfWorld {
    NORTH("up") {
        void findTheBoss() {
            System.out.println("Santa is here!");
        }
    },
    SOUTH("down"),
    EAST("left"),
    WEST("right");

    private String direction;

    SideOfWorld(String direction) {
        this.direction = direction;
    }

    public String getDirection() {
        return direction;
    }

    void findTheBoss() {
        System.out.println("There is nobody!");
    }
        

Пример использования

SideOfWorld sow = SideOfWorld.NORTH;
SideOfWorld sow1 = SideOfWorld.SOUTH;
sow.findTheBoss();
sow1.findTheBoss();
        

Части класса

  1. Импорты
  2. Аннотации
  3. Поля
  4. Методы
  5. Конструкторы
  6. Объекты
  7. Блок инициализации - блок кода внутри класса, который выполняется каждый раз при создании нового экземпляра класса. Используется для инициализации нестатических переменных. В них можно вызывать методы.
  8. Статический Блок инициализации - - отличается словом static. Используется для инициализации статических переменных. В них можно выполнять методы.
  9. Внутренние классы.

Порядок инициализации класса

  1. Статические блоки и статические поля в порядке объявления суперкласса(А)
  2. Статические блоки и статические поля в порядке объявления подкласса(В)
  3. Не статические блоки и не статические поля в порядке объявления суперкласса(А)
  4. Конструктор суперкласса(А)
  5. Не статические блоки и не статические поля в порядке объявления подкласса(B)
  6. Конструктор подкласса(B)

Пример

  1. static field parent
  2. static { } parent
  3. static field child
  4. static { } сhild
  5. non static field parent
  6. non static { } parent
  7. constructor parent
  8. non static field child
  9. non static { } child
  10. constructor child

Sealed классы/интерфейсы

Модификатор final в классе не позволяет никому расширить его. Ключевое слово sealed позволяет расширить класс, но разрешить это только для указанных классов.

public sealed class Vehicle permits Bicycle, Car {...}
//and use it
public final class Bicycle extends Vehicle {...}
        

Ограничения

  1. Разрешенные подклассы должны быть доступны запечатанному классу во время компиляции.
  2. Разрешенные подклассы должны напрямую расширять запечатанный класс
  3. Разрешенные подклассы должны иметь один из следующих модификаторов:final, sealed, non-sealed
  4. Разрешенные подклассы должны находиться в одном Java модуле.