0% нашли этот документ полезным (0 голосов)
5 просмотров66 страниц

Drip Java Lecture 3

Загружено:

a.sidnevart
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd
0% нашли этот документ полезным (0 голосов)
5 просмотров66 страниц

Drip Java Lecture 3

Загружено:

a.sidnevart
Авторское право
© All Rights Reserved
Мы серьезно относимся к защите прав на контент. Если вы подозреваете, что это ваш контент, заявите об этом здесь.
Доступные форматы
Скачать в формате PDF, TXT или читать онлайн в Scribd

Java Лекция 3

Объектно ориентированной программирование Java

Денис Син
План лекции

Классы и объекты

Конструкторы и методы

Overriding overloading

Интерфейсы и абстрактные классы

Класс Object. equals & hashCode

Модификаторы доступа

Вложенные классы. Pattern matching.


Lombok

2
Все есть класс
Любые данные хранятся в полях некоторого класса

Любой код – метод некоторого класса

Любые типы данных кроме примитивов – наследники класса Object

3
Структура класса

4
Определение класса

public class Person {


long id;
String firstName;
String lastName;

public Person(long id, String firstName, String lastName) {


[Link] = id;
[Link] = firstName;
[Link] = lastName;
}

String fullName() {
return firstName + " " + lastName;
}
}

5
Объект (Object) class Person {
long id;
• Объект – область фиксированного размера в куче, String firstName, lastName;
обладающий фикс. Структурой }
• Значение переменной – ссылка на объект в куче
• Доступ к объекту в обход его структуры запрещен Person p = new Person();
• Объект любого типа также является объектом
[Link]

6
Отличие объекта от класса

7
Методы public static int sum(int a, int b) {
return a + b;
• Метод в Java - это блок кода, выполняющий }
определенную задачу.
• Основные компоненты метода: int result = sum(5, 3);
[Link](result); // Выведет 8
• Модификаторы доступа (например, public,
private)

• Тип возвращаемого значения (или void, если


метод ничего не возвращает)

• Имя метода

• Список параметров (может быть пустым)


• Тело метода

8
Виды методов
Методы экземпляра: вызываются на объектах класса

Статические методы: принадлежат классу и вызываются без создания объекта

Конструкторы: специальные методы для инициализации объектов

9
Метод экземпляра

public class Car {


private String model;
private int speed;

// Конструктор
public Car(String model) {
[Link] = model;
[Link] = 0;
}

// Метод экземпляра для увеличения скорости


public void accelerate(int increment) {
[Link] += increment;
[Link](model + " ускоряется до " + speed + " км/ч");
}
}

10
Использование методов

public class Main {


public static void main(String[] args) {
Car myCar = new Car("Toyota");
[Link](50);
[Link](30);
[Link]("Текущая скорость: " + [Link]() + " км/ч");
[Link](20);
}
}

11
Создание объектов public static void main(String[] args) {
Person p1 = new Person(1, "John", "Doe");
• Объекты создаются с помощью оператора new Person p2 = new Person(2, "Alex", "View");
• Для создания объекта необходимо вызвать
конструктор класса [Link]([Link]());
[Link]([Link]());
}

12
Объект передается по ссылке

public class Employee {


int age = 18;

public static void main(String[] args) {


Employee e = new Employee();
int a = 1;
foo(e, a);
[Link]("%d - %d", [Link], a);
//prints 42 - 1
}

static void foo(Employee e, int a) {


//e passed by reference, a passed by value
[Link] = 42;
a = 5;
}
}
13
Конструктор public class Car {
String model;
• Специальный метод, который автоматически int maxSpeed;
вызывается при создании нового объекта класса
• Имеет тоже название что и класс public Car(String model, int maxSpeed) {
• Не имеет возвращаемого типа [Link] = model;
• Используется для инициализации полей объекта [Link] = maxSpeed;
}
}

14
Типы конструкторов

По умолчанию С параметрами Копирования


Создает новый объект как копию
• Создается автоматически, если • Позволяет инициализировать
не определен другой существующего
объект с заданными значениями
конструктор Принимает объект того же класса в
• Может иметь один или
• Не имеет параметров качестве параметра
несколько параметров

