Объектно-ориентированные особенности языка Java
Объектно-ориентированное программирование
Абстракция
Инкапсуляция
Инкапсуляция
Модификаторы доступа
Пример ограничения доступа
Интерфейсы
Интерфейсы как API
Пример интерфейса
Реализация интерфейса
Использование интерфейса как типа
Изменение интерфейсов
Наследование
Наследование
Примеры наследования
Примеры наследования
Примеры наследования
Наследование
Методы класса Object
Типы объекта
Приведение типа объектов
Что можно делать в подклассах
Переопределение и сокрытие методов
private в суперклассе
private в суперклассе
Ключевое слова super
final классы и методы
Абстрактные методы и классы
Интерфейсы vs Абстрактные классы
Абстрактные классы
Включение объектов
Композиция
Композиция – пример
Композиция - пример
Агрегация
Агрегация – Пример
Агрегация - пример
Ассоциация
Ассоциация – пример
Ассоциация - пример
Полиморфизм
Вложенные классы
Статические вложенные классы
Внутренние классы
Анонимные классы
Перечисления (enum)
Перечисления могут содержать поля и методы
Пример использования enum
Перечисления (enum)
Перечисления (enum)
Аннотации
Предопределенные аннотации
851.27K
Категория: ПрограммированиеПрограммирование

Объектно-ориентированные особенности языка Java

1. Объектно-ориентированные особенности языка Java

Java for autotesters
www.epam.com
www.epam.com
EPAM
EPAM Systems
Systems

2. Объектно-ориентированное программирование

• ООП - методология программирования
– Программа представляется совокупностью
объектов
– Каждый объект - экземпляр класса
– Классы образуют иерархию наследования
• ООП использует в качестве базовых
элементов объекты, а не алгоритмы
www.epam.com
EPAM Systems
2

3. Абстракция

• Выделяйте только те
факторы, которые
нужны для решения
задачи
• Отсекайте все лишнее
www.epam.com
EPAM Systems
3

4. Инкапсуляция

• Сокрытие реализации объекта
• У объекта есть внутреннее состояние,
недоступное для изменения извне
• У объекта есть интерфейс, с помощью
которого с объектом могут
взаимодействовать внешние объекты
www.epam.com
EPAM Systems
4

5. Инкапсуляция

• Пользователь (прикладной
программист) не должен
менять внутреннее
состояние объекта – он не
знает, как это делается!!!
• Поля и методы делятся на
внутренние и
интерфейсные.
length
r
x, y
а
b
c
www.epam.com
EPAM Systems
5

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

public
protected
(по умолчанию)
private
www.epam.com
В классе
В пакете
+
+
+
+
+
+
+
-
В подклассах
+
+
-
Везде
+
EPAM Systems
6

7. Пример ограничения доступа

Point point = new Point();
point.setX(0.0);
Public методы
доступны
point.setY(1.0);
Ошибка!
point.x = 1.0; // Ошибка
System.out.println("(" + point.getX() + ", "
+ point.getY() + ")");
www.epam.com
EPAM Systems
7

8. Интерфейсы

• Интерфейс – это ссылочный тип,
аналогичный классу, в котором могут быть
только константы, сигнатуры методов и
вложенные типы
– Нельзя создать экземпляр
– Нет тел методов
– Можно только реализовать в классах или
расширить в других интерфейсах
www.epam.com
EPAM Systems
8

9. Интерфейсы как API

• API - Application Programming Interface
Интерфейс прикладного программирования
• API делается открытым, а его реализация
может хранится в секрете
• Реализация может пересматриваться, но она
должна по прежнему реализовывать
контракт, на который полагаются клиенты
www.epam.com
EPAM Systems
9

10. Пример интерфейса

Модификатор
доступа
Ключевое
слово
Имя
интерфейса
public
public interface
interface Relatable
Relatable {{
int
int isLargerThan(Relatable
isLargerThan(Relatable other);
other);
}}
Все методы
по умолчанию
public abstract
www.epam.com
Декларация метода
(Методов может
быть несколько)
EPAM Systems
10

