37
Объекты, классы и пакеты в Java Алексей Владыкин 22 сентября 2014 Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 1 / 37

Java, осень 2014: Объекты, классы и пакеты в Java

Embed Size (px)

DESCRIPTION

* Основы ООП. * Класс, интерфейс, перечисление. * Аннотации. * Модификаторы доступа. * Вложенные классы. * Наследование. * Пакеты.

Citation preview

Page 1: Java, осень 2014: Объекты, классы и пакеты в Java

Объекты, классы и пакеты в Java

Алексей Владыкин

22 сентября 2014

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 1 / 37

Page 2: Java, осень 2014: Объекты, классы и пакеты в Java

1 Основы ООП

2 Пакеты

3 Классы

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

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 2 / 37

Page 3: Java, осень 2014: Объекты, классы и пакеты в Java

Основы ООП

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 3 / 37

Page 4: Java, осень 2014: Объекты, классы и пакеты в Java

Основы ООП

Определение ООП

Объект — это мыслимая или реальная сущность, обладающаяхарактерным поведением и отличительными характеристиками иявляющаяся важной в предметной области

Гради Буч

Объектно-ориентированное программирование — парадигмапрограммирования, в которой программа строится извзаимодействующих объектов

Ср.: процедурное, функциональное, логическое программирование

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 4 / 37

Page 5: Java, осень 2014: Объекты, классы и пакеты в Java

Основы ООП

Свойства объекта

Объект является экземпляром класса

Объект имеет внутреннее состояние

Объект может принимать сообщения(в большинстве языков сообщение = вызов метода)

Объект — это «умные данные»

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 5 / 37

Page 6: Java, осень 2014: Объекты, классы и пакеты в Java

Основы ООП

Возможности ООП

ИнкапсуляцияСокрытие деталей реализации за внешним интерфейсом

НаследованиеСоздание производных классов, наследующих свойства базового

ПолиморфизмРазная обработка сообщений в разных классах

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 6 / 37

Page 7: Java, осень 2014: Объекты, классы и пакеты в Java

Основы ООП

ООП в Java

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

В Java все является объектом, кроме примитивных типов

Исполняемый код может находиться только в классе

Стандартная библиотека предоставляет огромное количествоклассов, и можно создавать свои

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 7 / 37

Page 8: Java, осень 2014: Объекты, классы и пакеты в Java

Пакеты

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 8 / 37

Page 9: Java, осень 2014: Объекты, классы и пакеты в Java

Пакеты

Зачем нужны пакеты

Задание пространства имен,предотвращение коллизий имен классов

Логическая группировка связанных классов

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

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 9 / 37

Page 10: Java, осень 2014: Объекты, классы и пакеты в Java

Пакеты

Как работают пакеты

Задание пакета для класса:package ru.compscicenter.java2014;

Использование класса из пакета:классы текущего пакета и пакета java.lang всегда видныклассы других пакетов доступны по полному имени с пакетомможно использовать директиву import

Имя пакета должно совпадать с именем директории:ru/compscicenter/java2014/

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 10 / 37

Page 11: Java, осень 2014: Объекты, классы и пакеты в Java

Пакеты

Импорт

Импорт одного класса:import ru.compscicenter.java2014.ExampleClass;

Импорт всех классов пакета:import ru.compscicenter.java2014.*;

Импорт статических полей и методов:import static java.lang.System.out;import static java.util.Arrays.*;

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 11 / 37

Page 12: Java, осень 2014: Объекты, классы и пакеты в Java

Пакеты

Как работает импорт

Директивы import позволяют компилятору получить полныеимена всех используемых классов, полей и методов по ихкоротким именам

В class-файл попадают полные имена, подстановка содержимогоне происходит

При запуске программы все используемые классы должныприсутствовать в classpath

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 12 / 37

Page 13: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 13 / 37

Page 14: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Объявление класса

package java.lang;

/*** The {@code Integer} class wraps a value of the primitive type* {@code int} in an object. An object of type {@code Integer}* contains a single field whose type is {@code int}.*/

public class Integer {

// class content

}

здесь и далее примеры из JDK (с сокращениями)

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 14 / 37

Page 15: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

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

publicдоступ для всех

protectedдоступ в пределах пакета и дочерних классов

privateдоступ в пределах класса

по умолчанию (нет ключевого слова)доступ в пределах пакета

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 15 / 37

Page 16: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

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

Можно объявить класс внутри другого класса

Такие классы имеют доступ к private-членам друг друга

Экземпляр вложенного класса связан с экземпляром внешнегокласса

Если связь не нужна, вложенный класс объявляют смодификатором static

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 16 / 37

Page 17: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Поля

package java.lang;

public class Integer {

private final int value;

}

Поля инициализируются значениями по умолчаниюМодификатор final — значение должно быть присвоено ровноодин раз к моменту завершения инициализации экземпляра

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 17 / 37

Page 18: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Конструкторы

package java.lang;

public class Integer {

private final int value;

public Integer(int value) {this.value = value;

}}

Если не объявлен ни один конструктор, автоматически создаетсяконструктор по умолчанию (без параметров)

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 18 / 37

Page 19: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Деструктор

В Java нет деструкторов, сбор мусора автоматический

Есть метод void finalize(), но пользоваться им нерекомендуется (не известно, когда будет вызван)