15
Типы конструкторов public class Car {
String model;
int maxSpeed;

// Конструктор по умолчанию
public Car() {
// Пустое тело конструктора
}

// Конструктор с параметрами
public Car(String model, int maxSpeed) {
[Link] = model;
[Link] = maxSpeed;
}

// Конструктор копирования
public Car(Car car) {
model = [Link];
maxSpeed = [Link];
}
}

16
А где деструктор

Деструктора в Java нет!!!

Там же Garbage collector

17
Конструкторы
Конструкторы могут быть перегружены, т.е. класс может иметь несколько конструкторов с разными
параметрами

Инициализирует поля объекта при его создании

Выполняет необходимые операций перед использованием объекта

18
Инициализация полей
Если поля не инициализировались они заполняются значениями по умолчанию

Можно инициализировать поля в момент объявления int a = 64; int l = 23;

Поля класса можно инициализировать из конструктора

19
Значения по public class Car {
String model = "default";
умолчанию int maxSpeed = 10;

// Конструктор по умолчанию
public Car() {
// Пустое тело конструктора
}

// Конструктор с параметрами
public Car(String model, int maxSpeed) {
[Link] = model;
[Link] = maxSpeed;
}

// Конструктор копирования
public Car(Car car) {
model = [Link];
maxSpeed = [Link];
}
}

20
this public class Person {
private String name;
• this используется внутри метода или конструктора private int age;
для ссылки на текущий объект класса.
• Применяется для устранения неоднозначности public Person(String name, int age) {
между параметрами метода и полями класса: [Link] = name; // [Link] ссылается на поле
класса
[Link] = age; // [Link] ссылается на поле
класса
}
}

21
this вызов других конструкторов

public class Rectangle {


private int width, height;

public Rectangle() {
this(1, 1); // Вызов конструктора с двумя параметрами
}

public Rectangle(int width, int height) {


[Link] = width;
[Link] = height;
}
}

22
this передача текущего объекта

public class Button {


public void setClickListener(ClickListener listener) {
[Link](this); // Передача текущего объекта Button
}
}

23
this возврат текущего объекта

public class StringBuilder {


public StringBuilder append(String str) {
// логика добавления строки
return this; // Возврат текущего объекта
}
}