11. Реализация интерфейса

public
public class
class Rectangle
Rectangle implements
implements Relatable
Relatable {{
private
private int
int width;
width;
private
private int
int height;
height;
public
public int
int
return
return
}}
getArea()
getArea() {{
width
width ** height;
height;
@Override
@Override
public
public int
int isLargerThan(Relatable
isLargerThan(Relatable other)
other) {{
Rectangle
Rectangle otherRect
otherRect == (Rectangle)
(Rectangle) other;
other;
return
return this.getArea()
this.getArea() -- otherRect.getArea();
otherRect.getArea();
}}
}}
www.epam.com
EPAM Systems
11

12. Использование интерфейса как типа

• Интерфейс определяет новый ссылочный
тип данных
• Переменная такого типа может ссылаться на
объект любого класса, реализующего
интерфейс
• Класс может реализовывать несколько
интерфейсов
www.epam.com
EPAM Systems
12

13. Изменение интерфейсов

• Есть интерфейс:
public
public interface
interface DoIt
DoIt {{
void
void doSomething(int
doSomething(int i,
i, double
double x);
x);
int
int doSomethingElse(String
doSomethingElse(String s);
s);
}}
• Нужно добавить еще один метод
• Не очень хорошее решение:
public
public interface
interface DoIt
DoIt {{
void
void doSomething(int
doSomething(int i,
i, double
double x);
x);
int
int doSomethingElse(String
doSomethingElse(String s);
s);
boolean
boolean didItWork(int
didItWork(int i,
i, double
double x,
x, String
String s);
s);
}}
• Более надежное решение – наследование интерфейсов:
public
public interface
interface DoItPlus
DoItPlus extends
extends DoIt
DoIt {{
boolean
boolean didItWork(int
didItWork(int i,
i, double
double x,
x, String
String s);
s);
}}
www.epam.com
EPAM Systems
13

14. Наследование

• Механизм получения нового класса на основе уже
существующего
– Существующий класс можно дополнять или изменять, и
получать новый класс
• Отношение IS-A («является»)
– Наследник ЯВЛЯЕТСЯ разновидностью родителя
• Существующий – суперкласс (базовый,
родительский)
• Новый – подкласс (производный, дочерний)
www.epam.com
EPAM Systems
14

15. Наследование

• Одиночное
– У класса есть только один предок
• Множественное
– У класса может быть несколько предков
– Java не поддерживает множественное
наследование
• В Java у класса может быть только один
суперкласс, но класс может реализовывать
несколько интерфейсов
www.epam.com
EPAM Systems
15

16. Примеры наследования

Фигура
Точка
Треугольник
Круг
Квадрат
Прямоугольник
www.epam.com
EPAM Systems
16

17. Примеры наследования

Животные
Млекопитающие
Кошки
Птицы
Рыбы
Собаки
www.epam.com
EPAM Systems
17

18. Примеры наследования

Транспортные средства
Сухопутные
Автомобили
Водные
Летающие
Поезда
www.epam.com
EPAM Systems
18

19. Наследование

• За исключением Object, у каждого класса есть один
непосредственный суперкласс
• Класс Object находится во главе иерархии
• Интерфейсы не являются частью иерархии классов
• Наследуются все компоненты с модификаторами public
и protected (поля, методы и вложенные классы)
• Конструкторы не наследуются подклассами, но могут быть
вызваны в подклассе
www.epam.com
EPAM Systems
19

20. Методы класса Object

public
public final
final native
native Class<?>
Class<?> getClass();
getClass();
public
public native
native int
int hashCode();
hashCode();
public
public boolean
boolean equals(Object
equals(Object obj)
obj)
protected
protected native
native Object
Object clone()
clone() throws
throws CloneNotSupportedException;
CloneNotSupportedException;
public
public String
String toString()
toString()
public
public
public
public
public
public
final
final native
native void
void notify();
notify();
final
final native
native void
void notifyAll();
notifyAll();
final
final native
native void
void wait(long
wait(long timeout)
timeout)
throws
throws InterruptedException;
InterruptedException;
public
public final
final void
void wait(long
wait(long timeout,
timeout, int
int nanos)
nanos)
throws
throws InterruptedException
InterruptedException
public
public final
final void
void wait()
wait() throws
throws InterruptedException
InterruptedException
protected
protected void
void finalize()
finalize() throws
throws Throwable
Throwable
www.epam.com
EPAM Systems
20

