java core. lecture# 2. classes & objects

69
Язык программирования JAVA Лекция 2 Классы и Объекты в Java Моисеенко Антон [email protected] СПГУАП Кафедра Информационно-Сетевых Технологий

Upload: anton-moiseenko

Post on 13-Apr-2017

495 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Java Core. Lecture# 2. Classes & objects

Язык программирования JAVA

Лекция 2Классы и Объекты в Java

Моисеенко Антон[email protected]

СПГУАПКафедра Информационно-Сетевых Технологий

Page 2: Java Core. Lecture# 2. Classes & objects

Содержание курса

Программные объекты■ Последовательность действий при работе с классами■ Описание класса■ Создание объектов■ Механизм создания объектов■ Использование объектаАтрибуты классаМетоды классаВызов методов с параметрамиСокрытие реализацииМодификаторы доступа (public, private, protected...)

Page 3: Java Core. Lecture# 2. Classes & objects

Содержание курсаИнкапсуляцияКонструктор классаПрименения конструкторовПример конструктора классаКлючевое слово thisУничтожение объектаСтатические элементы классаШаблон Singleton (Одиночка)Перегрузка методовНаследованиеВенгерская НотацияПравила именованияОрганизация пространств имён

Page 4: Java Core. Lecture# 2. Classes & objects

Программные объекты

• Объекты – ключевое понятие объектно-ориентированных технологий

Оглядитесь: мы живём в мире взаимодействующих объектов!

Каждый объект характеризуется состоянием и поведением

Page 5: Java Core. Lecture# 2. Classes & objects

Программные объекты

■ Каждый объект характеризуется состоянием и поведением

Page 6: Java Core. Lecture# 2. Classes & objects

Программные объекты

■ Объекты в программных системах – аналоги объектов в реальном мире

■ Состояние хранится в полях■ Поведение доступно через методы■ Методы изменяют состояние объекта

Сокрытие внутреннего состояния объекта от посторонних глаз называется инкапсуляцией. Единственный способ изменить это состояние – вызвать метод объекта.

Page 7: Java Core. Lecture# 2. Classes & objects

Программные объекты

Состояние:■ Скорость движения■ Скорость вращения колёс■ Конфигурация шестернейПоведение:■ Переключить передачи■ Затормозить■ Изменить темп

Page 8: Java Core. Lecture# 2. Classes & objects

Программные объекты

Основные преимущества:■ Модульность■ Повторное использование кода■ Сокрытие внутреннего представления■ Расширяемость и простота отладки

Page 9: Java Core. Lecture# 2. Classes & objects

Классы

■ Класс – множество объектов, имеющихсхожее поведение и свойства

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

Page 10: Java Core. Lecture# 2. Classes & objects

Классы

■ Аналогия: класс – это проект (чертёж) типового дома, а объект – это конкретный дом, кот.будет построен по этому проекту

■ Все дома, построенные по типовому проекту, будут иметь индивидуальные особенности (например, адрес)

Page 11: Java Core. Lecture# 2. Classes & objects

Последовательность действий при работе с классами

1. Описать класс2. Реализовать класс3. Создать экземпляр класса – объект4. Работать с объектом, обращаясь к его

свойствам и методам5. Уничтожить объект (в Java –

автоматически)

Page 12: Java Core. Lecture# 2. Classes & objects

Описание класса

■ В отличие от С++, в Java описание (объявление, declaration) класса совмещено с его определением (definition)

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

■ Как правило, в Java класс описывается в отдельном файле. ■ Синтаксис:

[Модификатор доступа] class ИмяКласса {//члены класса – свойства и методы Модиф._доступа Тип имяСвойства [=значение]; Модиф._доступа Тип имяМетода(параметры) {

//тело метода }}

Page 13: Java Core. Lecture# 2. Classes & objects

Пример описания класса// общедоступный класс Автомобильpublic class Car {

public int maxSpeed; //макс. скоростьpublic int currentSpeed; //текущая скоростьpublic String vendor; //производительpublic String model; // модель// закрытая константа «шаг приращения скорости»private final int speedOnSteep = 5;// открытый метод «газонуть»public void stepOn() {

if (currentSpeed + speedOnSteep <= maxSpeed) {

currentSpeed += speedOnSteep;}

}// вывод информации об объектеpublic void showDescription() {

