Drip Java Lecture 3
Drip Java Lecture 3
Денис Син
План лекции
Классы и объекты
Конструкторы и методы
Overriding overloading
Модификаторы доступа
2
Все есть класс
Любые данные хранятся в полях некоторого класса
3
Структура класса
4
Определение класса
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)
• Имя метода
8
Виды методов
Методы экземпляра: вызываются на объектах класса
9
Метод экземпляра
// Конструктор
public Car(String model) {
[Link] = model;
[Link] = 0;
}
10
Использование методов
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
Объект передается по ссылке
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
А где деструктор
17
Конструкторы
Конструкторы могут быть перегружены, т.е. класс может иметь несколько конструкторов с разными
параметрами
18
Инициализация полей
Если поля не инициализировались они заполняются значениями по умолчанию
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 Rectangle() {
this(1, 1); // Вызов конструктора с двумя параметрами
}
22
this передача текущего объекта
23
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 - доступ из любого места
29
Типы модификаторов
30
Модификаторы доступа
public class Example {
public int publicField = 1;
protected int protectedField = 2;
int defaultField = 3;
private int privateField = 4;
void defaultMethod() {
[Link]("Default method");
}
31
Файлы с исходным кодом и классы
В одном .java файле может быть один публичный класс, названный так же, как и .java-файл (public class
Foo в файле [Link]
32
Статические поля
Статические поля принадлежат классу, а не объекту
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;
...
}
38
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);
41
Наследование
42
Переопределение методов overriding
class Employee {
private int salary;
public int getSalary() {
return salary;
}
public int getTotalPayout(){
return getSalary();
}
}
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 Класс Метод
46
Final public final class FinalClass {
public final void finalMethod() {
• Все методы final класса неявно становятся final // Реализация, которую нельзя изменить
• Метод final доступен для вызова в подклассах, но не }
может быть переопределен }
47
Sealed типы (Java 15+)
48
Вложенные классы
class Outer {
int field = 42;
class Inner {
public void show() {
//есть доступ к состоянию внешнего класса!
[Link](field);
//печатает 42
}
}
void initInner(){
//инициализация вложенного класса внутри
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
В этом классе определены важные методы: equals, hashCode, toString и много других
53
equals() и equals hashCode
hashCode()
• boolean equals(Object other) • int hashCode() возвращает целое
возвращает true т. и т. т., когда значение, которое обязано
внутреннее состояние совпадает совпадать для объектов с
одинаковым внутренним
состоянием
54
Контракт equals
Рефлексивность: ∀𝑥≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(𝑥))
∀𝑥≠null (𝑥.𝑒𝑞𝑢𝑎𝑙𝑠(null)=false)
55
Контракт hashCode
Консистентность: если объект не изменялся, повторный вызов hashCode должен возвращать одно и то же
значение (но не обязательно одно и то же между разными запусками приложения)
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
63
Пример иммутабельного класса
public final class ImmutablePerson {
private final String name;
private final int age;
65
Всем больше Java