21. Типы объекта

• В Java класс может наследоваться только от
одного класса, но может реализовывать
более одного интерфейса
• У объекта может быть несколько типов:
– тип собственного класса
– типы всех суперклассов
– типы всех реализованных им интерфейсов
www.epam.com
EPAM Systems
21

22. Приведение типа объектов

• Приведение типа показывает
использование объекта одного типа вместо
другого типа
• Неявное приведение типа
String s = "some text";
Object o = s;
• Явное приведение типа
String t = (String) o;
www.epam.com
EPAM Systems
22

23. Что можно делать в подклассах

• Поля
– Унаследованные использовать как есть
– Объявить новые
– Скрыть поле (hide) (не рекомендуется)
• Методы
– Унаследованные использовать как есть
– Объявить новые
– Переопределить (override)
– Скрыть статический (hide)
• Конструкторы
– В конструкторе подкласса вызвать конструктор
суперкласса
www.epam.com
EPAM Systems
23

24. Переопределение и сокрытие методов

• Метод с сигнатурой, совпадающей с
сигнатурой метода суперкласса
Нестатический метод
суперкласса
Статический метод
суперкласса
Нестатический метод
подкласса
Переопределяет
Ошибка компиляции
Статический метод
подкласса
Ошибка компиляции
Скрывает
www.epam.com
EPAM Systems
24

25. private в суперклассе

• Не наследуются у своего суперкласса
• Доступны через унаследованные public или
protected методы
• У вложенного класса есть доступ к private
полям и методам своего внешнего класса
• private компоненты неявно доступны через
унаследованный вложенный класс
www.epam.com
EPAM Systems
25

26. private в суперклассе

public class Superclass {
private int value;
public int getValue() {
return value;
}
}
public class Subclass extends Superclass {
public void method() {
System.out.println(value);
ОШИБКА!
System.out.println(getValue());
}
}
www.epam.com
EPAM Systems
26

27. Ключевое слова super

• Доступ к членам суперкласса
super.superclassMethod();
• Вызов конструкторов суперкласса
super();
super(parameters);
Конструктор без
параметров обычно
нет смысла вызывать
явно
• В конструкторе вызов super – всегда
первый оператор
www.epam.com
EPAM Systems
27

28. final классы и методы

• Final классы
– От final класса (неизменяемого) невозможно
наследоваться
– Например, от класса String
• Final методы
– Нельзя переопределить в подклассах
– Методы, вызываемые из конструкторов должны
обычно быть объявлены как final
– Необходимы, если реализацию метода не
должна изменяться и важна для сохранения
непротиворечивого состояния объекта
www.epam.com
EPAM Systems
28

29. Абстрактные методы и классы

• Абстрактный класс – это класс, объявленный с
модификатором abstract
– могут быть, а могут и не быть абстрактные методы
– нельзя создать экземпляр, но можно создать подклассы
• Абстрактный метод – это метод, объявленный
без реализации:
abstract void moveTo(double deltaX,
double deltaY);
www.epam.com
EPAM Systems
29

30. Интерфейсы vs Абстрактные классы

• Абстрактные классы могут содержать поля (которые
не static и не final)
• Абстрактные классы могут содержать реализации
методов
• Разные интерфейсы могут независимо
реализовываться классами в разных местах иерархии
• Абстрактные классы в большинстве случаев
наследуются для использования части реализации
www.epam.com
EPAM Systems
30

31. Абстрактные классы

• Может реализовывать интерфейс
– При этом не обязательно реализовывать все
методы интерфейса
• Может содержать статические компоненты
– Их можно использовать с именем класса – как и
в случае любого другого класса
www.epam.com
EPAM Systems
31

