среда, 30 октября 2019 г.

Вложенные (Nested) Статические классы

Объект статического класса не хранит ссылку на конкретный экземпляр внешнего класса.

Объект статического вложенного класса вполне может существовать сам по себе.

Единственный момент — при создании такого объекта нужно указывать название внешнего класса:
Boeing737.Drawing drawing = new Boeing737.Drawing();

Статический вложенный класс может обращаться только к статическим полям внешнего класса.

При этом неважно, какой модификатор доступа имеет статическая переменная во внешнем классе. Даже если это private, доступ из статического вложенного класса все равно будет.

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

Объект внутреннего класса не может существовать без объекта «внешнего» класса.

У объекта внутреннего класса есть доступ к переменным «внешнего» класса. Даже с модификатором — private

Внутренний класс не может содержать статические переменные и методы.

При создании объекта внутреннего класса важную роль играет его модификатор доступа.
- Если внутренний класс объявлен как public, мы можем создавать его объекты в любом другом классе. Единственное требование — объект «внешнего» класса тоже обязательно должен существовать.
- Если же мы объявим внутренний класс как private, доступ к созданию объектов у нас будет только внутри «внешнего» класса.

Bicycle bicycle = new Bicycle("Toyota", 30,52);
Bicycle.SteeringWheel wheel = bicycle.new SteeringWheel();
Bicycle.Seat seat = bicycle.new Seat();

Functional interface

Функциональный интерфейс - это интерфейс у которого только один абстрактный метод.

Функциональный интерфейс используется в лямбда выражениях.

Пример функционального интерфейса интерфейс Runnable
@FunctionalInterface
public interface Runnable {
public abstract void run();
}

Number notation

int million2 = 1_000_000;

You can add underscores anywhere except at the beginning of a literal, the end of a literal, right before a decimal point, or right after a decimal point.


Let’s look at a few examples:

double notAtStart = _1000.00; // DOES NOT COMPILE

double notAtEnd = 1000.00_; // DOES NOT COMPILE

double notByDecimal = 1000_.00; // DOES NOT COMPILE

double annoyingButLegal = 1_00_0.0_0; // this one compiles

Constructor

The purpose of a constructor is to initialize fields.
The constructor runs after all fields and instance initializer blocks have run.

public static void main(String[] args)

In practice, you can write String[] args, String args[] or String... args; the compiler accepts any of these.

Multiple classes in one class file

You can even put two classes in the same file. When you do so, at most one of the classes in the fi le is allowed to be public.