System.out.println(“Vendor: “ + vendor + “\nModel: “ + model + “\nCurrentSpeed: ” +

currentSpeed); }

}

Page 14: Java Core. Lecture# 2. Classes & objects

Создание объектов

■ Тот факт, что в программе описан класс, ещё не означает, что мы можем работать с его свойствами и вызывать его методы

■ Для работы требуется: 1) объявить переменную типа Класс и 2) создать объект (экземпляр) класса

■ Синтаксис:

ИмяКласса имяОбъекта; //объявление переменной-объектаимяОбъекта = new ИмяКласса([параметры конструктора]);

Page 15: Java Core. Lecture# 2. Classes & objects

Создание объектов

■ Можно совместить объявление и создание объекта:

ИмяКласса имяОбъекта = new ИмяКласса([параметры конструктора]);

Car kalina;kalina = new Car();Car merz = new Car();

■ Например:

Page 16: Java Core. Lecture# 2. Classes & objects

Механизм создания объектов

1. Создаться ссылочная переменная в стеке для хранения адреса будущего объекта

2. В куче (heap) выделяется пространство для размещения объекта со всеми его свойствами (атрибутами)

3. Атрибуты инициализируются значениями по умолчанию4. Выполняется явная инициализация атрибутов, если она была

задана программистом5. Выполняется конструктор6. Ссылка на созданный объект (его адрес) записывается в

соответствующую ссылочную переменную

Page 17: Java Core. Lecture# 2. Classes & objects

Использование объекта■ Использование объекта осуществляется посредством доступа

к его элементам■ Для доступа к элементам используется оператор «точка»

после переменной-ссылки на объект:

■ Например:

имяОбъекта.имяСвойства = значение;имяОбъекта.имяМетода(параметры);

kalina.vendor = “ВАЗ”;kalina.model = “Калина”;kalina.maxSpeed = 160;kalina.showDescription();

merz.vendor = “Mercedes”;merz.model = “S500”;merz.maxSpeed = 220;

Page 18: Java Core. Lecture# 2. Classes & objects

Атрибуты класса

■ Атрибуты (свойства) класса – это переменные внутри класса■ Совокупность значений атрибутов объекта описывает

состояние этого объекта■ Атрибуты класса, в отличие от локальных переменных,

инициализируются значениями по умолчанию○ Числовые элементы – нулями○ Символьные – значением ‘\0’ (нулевой символ)○ Логические – значением false○ Ссылки на объекты – значениями null

■ Атрибуты класса могут быть инициализированы явным образом при их объявлении:○ public int age = 0;

Page 19: Java Core. Lecture# 2. Classes & objects

Методы класса

■ Метод – это функция, описанная внутри класса■ Совокупность методов определяет поведение класса■ Описание метода включает заголовок и тело:

[модификаторы] тип имя(параметры) { тело; }■ Тело – совокупность операторов

Например:void printHello() { System.out.println(“hello”); }

■ Метод может принимать параметры и возвращать значение:

int square(int x) { return x*x; }

Page 20: Java Core. Lecture# 2. Classes & objects

Методы класса

■ Если метод возвращает значение простого типа или ссылку на объект, то его тип должен быть указан в заголовке метода

■ Также в теле метода должен содержаться хотя бы один оператор return

■ Если метод не возвращает значение, то в его заголовке должен быть указан тип void

■ Оператор return немедленно прекращает выполнение метода и возвращает управление вызывающему методу

■ Хороший стиль – использование одного оператора return в одном методе

■ Но Java не запрещает многократное использование return (при наличии соответствующих условий)

Page 21: Java Core. Lecture# 2. Classes & objects