32. Включение объектов

• Существуют различные варианты включения
объектов
– Композиция
– Агрегация
– Ассоциация (Осведомленность)
www.epam.com
EPAM Systems
32

33. Композиция

• Самый строгий вид включения
• Времена жизни внешнего и включаемого
объекта совпадают
• Включаемый объект может существовать
только как часть внешнего
• Отношение «целое-часть» (HAS-A)
www.epam.com
EPAM Systems
33

34. Композиция – пример

Инст ит ут
Авт омобиль
Зд ание
Д вигат ель
www.epam.com
EPAM Systems
34

35. Композиция - пример

public
public class
class Car
Car {{
private
private Engine
Engine engine;
engine;
Время жизни объектов
Car и Engine совпадает
public
public Car()
Car() {{
this.engine
this.engine == new
new Engine();
Engine();
}}
public
public Car(Engine
Car(Engine engine)
engine) {{
this.engine
this.engine == engine;
engine;
}}
public
public Engine
Engine getEngine()
getEngine() {{
return
return engine;
engine;
}}
}}
www.epam.com
EPAM Systems
35

36. Агрегация

• Отношение «целое-часть» (HAS-A)
• Но объекты могут существовать независимо
• Включаемый объект может существовать и
без внешнего
www.epam.com
EPAM Systems
36

37. Агрегация – Пример

Инст ит ут
Авт омобиль
Факульт ет
Колесо
www.epam.com
EPAM Systems
37

38. Агрегация - пример

public
public class
class Car
Car {{
private
private Wheel[]
Wheel[] wheels;
wheels;
Ссылка wheels не
должна быть null
public
public Car(Wheel[]
Car(Wheel[] wheels)
wheels) {{
this.wheels
this.wheels == wheels;
wheels;
}}
public
public Wheel[]
Wheel[] getWheels()
getWheels() {{
return
return wheels;
wheels;
}}
public
public void
void setWheels(Wheel[]
setWheels(Wheel[] wheels)
wheels) {{
this.wheels
this.wheels == wheels;
wheels;
}}
}}
www.epam.com
EPAM Systems
38

39. Ассоциация

• Самый слабый вид включения
• Один объект знает о существовании другого
• Осведомленность может быть взаимной
• Времена жизни объектов никак не связаны
www.epam.com
EPAM Systems
39

40. Ассоциация – пример

Инст ит ут
Авт омобиль
Профессор
Пассаж ир
www.epam.com
EPAM Systems
40

41. Ассоциация - пример

public
public class
class Car
Car {{
private
private Passenger
Passenger passenger;
passenger;
Ссылка passenger
может быть null
public
public Car(Passenger
Car(Passenger passenger)
passenger) {{
this.passenger
this.passenger == passenger;
passenger;
}}
public
public Passenger
Passenger getPassenger()
getPassenger() {{
return
return passenger;
passenger;
}}
public
public void
void setPassenger(Passenger
setPassenger(Passenger passenger)
passenger) {{
this.passenger
this.passenger == passenger;
passenger;
}}
}}
www.epam.com
EPAM Systems
41

42. Полиморфизм

• Полиморфизм –
возможность объектов
с одинаковой
спецификацией иметь
различную
реализацию
• «Один интерфейс,
множество
реализаций»
www.epam.com
EPAM Systems
42

43. Вложенные классы

• Зачем они могут понадобиться?
– Логическая группировка классов
– Увеличение инкапсуляции
– Более легкий для чтения и поддержки код
www.epam.com
EPAM Systems
43

44. Статические вложенные классы

public class OuterClass {
...
public static class NestedClass {
...
}
}
OuterClass.NestedClass nested
= new OuterClass.NestedClass();
www.epam.com
EPAM Systems
44

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

public class OuterClass {
...
public class InnerClass {
...
}
}
OuterClass.InnerClass inner
= new OuterClass().new InnerClass();
www.epam.com
EPAM Systems
45

46. Анонимные классы

button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
www.epam.com
EPAM Systems
46

47. Перечисления (enum)