24
Блок инициализации public class Example {
private int instanceField;
• Используется для инициализации нестатических
полей объекта {
• Выполняется каждый раз при создании нового instanceField = 42;
экземпляра класса [Link]("Блок инициализации
• Выполняются блоки инициализации (в порядке их выполнен");
объявления в классе) }
• Затем вызывается конструктор
public Example() {
[Link]("Конструктор вызван");
}
}

25
Блок инициализации class ComplexObject {
private String[] data;
• Инициализация полей объекта сложной логикой
• Выполнение общей инициализации для всех {
конструкторов data = new String[10];
for (int i = 0; i < [Link]; i++) {
data[i] = "Item " + i;
}
}
}

26
Пакеты в java Определение и назначение Структура пакетов

package [Link];
• Предотвращают конфликты имен • Пакеты организованы в
• Обеспечивают контроль доступа иерархическую структуру
• Упрощают поиск и использование • Соответствуют структуре каталогов
связанных классов в файловой системе
• Используют точку как разделитель
уровней иерархии

27
Типы и Встроенные пакеты Пользовательские пакеты
использоание
• [Link]: базовые классы языка • Создаются разработчиками для
import [Link]; // или
(автоматически импортируется) организации собственного кода
import [Link].*;
• [Link]: утилитарные классы и • Помогают структурировать
коллекции большие проекты
• [Link]: классы для ввода-вывода

28
Типы модификаторов
public - доступ из любого места

protected – доступ из классов наследников

default (package-private) – доступ из того же пакета

private – доступ из того же класса

29
Типы модификаторов

30
Модификаторы доступа
public class Example {
public int publicField = 1;
protected int protectedField = 2;
int defaultField = 3;
private int privateField = 4;

public void publicMethod() {


[Link]("Public method");
}

protected void protectedMethod() {


[Link]("Protected method");
}

void defaultMethod() {
[Link]("Default method");
}

private void privateMethod() {


[Link]("Private method");
}
}

31
Файлы с исходным кодом и классы
В одном .java файле может быть один публичный класс, названный так же, как и .java-файл (public class
Foo в файле [Link]

Может быть сколько угодно package-private-классов, но это скорее плохая практика.

32
Статические поля
Статические поля принадлежат классу, а не объекту

Объявляются с ключевым словом static

Существует только одна копия для всего класса

Инициализируются при загрузке класса, до создания объектов

33
Static поля public class Car {
public static int count = 0;
• Доступ через имя класса: [Link]
• Общее состояние для всех объектов класса public Car() {
• Применяются для хранения конфигурации и констан count++; // Увеличиваем счетчик при создании
объекта
}
}

// Использование
[Link]([Link]); // Доступ без создания
объекта

34
Зачем могут понадобится static поля
Экономия памяти: одна копия данных для всех объектов

Могут использоваться в статических методах

Инициализируются значениями по умолчанию, если не заданы явно

Полезны для хранения общих настроек или глобальных параметров приложения

35
Static поля хранятся в metaspace c java8

36
Static поля хранятся в metaspace c java8

37
Константы public class Math {
...
• Выделяем память один раз public static final double PI =
3.14159265358979323846;
...
}

[Link] // возвращает 3.14...

38
Static методы
Методы, принадлежащие классу, а не объекту

Ключевое слово: Объявляются с использованием модификатора static

Могут быть вызваны без создания экземпляра класса

Имеют доступ только к статическим членам класса

Не могут быть переопределены в подклассах

39
Использование public class MathUtils {
public static int add(int a, int b) {
• Утилитарные функции: Часто используются для return a + b;
вспомогательных операций }
• Фабричные методы: Применяются для создания
объектов класса public static double PI = 3.14159;
• Работа с константами: Методы для манипуляции
статическими полями public static double calculateCircleArea(double radius) {
return PI * radius * radius;
}
}

// Использование
int sum = [Link](5, 3);
double area = [Link](2.5);

40
Наследование // construct a Manager object
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12,
15);
[Link](5000);
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

for (Employee e : staff) {


[Link]("name=" + [Link]() + ",salary=" +
[Link]())
}

41
Наследование

// construct a Manager object


Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);
[Link](5000);
Employee[] staff = new Employee[3];
staff[0] = boss;
staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);
staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);

for (Employee e : staff) {


[Link]("name=" + [Link]() + ",salary=" + [Link]())
}

42
Переопределение методов overriding

class Employee {
private int salary;
public int getSalary() {
return salary;
}
public int getTotalPayout(){
return getSalary();
}
}

class Manager extends Employee {


private int bonus;
@Override //не обязательная, но крайне желательная штука
public int getTotalPayout() {
return getSalary() + bonus;
}
}

43
Перегрузка методов overloading

class Calculator {
int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }
int sum(int a, int b, int c) { return a + b + c; }
}

44
Использование super class Manager extends Employee {
private int bonus;
• В отличие от this, super не указывает ни на какой @Override
объект (и его нельзя никуда передать). Это лишь public int getTotalPayout() {
указание компилятору вызвать метод суперкласса. return [Link]() + bonus;
}
}

45
Final Класс Метод

• Запрещает наследование от этого • Запрещает переопределение


import [Link]; // или
класса метода в подклассах
import [Link].*;
• Используется для создания • Гарантирует сохранение
неизменяемых классов (например, изначальной реализации
String)

46
Final public final class FinalClass {
public final void finalMethod() {
• Все методы final класса неявно становятся final // Реализация, которую нельзя изменить
• Метод final доступен для вызова в подклассах, но не }
может быть переопределен }

// Следующий код вызовет ошибку компиляции:


// class SubClass extends FinalClass {}

47
Sealed типы (Java 15+)

public sealed class Pet


permits
//никакие другие не могут наследоваться от него
Cat, Dog, Fish {
}

public final Cat {...}

public sealed Dog permits Hound, Terrier, Toy {...}

public non-sealed Fish {...}

48
Вложенные классы

class Outer {
int field = 42;
class Inner {
public void show() {
//есть доступ к состоянию внешнего класса!
[Link](field);
//печатает 42
}
}
void initInner(){
//инициализация вложенного класса внутри
new Inner();
}
}