Вызов методов с параметрами

■ Формальные параметры описаны в заголовке метода■ Фактические параметры указываются при его вызове■ Если в заголовке метода описаны формальные

параметры, то при его вызове нужно указывать фактические параметры

■ Значение, переданные в качестве фактических параметров, копируются в переменные-формальные параметры

■ В качестве фактических параметров могут выступать константы, переменные или выражения требуемого типа или типа, приводимого к нему неявно

Page 22: Java Core. Lecture# 2. Classes & objects

Вызов методов с параметрами

int k = 12;double m;. . .m = mult( 23.7, k );…

public double mult( double op1, double op2 ) { return op1 * op2;}

Page 23: Java Core. Lecture# 2. Classes & objects

Передача параметров в методы

■ В языке Java при вызове методов передача значений фактических параметров в формальные параметры осуществляется копированием.

■ Изменение значения формального параметра не влияет на значение фактического параметра.

■ В этой связи утверждается, что значение из фактических параметров в формальные осуществляется по значению.

Page 24: Java Core. Lecture# 2. Classes & objects

Передача параметров в методы

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

■ Напоминание: все объекты в Java являются ссылками

Page 25: Java Core. Lecture# 2. Classes & objects

Сокрытие реализации

■ Важнейшим принципом ООП является отделение изменяющейся составляющей от постоянной. Например, при изменении версии библиотеки видная внешним программам часть остается неизменной, меняется только внутренняя реализация.

■ Внешняя часть – определяет открытое поведение объекта, тогда как внутренняя реализация скрывается.

■ Мотивы■ удобство проектирования■ надежность кода

Page 26: Java Core. Lecture# 2. Classes & objects

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

■ Для решения проблемы сокрытия реализации в Java используются модификаторы доступа. Уровни доступа варьируются от «доступа ко всему» до минимального.

■ В Java существуют следующие модификаторы доступа:■ public■ protected■ private■ доступ в пределах пакета

Page 27: Java Core. Lecture# 2. Classes & objects

Модификатор publicМодификатор public определяет, что следующее за ним

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

package ru.sbs.jc;