• Перечисление – это тип, значения которого
ограничены фиксированным множеством констант
public enum Gender {
MALE,
FEMALE;
}
public enum Season {
WINTER,
SPRING,
SUMMER,
FALL
}
www.epam.com
EPAM Systems
47

48. Перечисления могут содержать поля и методы

public
public enum
enum Planet
Planet {{
MERCURY(3.303e+23,
MERCURY(3.303e+23, 2.4397e6),
2.4397e6),
VENUS
VENUS (4.869e+24,
(4.869e+24, 6.0518e6),
6.0518e6),
EARTH
EARTH (5.976e+24,
(5.976e+24, 6.37814e6),
6.37814e6),
...
...
private
private final
final double
double mass;
mass;
private
private final
final double
double radius;
radius;
private
private Planet(double
Planet(double mass,
mass, double
double radius)
radius) {{
this.mass
this.mass == mass;
mass;
this.radius
this.radius == radius;
radius;
}}
public
public double
double getMass()
getMass() {{
return
return mass;
mass;
}}
public
public double
double getSurfaceGravity()
getSurfaceGravity() {{
return
return GG ** mass
mass // (radius
(radius ** radius);
radius);
}}
}}
www.epam.com
EPAM Systems
48

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

public
public enum
enum Direction
Direction {{
NORTH(0,
NORTH(0, 1),
1),
EAST(1,
EAST(1, 0),
0),
SOUTH(0,
SOUTH(0, -1),
-1),
WEST(-1,
WEST(-1, 0);
0);
private
private final
final int
int x;
x;
private
private final
final int
int y;
y;
private
private Direction(int
Direction(int x,
x, int
int y)
y) {{
this.x
this.x == x;
x;
this.y
this.y == y;
y;
}}
public
public int
int getX()
getX() {{
return
return x;
x;
}}
public
public int
int getY()
getY() {{
return
return y;
y;
}}
}}
...
...
public
public void
void move(Direction
move(Direction direction)
direction) {{
currentX
currentX +=
+= direction.getX();
direction.getX();
currentY
currentY +=
+= direction.getY();
direction.getY();
}}
www.epam.com
EPAM Systems
49

50. Перечисления (enum)

• Все перечисления неявно наследуются от
java.lang.Enum
• Все константы перечисления неявно имеют
модификаторы public static final
• Нельзя создать экземпляр перечисления
с помощью оператора new
• Нельзя наследоваться от перечисления
www.epam.com
EPAM Systems
50

51. Перечисления (enum)

• Некоторые нестатические методы перечисления:
– ordinal() - номер элемента перечисления (номера
начинаются с 0)
– compareTo() - элементы перечисления можно
сравнивать
• Полезные статические методы перечислений:
– values() – возвращает массив из всех констант
перечисления
– valueOf(String name) – ищет константу с
заданным именем
www.epam.com
EPAM Systems
51

52. Аннотации

• Аннотации содержат данные, которые не
являются частью программы
• Применения:
– Информация для компилятора
– Обработка времени компиляции и размещения
– Обработка времени выполнения
www.epam.com
EPAM Systems
52

53. Предопределенные аннотации

• @Deprecated
/**
/**
** @deprecated
@deprecated explanation
explanation of
of why
why it
it was
was deprecated
deprecated
*/
*/
@Deprecated
@Deprecated
static
static void
void deprecatedMethod()
deprecatedMethod() {{
}}
• @Override
@Override
@Override
int
int overriddenMethod()
overriddenMethod() {{
}}
• @SuppressWarnings
@SuppressWarnings("deprecation")
@SuppressWarnings("deprecation")
void
void useDeprecatedMethod()
useDeprecatedMethod() {{
deprecatedMethod();
deprecatedMethod();
}}
www.epam.com
EPAM Systems
53

54.

Спасибо за внимание!
Контактная информация:
Денис Мурашев
Инструктор
EPAM Systems, Inc.
Адрес: Саратов, Рахова, 181
Email: [email protected]
http://www.epam.com
www.epam.com
EPAM Systems
54
English     Русский Правила