//инициализация вложенного класса извне


[Link] in = new Outer().new Inner();

49
Вложенные классы

class Outer {
int field = 42;
class Inner {
//поле вложенного класса перекрывает поле внешнего класса
int field = 18;
public void show() {
[Link](field);
//печатает 18
}
}
}

50
Вложенные классы

class Outer {
int field = 42;
class Inner {
//поле вложенного класса перекрывает поле внешнего класса
int field = 18;
public void show() {
[Link]([Link]);
//печатает 42!
}
}
}

51
Локальные вложенные классы

class Outer {
void outerMethod() {
//final (или effectively final) тут существенно
final int x = 98;
[Link]("inside outerMethod");
class Inner {
void innerMethod() {
[Link]("x = " + x);
}
}
Inner y = new Inner();
[Link]();
}
}

52
Класс Object
Любой класс в Java является наследником Object

Писать class Employee extends Object не надо

В этом классе определены важные методы: equals, hashCode, toString и много других

53
equals() и equals hashCode
hashCode()
• boolean equals(Object other) • int hashCode() возвращает целое
возвращает true т. и т. т., когда значение, которое обязано
внутреннее состояние совпадает совпадать для объектов с
одинаковым внутренним
состоянием

54
Контракт equals
Рефлексивность: ∀𝑥≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑥))

Симметричность: ∀𝑥≠null∀𝑦≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑦)⟺𝑦.𝑒𝑞𝑢𝑎𝑙𝑠(𝑥))

Транзитивность: ∀𝑥≠null ∀𝑦≠null ∀𝑧≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑦)&𝑦.𝑒𝑞𝑢𝑎𝑙𝑠(𝑧)⇒𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑧))

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


возвращать одно и то же значение.

∀𝑥≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(null)=false)

55
Контракт hashCode
Консистентность: если объект не изменялся, повторный вызов hashCode должен возвращать одно и то же
значение (но не обязательно одно и то же между разными запусками приложения)

Связь с equals: ∀𝑥∀𝑦(𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑦)⇒𝑥.ℎ𝑎𝑠ℎ𝐶𝑜𝑑𝑒()=𝑦.ℎ𝑎𝑠ℎ𝐶𝑜𝑑𝑒())

𝑥.ℎ𝑎𝑠ℎ𝐶𝑜𝑑𝑒()=𝑦.ℎ𝑎𝑠ℎ𝐶𝑜𝑑𝑒()⇒𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑦) и не обязательно, но желательно для большинства случаев.

56
На практике генерируется в IDE

57
Генерация equals и hashCode
public class Person {
private String name;
private int age;
@Override
public boolean equals(Object o) {
// никогда, НИКОГДА не пишите это сами
if (this == o) return true;
if (o == null || getClass() != [Link]()) return false;
Person person = (Person) o;
return age == [Link] &&
[Link](name, [Link]);
}

@Override
public int hashCode() {
return [Link](name, age);
}
}

58
Чаще всего используют lombok
import [Link];

@EqualsAndHashCode
public class Person {
private int age;
private String name;
}

59
Метод toString
public class Person {
private String name;
private int age;
...
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
...
Person person = . . .
[Link](person);

60
Lombok toString
import [Link];

@ToString
public class Person {
private int age;
private String name;
}

61
Иммутабельность
Объект, состояние которого не может быть изменено после создания

Очень удобно применять для потокобезопасности

62
Как сделать класс иммутабельным
Объявить класс final

Сделать все поля private final

Не предоставлять методы, изменяющие состояние объекта

Обеспечить полную инициализацию объекта через конструктор

63
Пример иммутабельного класса
public final class ImmutablePerson {
private final String name;
private final int age;

public ImmutablePerson(String name, int age) {


[Link] = name;
[Link] = age;
}

public String getName() {


return name;
}

public int getAge() {


return age;
}
}
64
Record в Java 14+ record Point(int x, int y) {
public double distance(Point other) {
• private final поля ...
• конструктор }
• доступ через x() и y() }
• equals, hashCode и toString
• невозможно наследование от класса и от рекорда, но
возможна реализация интерфейсов

65
Всем больше Java

Вам также может понравиться