public class Cookie { public void getApple() { ... } private void getOrange() { ... }}public class Dinner { public void run() {Cookie cookie = new Cookie(); cookie.getApple(); // метод доступен cookie.getOrange(); // метод недоступен }}

Page 28: Java Core. Lecture# 2. Classes & objects

Модификатор privateМодификатор private обозначает, что никто не имеет право получить доступ к этому члену за исключением его класса, изнутри методов этого класса.

package ru.sbs.jc;public class Cookie { private void getOrange() { ... } public void makeJuice() { getOrange(); // метод доступен }}public class Dinner { public void run() {Cookie cookie = new Cookie(); cookie.getOrange(); // метод недоступен }}

Page 29: Java Core. Lecture# 2. Classes & objects

Модификатор protected■ Модификатор protected обозначает, что никто не имеет право

получить доступ к этому члену за исключением его класса, и классов унаследованных от него.

public class Cookie { protected void getOrange() { ... }}public class Cake extends Cookie { public void run() { getOrange(); // метод доступен }}public class Dinner { public void run() {Cookie cookie = new Cookie(); cookie.getOrange(); // метод недоступен }}

Page 30: Java Core. Lecture# 2. Classes & objects

Модификатор «в пределах пакета»Если вообще не указывать модификатор, то мы получим доступ по

умолчанию – в пределах пакета. Поле будет доступно только классам в этом пакете.

package ru.sbs.jc;public class Cookie { void getOrange() { ... }}

package ru.sbs.jc;public class Cake { public void run() {Cookie cookie = new Cookie(); cookie.getOrange(); // метод доступен }}

Page 31: Java Core. Lecture# 2. Classes & objects

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

Инкапсуляция – помещение данных и методов в классы в комбинации с сокрытием реализации.

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

Page 32: Java Core. Lecture# 2. Classes & objects

Инкапсуляцияpublic class A { private int id; public A(int id) { setId(id); } public int getId() { return id; } public void setId(int value) { id = value; }}public class B { public void run() { A a1 = new A(1); A a2 = new A(2); } }

Page 33: Java Core. Lecture# 2. Classes & objects

Конструктор класса

class Rock { int id; public Rock (int value) { id = value; }}

Page 34: Java Core. Lecture# 2. Classes & objects

Конструктор класса

■ Конструктор класса – это специальный метод, название которого совпадает с именем класса

■ Конструктор вызывается автоматически при создании объекта

■ Конструктор не может возвращать значение■ Каждый класс обязан иметь конструктор.

Page 35: Java Core. Lecture# 2. Classes & objects

Конструктор класса

Если в классе никакого конструктора явно не написано, то система автоматически создает конструктор без параметров, который называется конструктором по умолчанию.

class Bird { int i;}public class App { public static void main(String[] args) { Bird bird = new Bird(); // конструктор по умолчанию }}

Page 36: Java Core. Lecture# 2. Classes & objects

Конструктор класса

■ Если в классе явно описан какой-либо конструктор, то конструктор по умолчанию системой не создается

■ Конструкторы также, как и другие методы, может иметь модификатор доступа

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

Page 37: Java Core. Lecture# 2. Classes & objects

Применения конструкторов

■ С помощью конструкторов можно управлять процессом создания объекта и производить какие-то действия, обычно связанные с первичной настройкой (инициализацией) объекта:

▪ присвоение атрибутам значений по умолчанию▪ соединение с БД▪ соединение с сетью▪ создание других объектов▪ и др.

Page 38: Java Core. Lecture# 2. Classes & objects

Пример конструктора классаpublic class Car {

public int maxSpeed; //макс. скоростьpublic int currentSpeed; //текущая скоростьpublic String vendor; //производительpublic String model; // модель// закрытая константа «шаг приращения скорости»private final int speedOnSteep = 5;// конструктор классаpublic Car(int maxSp, String vend, String model) {

maxSpeed = maxSp;vendor = vend;this.model = model;//используем ссылку this на

текущий объект}// другие методы ….

}//Car c = new Car(); Ошибка! Конструктора по умолчанию без

параметров нетCar kalina = new Car(160, “ВАЗ”, “Калина”);

Page 39: Java Core. Lecture# 2. Classes & objects

Ключевое слово this■ Ключевое слово this употребляется только внутри метода и

дает ссылку на объект, для которого этот метод был вызван.■ Идентификатор this подразумевает – этот объект.■ С помощью this можно:

▪ обращаться к атрибутам текущего объекта▪ вызывать методы текущего объекта▪ передавать ссылку на текущий объект методам другого

класса

Page 40: Java Core. Lecture# 2. Classes & objects

Ключевое слово this

public class Flower { private int id; Flower(int id) { this.id = id; } Flower() { this(0); } }

Page 41: Java Core. Lecture# 2. Classes & objects

Уничтожение объекта■ В языке Java нет необходимости самостоятельно уничтожать

объекты (достаточно ссылке присвоить значение null)■ Как только исчезает последняя ссылка на объект, объект считается

завершенным и уничтожается сборщиком мусора (garbage collector), специальным механизмом JVM.

■ Преимущества: отсутствие утечек памяти и эффективная ее организация.

public class App { public void run() { String st; st = new String(“1”); st = new String(“2”); // “1” -- удаляется }}

Page 42: Java Core. Lecture# 2. Classes & objects

Статические элементы класса■ Статические элементы класса существуют на уровне

определения класса, но не на уровне порожденного от него экземпляра и не участвуют в наследовании. Для метода static нет ссылки this.

■ Статическими могут быть как поля, так и методы. Для инициализации статически полей существуют блок static.

class Spoon { static int i; static { i = 47; } public static void main(String[] args) { System.out.println(i); }}

Page 43: Java Core. Lecture# 2. Classes & objects

Статические элементы, схемаКласс

public int method_a(int a) { return a + 1;}

public int method_b(int b) { return b - 1;}

public static int method_c() { return 0;}

public int method_a(1) { return 1 + 1;}

public int method_b(1) { return 1 - 1;}

Объект 1

public int method_a(2) { return 2 + 1;}

public int method_b(2) { return 2 - 1;}

Объект 2

public static int method_c() { return 0; }

Page 44: Java Core. Lecture# 2. Classes & objects

Шаблон Singleton (Одиночка)

Не должно быть больше одного экземпляра класса, например нужно иметь только один источник некоторой информации.

Page 45: Java Core. Lecture# 2. Classes & objects

Шаблон Singleton (Одиночка)

public class Foo { private static Foo instance = null; protected Foo(...) { ... } public static final Foo getInstance() { if (instance == null) { instance = new Foo(...) } return instance; }}

Page 46: Java Core. Lecture# 2. Classes & objects

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

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

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

Мотив – одинаковое поведение для разных типов.

Page 47: Java Core. Lecture# 2. Classes & objects

Перегрузка методов (Overloading)

Пример: void method1(); void method1(int i);void method1(string s); void method1(int i, string s);

Конструктор: public ClassName()

Перегрузка конструкторов:public ClassName() public ClassName(int param)

Page 48: Java Core. Lecture# 2. Classes & objects

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

■ Механизм построения иерархии классов■ Иерархия – отношение «предок»->«потомок»

(родительский-дочерний классы, суперкласс-подкласс, порождающий-порождённый классы)

■ Каждый порожденный класс иерархии имеет доступ к коду и данным всех порождающих классов (к элементом, разрешённым установленной областью видимости)

■ Наследование – мощный механизм повторного использования программного кода

Page 49: Java Core. Lecture# 2. Classes & objects

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

■ Для того, чтобы указать, что один класс является потомком (производным) от другого класса, необходимо после его имени поставить ключевое слово extends и имя родительского класса:

public class дочерний_класс extends родительский_класс{}

■ Модификатор доступа protected позволяет открыть члены класса всем потомкам этого класса, для остальных они остаются недоступными

Page 50: Java Core. Lecture# 2. Classes & objects

Ссылка super

■ В чём-то похожа на this■ Ссылается на родительский класс■ Можно применять двумя способами:

○ получать доступ к открытым (public) и защищённым (protected) элементам родительского класса

например, super.x1 = 10;○ вызывать конструктор родительского класса.

Вызов конструктора родительского элемента super должен быть первым выражением в конструкторе дочернего элемента:

public Square(Graphics g) { super(g); }

Page 51: Java Core. Lecture# 2. Classes & objects

Пример: иерархия геометрических фигур

■ Среди геом.фигур можно выделить отношения обобщения-специализации

■ Например, квадрат является ромбом с прямыми углами

■ Квадрат является прямоугольником с одинаковыми сторонами

■ Круг является эллипсом с одинаковыми радиусами

Page 52: Java Core. Lecture# 2. Classes & objects

Наследование: объявление класса-наследника

■ Java не поддерживает множественное наследование,но есть интерфейсы

■ Все классы наследуют java.lang.Object

class Derived extends Example {/* derived class content */

}

Page 53: Java Core. Lecture# 2. Classes & objects

Наследование: конструктор класса-наследника

class Derived extends Example {Derived () {

this (10);}Derived (int number ) {

super ( number );}

}

Page 54: Java Core. Lecture# 2. Classes & objects

Наследование: переопределение методов

class Derived extends Example {@Overrideint getNumber () {

int number = super.getNumber();return Math.max(10,number);

}}

Page 55: Java Core. Lecture# 2. Classes & objects

Наследование: Полиморфизм в действии

Example e = new Example (3);// e. getNumber () -> 3

e = new Derived (3);// e. getNumber () -> 10

Derived d = ( Derived ) e;// d. getNumber () -> 10

Page 56: Java Core. Lecture# 2. Classes & objects

Наследование: оператор instanceof

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

Example e = new Example (3);// e instanceof Object -> true// e instanceof Example -> true// e instanceof Derived -> false

e = new Derived (3);// e instanceof Object -> true// e instanceof Example -> true// e instanceof Derived -> true

Page 57: Java Core. Lecture# 2. Classes & objects

Наследование: интерфейсы

Интерфейс определяет возможные сообщения,но не их реализациюinterface ExampleInterface {

int getNumber ();}

Класс может реализовывать несколько интерфейсовclass Example implements ExampleInterface {

int getNumber () {// implementation}

}

Page 58: Java Core. Lecture# 2. Classes & objects

Наследование: Модификатор final

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

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

Page 59: Java Core. Lecture# 2. Classes & objects

Наследование: модификатор abstract

abstract class Example {...}нельзя создать экземпляр класса

abstract int getNumber();метод без реализации (класс должен быть абстрактным)

Page 60: Java Core. Lecture# 2. Classes & objects

Пакеты в Java

■ Пакет (package) – это способ группировки классов по функциональному назначению

■ Пакеты Java обеспечивают уникальные пространства имен

■ Пакеты могут образовывать иерархическую древовидную структуру

Page 61: Java Core. Lecture# 2. Classes & objects

Пакеты в Java

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

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

■ Пакет, который содержит группу классов, объединяет их по некоторому смыслу

Page 62: Java Core. Lecture# 2. Classes & objects

Пакеты в Java

■ В пакет объединяются классы, сходные по функциональному назначению

■ Реализуют принцип модульности■ Полное имя класса включает имена пакета и

всех подпакетов, в котором он описан

Page 63: Java Core. Lecture# 2. Classes & objects

Пакеты в Java

Project_DIR | |-- classes | `-- zoostore | |-- model | | `-- Cat.class | | | `-- test | `-- TestCats.class | `-- src `-- zoostore |-- model | `-- Cat.java | `-- test `-- TestCats.java

Структура директорий, в которых хранятся файлы классов, должна соответствовать структуре пакетов.

При этом желательно файлы исходных кодов и файлы классов размещать отдельно, что повышает управляемость

Page 64: Java Core. Lecture# 2. Classes & objects

Описание пакета

■ Указать имя пакета, в котором находится класс, можно с помощью директивы package○ package carspack;

■ Она должна быть самой первой командой в файле■ До неё могут находиться только комментарии и

пустые строки■ Если директива package не указана в файле, то

классы из него всё равно помещаются в пакет по умолчанию с именем default

■ Примечание: имена пакетов принято указывать в нижнем регистре

Page 65: Java Core. Lecture# 2. Classes & objects

Директива import

■ Позволяет включать один класс или все классы пакета в текущий файл

■ Это позволяет использовать короткие имена классов

■ Пример:○ import java.util.Random; // подключение класса○ import java.awt.*; // подключение всех классов

пакета

Page 66: Java Core. Lecture# 2. Classes & objects

Венгерская Нотация

■ Использовалась в BCPL■ Префикс указывает на тип данных■ Была действительно нужна, поскольку в языке был

только один тип данных■ Сегодня осталось только как рудимент в WinAPI

(всякие szClassName).■ В языках программирования с динамической

типизацией (Python, JavaScript, PHP) практически не используется

Page 67: Java Core. Lecture# 2. Classes & objects

Правила именования

■ Классы: CamelCase■ Поля класса, методы: camelCase■ Константы:

ALL_CAPITALS_WITH_UNDERSCORES■ Локальные переменные: camelCase

Код должен соответствовать Code Conventions for the Java Programming Language

Page 68: Java Core. Lecture# 2. Classes & objects

Организация пространств имён

■ Аналог пространства имён в Java – пакет (package).

■ Пакеты имеют иерархическую структуру■ Обычно именуются маленькими буквами■ Одному пакету соответствует одна

директория в файловой системе

Page 69: Java Core. Lecture# 2. Classes & objects

Вопросы?