При необходимости освободить ресурсы заводят обычный методvoid close() или void dispose() и вызывают его явно

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 19 / 37

Page 20: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Методы

package java.lang;

public class Integer {

private final int value;

public int intValue () {return value;

}}

Возможна перегрузка методов(несколько одноименных методов с разными параметрами)

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 20 / 37

Page 21: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Статические поля и методы

package java.lang;

public class Integer {

public static final int MIN_VALUE = 0x80000000;

public static int rotateRight(int i, int distance) {return (i >>> distance) | (i << -distance );

}}

Статические поля и методы относятся не к экземпляру класса, ако всему классу

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 21 / 37

Page 22: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Принцип «Tell, Don’t Ask»

Procedural code gets information then makes decisions.Object-oriented code tells objects to do things.

Alec Sharp

Правильно: говорить объектам, что вам от них нужно

Неправильно: напрямую работать с внутренним состояниемобъекта

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 22 / 37

Page 23: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Интерфейсы

Интерфейс определяет контракт объекта, но не его реализациюВсе public

package java.lang;

public interface CharSequence {

int length ();

char charAt(int index);}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 23 / 37

Page 24: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Интерфейсы

В Java 8 добавили default-методы(пример ниже придуман, такого метода на самом деле нет)

package java.lang;

public interface CharSequence {

int length ();

CharSequence subSequence(int start , int end);

default CharSequence subSequence(int start) {return subSequence(start , length ());

}}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 24 / 37

Page 25: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

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

Нельзя создать экземпляр такого классаВ отличие от интерфейса, в абстактном классе могут быть поля ине-public члены

package java.lang;

public abstract class Number {

public abstract int intValue ();public abstract long longValue ();public abstract float floatValue ();public abstract double doubleValue ();

}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 25 / 37

Page 26: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Перечисления

Класс с фиксированным количеством экземпляровМожет иметь поля и методы

package java.time;

public enum DayOfWeek {MONDAY ,TUESDAY ,WEDNESDAY ,THURSDAY ,FRIDAY ,SATURDAY ,SUNDAY

}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 26 / 37

Page 27: Java, осень 2014: Объекты, классы и пакеты в Java

Классы

Аннотации

Метаданные к элементам программыНе могут содержать исполняемый код

package java.lang;

import java.lang.annotation .*;import static java.lang.annotation.ElementType .*;

@Target ({TYPE , FIELD , METHOD , PARAMETER ,CONSTRUCTOR , LOCAL_VARIABLE })

@Retention(RetentionPolicy.SOURCE)public @interface SuppressWarnings {

String [] value ();}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 27 / 37

Page 28: Java, осень 2014: Объекты, классы и пакеты в Java

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

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 28 / 37

Page 29: Java, осень 2014: Объекты, классы и пакеты в Java

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

Объявление класса-наследника

package java.lang;

public final class StringBuilderextends AbstractStringBuilder {

// derived class content

}

Нет множественного наследованияВсе классы наследуют java.lang.Object

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 29 / 37

Page 30: Java, осень 2014: Объекты, классы и пакеты в Java

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

Объявление класса, реализующего интерфейс

package java.lang;

public final class Stringimplements CharSequence {

// implementation

}

Класс может реализовывать сколько угодно интерфейсов

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 30 / 37

Page 31: Java, осень 2014: Объекты, классы и пакеты в Java

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

Модификатор final

final class MyClass {...}нельзя создать класс-наследник

final void myMethod() {...}нельзя переопределить метод в дочернем классе

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 31 / 37

Page 32: Java, осень 2014: Объекты, классы и пакеты в Java

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

Конструктор класса-наследника

package java.lang;

public final class StringBuilderextends AbstractStringBuilder {

public StringBuilder () {super (16);

}

public StringBuilder(int capacity) {super(capacity );

}}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 32 / 37

Page 33: Java, осень 2014: Объекты, классы и пакеты в Java

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

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

package java.lang;

public final class StringBuilderextends AbstractStringBuilder {

@Overridepublic StringBuilder append(String str) {

super.append(str);return this;

}}

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 33 / 37

Page 34: Java, осень 2014: Объекты, классы и пакеты в Java

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

Оператор instanceof

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

Object obj = "hello world";// obj instanceof Object -> true// obj instanceof String -> true// obj instanceof CharSequence -> true// obj instanceof Number -> false

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 34 / 37

Page 35: Java, осень 2014: Объекты, классы и пакеты в Java

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

Liskov Substitution Principle

Если S является подтипом T , тогда объекты типа T в программемогут быть замещены объектами типа S без каких-либоизменений желательных свойств этой программы

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

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 35 / 37

Page 36: Java, осень 2014: Объекты, классы и пакеты в Java

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

Наследование и композиция

Наследование — очень сильная связьЧасто вместо наследования лучше использовать композицию(включение одного объекта в другой)

Неправильно:класс Train наследуется от Listкласс Segment наследуется от Point

Правильно:класс Train содержит Listкласс Segment содержит Point

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 36 / 37

Page 37: Java, осень 2014: Объекты, классы и пакеты в Java

Что сегодня узнали

Что такое ООП

Зачем классы раскладываются по пакетам

Как в Java объявить класс, создать его экземплярыи работать с ними

Как в Java реализуется инкапсуляция, наследованиеи полиморфизм

Алексей Владыкин Объекты, классы и пакеты в Java 22 сентября 2014 37 / 37