Презентация_2_Классы_Вложенные_классы.ppt
- Количество слайдов: 35
2. ОБЪЕКТНООРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ Программирование на языке Java 1
КЛАССЫ И ОБЪЕКТЫ Объект – это элемент программной системы, обладающий внутренним состоянием, поведением, уникальностью и характеризуемый логической целостностью Класс – это описание множества объектов, обладающих сходной структурой состояния и поведения В языке Java классы являются основной разновидностью ссылочных типов Переменные, имеющие ссылочный тип, не хранят связанные с ними данные непосредственно, а содержат ссылку на область динамической памяти, содержащую эти данные. Специальное значение null используется для указания на то, что ссылка не соответствует никакому реальному объекту. 2
СТРУКТУРА КЛАССА Описание класса включает в себя модификаторы (в т. ч. уровень доступа) имя класса описания элементов класса Уровень доступа класса определяет возможность использования класса за пределами его пакета: public доступ только внутри пакета (по умолчанию) К элементам класса относятся поля методы конструкторы блоки инициализации вложенные классы 3
КЛАССЫ И ОБЪЕКТЫ Общий вид класса classname { type instance-variablel; type instance-varlable 2; //. . . type instance-variable. N; type methodname 1(parameter-list){ // тело метода } type methodname 2 (parameter-list) { // тело метода } //. . . type methodname. N(parameter-list) { // тело метода } } 4
КЛАССЫ Создание объектов класса реализуется с помощью выражения new Класс() Например: создать Box объект c именем mybox Box mybox = new Box (); Если конструктор класса содержит параметры, они указываются в скобках при обращении к new Результатом операции new является ссылка на 5 новый объект
КЛАССЫ Для ссылочных типов определены операции == и !=, которые сравнивают значения ссылок. В силу свойства уникальности объект, созданный операцией new, всегда отличается от предыдущих и последующих объектов, даже если обладает эквивалентным состоянием. Для ссылочных типов возможна операция присваивания Box b 1 = new Box(); Box b 2 =b 1 после того, как этот фрагмент выполнится, обе переменных (b 1 и b 2) будут ссылаться на один и тот же объект 6
ПОЛЯ Поле характеризует элемент данных, связанных с объектом класса Описание поля включает модификаторы, тип и имя Возможно задание начального значения поля Для полей класса предопределены значения по умолчанию (0 для чисел, false для boolean и null для ссылок) public class Vehicle { int speed; int weight; Person driver; . . . } class Box { double width=5; double height=3; double depth=2; } 7
ПОЛЯ Поле, помеченное модификатором final, не может менять свое значение после первого присваивания. При этом значение поля должно быть задано во время инициализации объекта public class Vehicle { int speed; final int HEIGHT=3; . . . } 8
МЕТОДЫ Метод содержит программный код, который манипулирует состоянием объекта Описание метода состоит из заголовка и тела заголовок содержит модификаторы, тип возвращаемого значения, имя метода и параметры с их типами тело метода представляет собой блок, вычисляющий значение метода 9
МЕТОДЫ class Box { double width; double height; double depth; } // Этот класс объявляет объект типа Box class Box. Demo { public static void main(String args[]) { Box mybox = new Box(); double vol; // присвоить значения экземплярным переменным объекта mybox. width = 10; mybox. height = 20; mybox. depth = 15; // вычислить объем блока vol = mybox. width * mybox. height * mybox. depth; System. out. println("Объем равен " + vol); } } // Файл должен называться Box. Demo. java, потому что метод main() находится в классе с именем Box. Demo 10
МЕТОДЫ Внутри метода можно ссылаться на текущий объект, используя ключевое слово this Box(double w, double h, double d) { this. width = w; this. height = h; this. depth = d; } Здесь this – ссылка на объект метод которого был вызван 11
МЕТОДЫ Вызов методы выполняется через ссылку на объект соответствующего класса: объект. метод (параметры) Например: v. accelerate(10); Параметры в метод передаются только по значению Для возврата из метода значения используется инструкция return, а в методе указывается тип возвращаемого значения double volume() { return width * height * depth; Метод может непосредственно возвращать только один результат 12
МЕТОДЫ Для обхода этих ограничений по возврату одного значения можно в качестве параметров и результата использовать ссылочные данные, например, массивы или специальные объекты Например: class Test { int а; Test incr. By. Ten() { Test temp = new Test(a+10); return temp; }. . . } 13
МЕТОДЫ Сигнатурой метода называется набор, состоящий из его имени и типов параметров Java допускает описание в одном классе методов с различными сигнатурами - в частности, перегрузку методов 14
МЕТОДЫ class Overload. Demo { void test () { System. out. println("Параметры отсутствуют"); } // Перегруженный метод test с одним int-параметром, void test(int a) { System. out. println("a: " + a); } // Перегруженный метод test с двумя int-параметрами void test(int a, int b) ( System. out. println("а и b: " + a + " " + b); } // Перегруженный метод test с double-параметром double test(double a) { System. out. println("Вещественное двойной точности a: " + a); return a*a; } } class Overload { public void main(String args[]) { Overload. Demo ob = new Overload. Demo(); double result; // вызвать все версии test () ob. test() ; ob. test(10); ob. test(10, 20); result = ob. test(123. 2); System. out. println("Результат ob. test(123. 2) : " + result); 15
ИНКАПСУЛЯЦИЯ Во многих случаях атрибуты одного класса используются другими классами. Непосредственное обращение к атрибутам связано с рядом проблем: объект, содержащий поле, может оказаться в некорректном состоянии затрудняется изменение реализации класса, содержащего эти поля доступ к данным не контролируется (затрудняется поиск и исправление ошибок) В объектно-ориентированном подходе для решения указанных проблем вводится принцип инкапсуляции. 16
ИНКАПСУЛЯЦИЯ Инкапсуляция – разделение элементов класса на внутренние и внешние. Внутренние элементы образуют реализацию , скрытую от других классов. Непосредственно использовать внутренние элементы может только сам класс. Внешние элементы образуют интерфейс, доступный для использования всеми другими классами. При проектировании класса необходимо стремиться к тому, чтобы его интерфейс был минимальным. Методология ООП требует скрывать поля класса, а любые взаимодействия данного класса с другими обеспечивать только через методы интерфейса. Некоторые методы также могут быть скрыты, если они не должны использоваться внешними классами. 17
ИНКАПСУЛЯЦИЯ В языке Java инкапсуляция обеспечивается с помощью введения уровня доступа к элементам класса. Уровень обозначается одним из ключевых слов и указывается перед описанием элемента класса (например, поля или метода): private – внутренний элемент класса (используется элементами только данного класса) public – внешний элемент класса (используется элементами любого класса) public class Vehicle { private double weight; private int velocity = 0; private boolean moving = false; public void start() {. . . } public void accelerate() {. . . } public void brake() {. . . } public void stop() {. . . } } 18
ИНКАПСУЛЯЦИЯ Для внешнего использования внутренних данным класс должен предоставить методы доступа: Метод для чтения данных (getter) Метод для изменения данных (setter) Принятое обозначение - get. Name, где Name — это название элемента данных (например, имя поля). Если элемент данных имеет логический тип, то принято использовать обозначение вида is. Name. Методыаксессоры не имеют параметров. Принято обозначать set. Name. Метод получают один параметр — новое значение соответствующего элемента данных Методы доступа обеспечивают возможность контроля операций чтения/записи данных. 19
ИНКАПСУЛЯЦИЯ public class Vehicle { private double weight; private int velocity = 0; private boolean moving = false; public double get. Weight() { return weight; } public int get. Velocity() { return velocity; } public boolean is. Moving() { return moving; } public void start() {. . . } public void accelerate() {. . . } public void brake() {. . . } public void stop() {. . . } } public int get. Age ( ) { return age; } public void set. Age (int an. Age) { age = an. Age; } В методах доступа getter мы ссылаемся на age по его имени 20
КОНСТРУКТОРЫ В состав любого класса обязательно входит программный код, отвечающий за инициализацию его экземпляров: инициализация полей блоки инициализации конструктор Описание конструктора аналогично описанию voidметода, в частности, конструкторы могут иметь различные уровни доступа; в теле конструктора можно использовать оператор return без параметров; конструкторы могут перегружаться. Отличия конструктора от метода: в описании конструктора нельзя указывать тип возвращаемого значения имя конструктора должно в точности совпадать с именем класса конструктор можно вызвать только из другого конструктора, либо неявно через операцию new. 21
КОНСТРУКТОРЫ Конструктор инициализирует объект после его создания class Box { double width; double height; double depth; // Это конструктор класса Box() { System. out. println("Создание Box"); width = 10; height = 10; depth = 10; } double volume() { return width * height * depth; } } class Box. Demo 6 { public void main (String args [] ) { Box myboxl = new Box () ; Box mybox 2 = new Box () ; double vol; vol = myboxl. volume(); System. out. println("Объем равен " + vol); vol. = mybox 2. volume(); System. out. println("Объем равен " + vol); }} 22
КОНСТРУКТОРЫ public class Car { private double weight; private int velocity = 0; private boolean moving = false; public Car(double weight. Value) { weight = weight. Value; } // Далее методы. . . } Конструктор присутствует в классе всегда, даже если он не описан явно – в этом случае подразумевается конструктор по умолчанию без параметров. 23
СТАТИЧЕСКИЙ КОНТЕКСТ Статический контекст описывает элементы класса, не связанные с конкретным экземпляром: статические поля статические методы статические блоки инициализации К статическому элементу можно обращаться до того, как создаются какие-либо объекты его класса или без ссылки на какой-либо объект Переменные экземпляра, объявленные как static – глобальные переменные Обращение к статическому полю происходит через имя класса Vehicle. MAX_SPEED public class Vehicle { public static final int MAX_SPEED = 150; private static int current. ID = 0; private int id = ++current. ID; … } 24
СТАТИЧЕСКИЙ КОНТЕКСТ Статические методы выполняются в контексте целого класса, поэтому не должны содержать ссылки this. Обращение к статическому методу происходит через имя класса Vehicle. get. Max. ID() Статические методы могут использовать только элементы статического контекста, поэтому могут вызывать только другие static-методы или обращаться только к staticданным public class Vehicle { public static final int MAX_SPEED = 150; private static int current. ID = 0; public static int get. Max. ID() { return current. ID; } private int id = ++current. ID; … } 25
СТАТИЧЕСКИЙ КОНТЕКСТ Статический блок инициализации выполняется один раз при загрузке класса При наличии нескольких блоков они выполняются последовательно public class Vehicle { public static final int MAX_SPEED = 150; private static int current. ID = 0; static { System. out. println("Vehicle loaded"); } private int id = ++current. ID; … } 26
ИНИЦИАЛИЗАЦИЯ КЛАССА Пример блока инициализации (демонстрирует статические переменные, методы и блоки) class Use. Static { 1 static int a = 3; static int b; static void meth(int x) { System. out. println("x = " + x); System. out. println("a = " + a); 5 System. out. println("b = " + b); } static { System. out. println( "Статический блок инициализиробан. 2 b = a * 4; 3 public static void main(String args[]) { meth(42); } } 4 27
ВЛОЖЕННЫЕ И ВНУТРЕННИЕ КЛАССЫ Вложенный класс определяется внутри другого класса Всложенный класс имеет доступ к членам класса (включая private-члены), в который он вложен Включающий класс не имеет доступа к членам вложенного класса Существует два типа вложенного класса Статический (имеет модификатор static – должен обращаться к членам своего включающего класса через объект, из-за чего редко используется) Нестатический 28
ВЛОЖЕННЫЕ И ВНУТРЕННИЕ КЛАССЫ Внутренний класс – нестатический вложенный класс, имеющий доступ ко всем переменным и методам своего внешнего класса Внутренний класс имеет возможность обращаться ко всем переменным и методам напрямую, таким же способом, как это делают другие нестатические члены внешнего класса Внутренний класс находится полностью в пределах видимости своего включающего класса 29
ВЛОЖЕННЫЕ И ВНУТРЕННИЕ КЛАССЫ Пример Демонстрирует внутренний класс class Outer { int outer_x = 100; void test() { Inner inner = new Inner(); inner. display(); } // это внутренний класс Внутренний класс Inner определен в пределах области видимости класса Outer class Inner { void display() { System. out. println("В методе display: outer_x = " + outer_x); } } } class Inner. Class. Demo { public static void main(String args[]) { Outer outer = new Outer(); Outer. test (); } } 30
ВЛОЖЕННЫЕ И ВНУТРЕННИЕ КЛАССЫ Члены внутреннего класса известны только в пределах внутреннего класса и не могут использоваться внешним классом. class Outer { int outer_x = 100; void test () { Inner inner = new Inner(); inner. display(); } // это внутренний класс class Inner { int у = 10; //у — локальная для Inner void display() { System. out. println("В методе display: outer_x = " + outer_x); } } void showy() { System. out. println(у); //ошибка, у здесь неизвестна! } } class Inner. Ciass. Demo { public static void main(String args[]) { Outer outer = new Outer(); outer. test(); } } 31
ВЛОЖЕННЫЕ И ВНУТРЕННИЕ КЛАССЫ Внутренние классы можно определять в пределах любого блока class Outer { int outer_x = 100; void test() { for(int i=0; i<10; i++) { class Inner ( void display() ( System. out. println("В методе display: outer_x = " + outer_x); } } Inner inner = new Inner(); inner. display(); } } } class Inner. Class. Demo { public static void main(String args[]) { Outer outer = new Outer(); outer. test (); } } 32
АНОНИМНЫЕ КЛАССЫ Анонимный класс не имеет имени и не может иметь явный конструктор. К анонимному классу невозможно обратиться извне объявляющего выражения, за исключением неявного обращения посредством объектной ссылки на суперкласс или интерфейс. Анонимные классы никогда не могут быть статическими, либо абстрактными, и всегда являются конечными классами. Каждое объявление анонимного класса уникально. Каждый анонимный класс объявляется внутри выражения. Анонимный класс определяет особый тип вложенности 33
АНОНИМНЫЕ КЛАССЫ Пример объявления анонимного класса class Base { void method 1() { } void method 2() { } } class A { // нормальный класс static class B { // статический вложенный класс } class C { // внутренний класс } void f() { class D { // локальный внутренний класс } } void g() { // анонимный класс Base bref = new Base() { void method 1() { } } ; } } Анонимный класс является подклассом существующего класса (Base) 34
СТРОКИ В Java строки являются объектами класса String Ряд строковых операций поддерживается на уровне языка неявное создание объекта String с помощью строкового литерала: "example" конкатенация строк с помощью операций + и += Объекты String является неизменяемыми Как правило, построение объектов String происходит не с помощью конструктора, а строковых литералов и операций над уже существующими строками Например: String my. String = "Это тест"; 35
Презентация_2_Классы_Вложенные_классы.ppt