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

Презентация:



Advertisements
Похожие презентации
Введение в объектно- ориентированное программирование на JAVA Макаревич Л. Г.
Advertisements

Типы данных Инна Исаева. Переменные Переменная - это как ящик, в котором можно хранить данные. Каждая переменная имеет своё имя, она служит для хранения.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Методология объектно- ориентированного программирования.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
Преобразования типов В языке C/C++ имеется несколько операций преобразования типов. Они используются в случае, если переменная одного типа должна рассматриваться.
Основы ООП и C# Работа с объектами и классами. Классы Класс специальный тип данных для описания объектов. Он определяет данные и поведение типа. Определение.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Практическое занятие 6. Функции. Большинство языков программирования используют понятия функции и процедуры. C++ формально не поддерживает понятие процедуры,
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Инструкции C++ Условная инструкция Формат: if (условие) оператор; else оператор; Пример: if (i!=0) { if (j) j++; if(k) k++; else if(p) k--; } else i--;
ОБЪЕКТНО- ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ (ООП) 1.
©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
Объектно-ориентированный подход в языке C#. Класс в языке C# - ссылочный тип, определенный пользователем. Для классов ЯП C# допустимо только единичное.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Лекция 3. Введение в C++ Примеры взяты из книги Брюса Эккеля Думаем на С++
b5_java_s4
Транксрипт:

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

Литература Брюс Эккель. Философия Java. Библ. программиста. СПб:Питер, с. Ноутон П., Шилдт Г. Java2. СПб:БХВ- Петербург, с. Морган М. Руководство разработчика. М.:Вильямс,2000 – 720 с. Дарвин Ян. Java Сборник рецептов для профессионалов.CПб:Питер,2002 – 768c. Смирнов Н. Java2. М.:ТриЛ, 2000,- 320 с И. Хабибуллин. Самоучитель JAVA. 3-е изд. перераб. и доп. – СПб.:БХВ- Петербург, – 768 с.: ил.

Отличия от С++ Java гораздо более последовательно воплощает парадигму объектно-ориентированного программирования, В Java отсутствуют некоторые свойства C++, делающие последний трудным для понимания и легким для ошибок (например, арифметика указателей), В Java введены некоторые дополнительные свойства, расширяющие его функциональность (например, нити и синхронизация). Платформа Java или среда выполнения Java (JRE - java runtime environment) - это набор программных средств, обеспечивающих выполнение Java- программы на любой аппаратной платформе и в среде любой ОС.

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

История Java OAK (1992) Java JDK (1995) Java JDK (1996) Java SDK ( ) J2SE (Java Standart Edition) – средство разработчика J2ME (Java Micro Edition) – для малогабаритных устройств J2EE (Java Enterprise Edition) – распределенные серверные приложения Java API состоит из 2 частей: базовых API и расширенных API Примерно 50 пакетов, более 1000 классов, каждый в среднем до 30 открытых методов Стандартные - javax, нестандартные

Свойства Java 1.0 Основные продукты: Java language specification, JLS, спецификация языка Java (описывающая лексику, типы данных, основные конструкции и т.д.); спецификация JVM (для создателей виртуальных машин); Java Development Kit, JDK - средство разработчика, состоящее в основном из утилит, стандартных библиотек классов и демонстрационных примеров. 8 стандартных библиотек: java.lang - базовые классы, необходимые для работы любого приложения (название - сокращение от language); java.util - многие полезные вспомогательные классы; java.applet - классы для создания апплетов; java.awt, java.awt.peer - библиотека для создания графического интерфейса пользователя, называется Abstract Window Toolkit; java.awt.image - дополнительные классы для работы с изображениями; java.io - работа с потоками данных (streams) и с файлами; java.net - работа с сетью.

Свойства Java 1.1 Java Beans – программные компоненты RMI – вызов удаленных методов (распределенные приложения) JDBC – связь с базами данных Сериализация – сохранение и восстановление объектов JNI- взаимодействие с кодами, написанными на других языках Reflection – определение методов, свойств объекта во время выполнения программы Защита – цифровые подписи, генерация ключей, список управления доступом Символьные потоки Измененная обработка событий Внутренние классы

Свойства Java 2 Swing – компоненты графического интерфейса (JFC) Коллекции Гибкая защита ( файлы policy) Интернационализация CORBA (ORB-посредник запросов, idl2java) Улучшение эффективности (JIT-компилятор, HotSpot-интерпретатор (высокоскоростная платформа), Native-компиляторы )

Основные особенности Java Объектно-ориентированный язык Платформо-независимый язык (записано однажды – работает везде) Облегченное изучение (похож на С++) Безопасность (нет указателей, не надо очищать память, GC) Устойчивость (проверка кода при компиляции и выполнении) Распределенность (обработка TCP/IP) Многопоточность (встроена в язык) Динамичность (легкость развития, добавления новых возможностей ) Интерпретируемость (байт-код, виртуальная JAVA-машина)

Java VM

Основные области памяти Java VM

Создание программы на Java /* The HelloWorldApp class implements an application that displays "Hello World!" to the standard output. */ public class HelloWorldApp { public static void main(String[] args) { // Display "Hello World!" System.out.println("Hello World!"); }

Компиляция и запуск приложения на Java Компиляция javac имя.java Запуск JVM java имя

Создание апплета на Java import java.applet.*; import java.awt.*; /** * The HelloWorld class implements an applet that * simply displays "Hello World!". */ public class HelloWorld extends Applet { public void paint(Graphics g) { // Display "Hello World!" g.drawString("Hello world!", 50, 25); } } A Simple Program Here is the output of my program: </HTML

Компиляция и запуск апплета на Java javac HelloWorld.java appletviewer Hello.html Открыть в браузере страницу Hello.html

Утилиты Java javac - компилятор языка java - запуск java-приложений javadoc – генератор документации appletviewer – просмотрщик апплетов jar - архиватор javap - дизассемблер jdb - отладчик

Отличия и сходства с С++ Комментарии //- строчный /* */- блочный /** */ - автоматическое создание документации вставляются HTML-теги, а также Ярлыки информация Ярлыки имя_класса#имя_переменной Ярлыки имя и имя_исключения Результат работы программы – HTML-файлы javadoc –help Место вставки – перед классом, перед переменной, перед методом

Зарезервированные идентификаторы abstractdoubleint strictfp ** booleanelseinterfacesuper breakextendslongswitch bytefinalnativesynchronized casefinallynewthis catchfloatpackagethrow charforprivatethrows class goto * protectedtransient const * ifpublictry continueimplementsreturnvoid defaultimportshortvolatile doinstanceofstaticwhile

Отличия и сходства с С++ Примитивные типы данных Тип ОписаниеРазмер (целые) byte Byte-length integer8-bit two's complement short Short integer16-bit two's complement int Integer32-bit two's complement long Long integer64-bit two's complement (вещественные) float Single-precision floating point32-bit double Double-precision floating point64-bit (другие) char A single character16-bit Unicode boolean A boolean value ( true or false ) true or false Ссылочные (reference)

Отличия и сходства с С++ Арифметические операторы Оператор Использование + op1 + op2 -op1 - op2 * op1 * op2 / op1 / op2 % op1 % op2 Оператор Использование ++op op --op op Оператор Использование ++op --op

Отличия и сходства с С++ Логические операторы и операторы отношения Оператор Использование > op1 > op2 >=op1 >= op2 <op1 < op2 <= op1 <= op2 ==op1 == op2 != op1 != op2 Оператор Использование &&op1 && op2 ||op1 || op2 !! op &op1 & op2 |op1 | op2 Битовые операторы Оператор Использование &op1 & op2 |op1 | op2 ~~op2 ^op1 ^ op2

Отличия и сходства с С++ Операторы сдвига Оператор ИспользованиеОписание >>op1 >> op2 <<op1 << op2 >>>op1 >>> op2 Беззнаковый сдвиг

Отличия и сходства с С++ Операторы присваивания Оператор ИспользованиеДействия = op1=op2 +=op1 += op2op1 = op1 + op2 -=op1 -= op2op1 = op1 - op2 *=op1 *= op2op1 = op1 * op2 /=op1 /= op2op1 = op1 / op2 %=op1 %= op2op1 = op1 % op2 &= op1 &= op2 op1 = op1 & op2 |=op1 |= op2op1 = op1 | op2 ^=op1 ^= op2op1 = op1 ^ op2 <<=op1 <<= op2op1 = op1 << op2 >>=op1 >>= op2op1 = op1 >> op2 >>>=op1 >>>= op2op1 = op1 >>> op2

Отличия и сходства с С++ Оператор ИспользованиеОписание ?:op1 ? op2 : op3 Если op1 true, возвращает op2, иначе возвращает op3. []type [] Объявляет массив с элементами типа type. []type[ op1 ] Создает массив с op1 элементами. Должен применяться с new. []op1[ op2 ] Доступ к элементу массива op1 с индексом op2..op1.op2Ссылка на поле op2 объекта op1. ()op1.op2(params) Вызов метода op2 объекта op1 со списком параметров. (type)(type) op1Преобразование op1 к типу type. newnew op1Создание нового объекта или массива. instanceof op1 instanceof op2 Возвращает true, если op1 типа op2 Другие операторы

Отличия и сходства с С++ Порядок выполнения операций Тип Операции Унарные! ~ () new Арифметические* / % + - Сдвиг > >>> Сравнение >= instanceof == != Побитовые& ^ | Логические&& || Тернарная?: Присваивание= "op=" (for example, *=, +=, %=, ^=)

Отличия и сходства с С++ Операторы управления Тип операторов управления Ключевые слова цикла while, do-while, for разветвления if-else, switch-case обработка исключений try-catch-finally, throw перехода break, continue, label:, return

Операторы if (логическое выражение) выражение или блок 1 else выражение или блок 2 switch(int value) { case const1: выражение или блок case const2: выражение или блок case constn: выражение или блок default: выражение или блок } while(логическое выражение) повторяющееся выражение, или блок; do повторяющееся выражение или блок; while(логическое выражение) for(выр. инициализации; условие; выражение обновления) повторяющееся выражение или блок; for(type k : коллекция) повторяющееся выражение или блок;

Операторы continue и break t: for(int i = 1; i< 5;i++) { for(int j = 1; j< 5;j++) { if( i*j > 5) continue t;... } t: for(int i = 1; i< 5;i++) { for(int j = 1; j< 5;j++) { if( i*j > 5) break t;... } lbl:{... if( val > maxVal) break lbl;...}

Массивы в Java

Описание ссылок на массив: double[] а, b; int I = 0, ar[], k = -1; Определение массива: а = new double[5]; b = new double[100]; ar = new int[50]; Инициализация: а[0] = 0.01; а[1] = -3.4; а[2] = 2.89; а[3] = 4.5; а[4] = -6.7; for (int i = 0; i < 100; i++) b[i] = 1.0 /i; for (int i = 0; i < 50; i++) ar[i] = 2 * i + 1; Первые два этапа можно совместить: double[] a = new double[5], b = new double[100]; int i = 0, ar[] = new int[50], k = -1;

Массивы в Java double[] а = {0.01, -3.4, 2.89, 4.5, -6.7}; Можно совместить второй и третий этап: а = new double[] {0.1, 0.2, -0.3, 0.45, -0.02}; Можно даже создать безымянный массив, сразу же используя результат операции new, например, так: System.out.println(new char[] {'H', 'e', '1', '1', 'o'}); Можно присваивать: а = b; double aMin = a[0], aMax = aMin; for (int i = 1; i < a.length; i++){ if (a[i] < aMin) aMin = a[i]; if (a[i] > aMax) aMax = a[i]; }

Отличия и сходства с С++ public class BreakDemo { public static void main(String[] args) { int[] arrayOfInts = { 32, 87, 3, 589, 12, 1076, 2000, 8, 622, 127 }; int search = 12; int i = 0; boolean found = false; for ( ; i < arrayOfInts.length; i++) { if (arrayOfInts[i] == search) { found = true; break; } } if (found) { System.out.println("Found " + search + " at index " + i); } else { System.out.println(search + "not in the array"); } } } Break без метки

Отличия и сходства с С++ public class BreakWithLabelDemo{ public static void main(String[] args) { int[][] arrayOfInts = { { 32, 87, 3, 589 }, { 12, 1076, 2000, 8 }, { 622, 127, 77, 955 } }; int search = 12; int i = 0, j=0; boolean found = false; search: for ( ; i < arrayOfInts.length; i++) { for (j = 0; j < arrayOfInts[i].length; j++) { if (arrayOfInts[i][j] == search) { found = true; break search; } } } if (found) System.out.println("Found " + search + " at " + i + ", " + j); else System.out.println(search + "not in the array"); } } Break c меткой

Массивы массивов int x[][]=new int[3][5]; // прямоугольная таблица А что получилось так? x[0]=new int[7]; x[1]=new int[0]; x[2]=null; Этот вариант лучше. int x[][]=new int[3][];

Преобразование типов для массивов

Клонирование массивов. Object.clone() protected native Object clone() throws CloneNotSupportedException; Пример 1. int a[]={1, 2, 3}; int b[]=(int[])a.clone(); a[0]=0; System.out.println(b[0]); // 1 Пример 2. int a[][]={{1, 2}, {3}}; int b[][]=(int[][]) a.clone(); if (...) { // первый вариант: a[0]=new int[]{0}; System.out.println(b[0][0]); } // ? else { // второй вариант: a[0][0]=0; System.out.println(b[0][0]); } // ?

import java.awt.*; import java.awt.event.*; import java.applet.*; import javax.swing.*; /* */ public class HelloDemo extends Applet { //JApplet public void paint (Graphics g) { g.drawString("Hello",20,50); } public static void main(String[]args) { JFrame hf=new JFrame(Привет!"); // hf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); hf.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0);} }); HelloDemo h=new HelloDemo(); hf.getContentPane().add(h); hf.setSize(200,100); hf.setVisible(true); } Создание апплета и приложения в одном классе

Дополнительные отличия от С++ Нет указателей Используются ссылки Выделение памяти под объекты только в куче Передача параметров по ссылке для всех типов, кроме примитивных Передача параметров по значению для примитивных типов

Компоненты и свойства объектно-ориентированного программирования

Объектно-ориентированный подход обладает преимуществами: уменьшение сложности программного обеспечения; повышение надежности программного обеспечения; обеспечение возможности модификации отдельных компонентов программного обеспечения без изменения остальных его компонентов; обеспечение возможности повторного использования отдельных компонентов программного обеспечения.

Компоненты ООП Объект - это инкапсулированная абстракция, которая включает информацию о состоянии и чётко определённое множество протоколов доступа (сообщения, которые обрабатывает объект). Сообщения - это специальный символ, идентификатор или ключевое слово, которое представляет выполняемое объектом действие. Класс - представляет определённый тип объектов и задаётся с помощью описания класса, которое определяет переменные состояния и протокол доступа к объектам данного класса. Классы организуются иерархически, причём подклассы наследуют свойства породивших их классов. Экземпляр объекта - объекты принадлежат к какому-либо классу. Свойства экземпляра объекта определяются описанием класса. Метод - метод существует для каждого сообщения, определенного для некоторого класса. Метод определяет реакцию объекта на сообщение. Объекты обрабатывают сообщения в соответствии с методами, заданными в описании класса.

Основные свойства объектно- ориентированного языка Абстракция Инкапсуляция (сокрытие реализации) Наследование Полиморфизм Перегрузка функций (функциональный полиморфизм) Шаблоны (параметрический полиморфизм) Виртуальные методы

Достоинства ООП Классы позволяют проводить конструирование из полезных компонентов, обладающих простыми инструментами, что позволяет абстрагироваться от деталей реализации. Данные и операции над ними образуют определенную сущность, и они не разносятся по всей программе, а описываются вместе. Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения. Инкапсуляция позволяет привнести свойство модульности, что облегчает распараллеливание выполнения задачи между несколькими исполнителями и обновление версий отдельных компонентов. ООП дает возможность создавать расширяемые системы. Это одно из основных достоинств ООП, и именно оно отличает данный подход от традиционных методов программирования. Расширяемость означает, что существующую систему можно заставить работать с новыми компонентами, причем без внесения в нее каких-либо изменений. Компоненты могут быть добавлены на этапе исполнения программы.

Достоинства ООП Полиморфизм оказывается полезным преимущественно в следующих ситуациях: Обработка разнородных структур данных. Программы могут работать, не различая вида объектов, что существенно упрощает код. Новые виды могут быть добавлены в любой момент. Изменение поведения во время исполнения. На этапе исполнения один объект может быть заменен другим, что позволяет легко, без изменения кода, адаптировать алгоритм в зависимости от того, какой используется объект. Реализация работы с наследниками. Алгоритмы можно обобщить настолько, что они уже смогут работать более чем с одним видом объектов. Создание "каркаса" (framework). Независимые от приложения части предметной области могут быть реализованы в виде набора универсальных классов, или каркаса (framework), и в дальнейшем расширены за счет добавления частей, специфичных для конкретного приложения.

Достоинства ООП ООП позволяет извлечь максимум из многоразового использования компонентов. Сокращается время на разработку, которое может быть отдано другим задачам. Компоненты многоразового использования обычно содержат гораздо меньше ошибок, чем вновь разработанные, ведь они уже не раз подвергались проверке. Когда некий компонент используется сразу несколькими клиентами, улучшения, вносимые в его код, одновременно оказывают положительное влияние и на множество работающих с ним программ. Если программа опирается на стандартные компоненты, ее структура и пользовательский интерфейс становятся более унифицированными, что облегчает ее понимание и упрощает использование.

Недостатки ООП Документирование классов - задача более трудная, чем это было в случае процедур и модулей. Поскольку любой метод может быть переопределен, в документации должно говориться не только о том, что делает данный метод, но и в каком контексте он вызывается. В сложных иерархиях классов поля и методы обычно наследуются с разных уровней. Не всегда легко определить, какие поля и методы фактически относятся к данному классу. Если класс расширяется, то каждый метод обычно сокращают перед передачей сообщения базовому классу. Реализация операции, таким образом, рассредоточивается по нескольким классам, и чтобы понять, как она работает, приходится внимательно просматривать весь код. Методы, как правило, короче процедур, поскольку они осуществляют только одну операцию над данными, зато их намного больше. В коротких методах легче разобраться, но они неудобны тем, что код для обработки сообщения иногда "размазан" по многим маленьким методам. Инкапсуляцией данных не следует злоупотреблять. Чем больше логики и данных скрыто в недрах класса, тем сложнее его расширять. Отправной точкой здесь должно быть не то, что клиентам не разрешается знать о тех или иных данных, а то, что клиентам для работы с классом этих данных знать не требуется.

Классы

Разграничение доступа в Java В Java модификаторы доступа указываются для: типов (классов и интерфейсов) объявления верхнего уровня; элементов ссылочных типов (полей, методов, внутренних типов); конструкторов классов. Уровни доступа: public; private; protected; если не указан ни один из этих трех типов, то уровень доступа определяется по умолчанию (default). Модификаторы различных элементов языка Пакеты доступны всегда, поэтому у них нет модификаторов доступа. Типы (классы и интерфейсы) верхнего уровня объявления: public или default. Если доступ к типу является public, то это означает, что он доступен из любой точки кода. Иначе уровень доступа назначается по умолчанию: тип доступен только внутри того пакета, где он объявлен. Элементы и конструкторы объектных типов обладают всеми четырьмя возможными значениями уровня доступа. Все элементы интерфейсов являются public.

Описание классов [ модификатор] class имя-класса {тело класса} Модификаторы класса: public, abstract, final Модификаторы вложенного класса: protected, private, static. Тело класса может содержать объявления элементов: полей; внутренних типов (классов и интерфейсов); конструкторов; методов; инициализаторов; статических инициализаторов. Модификаторы полей: public, protected, private, static, final, transient, volatile. Модификаторы методов: public, protected, private, abstract, static, final, synchronized, native.

Классы в Java Доступ к членам класса: public private protected по умолчанию Поля класса: Поля класса: final static volatile transient Методы класса: Методы класса: final static abstract native synchronized

Описание полей Объявление полей класса: private int a; public int b=3, c=b+5, d; Point p, p1=null, p2=new Point(); Поле с модификатором final: final double PI=3.1415; Возможно обращение к различным функциям, например: final long creationTime = System.currentTimeMillis(); Значения полей по умолчанию: для числовых полей примитивных типов – 0; для булевского типа – false; для ссылочных – null.

Описание методов [модификатор] заголовок {тело метода} Заголовок состоит из: типа возвращаемого значения или ключевого слова void; имени метода; списка аргументов в круглых скобках (аргументов может не быть); специального throws-выражения. public final java.awt.Point createPositivePoint(int x, int y) throws IllegalArgumentException { return (x>0 && y>0) ? new Point(x, y) : null;} Передача параметров в метод: по значению; по ссылке.

Описание методов Переопределение методов. Реализация полиморфизма abstract class Pet { abstract void voice(); } class Dog extends Pet void voice(){ System.out.println(gav-gav!); } class Cat extends Pet void voice(){ System.out.println(miaou-miaou!); } Перегрузка методов: class Point { void get() {} void get(int x) {} void get(int x, double y) {} void get(double x, int y) {} } public class Test { public static void main(String[] args) { Pet[] singer=new Pet[3]; singer[0]=new Dog(); singer[1]=new Cat(); singer[2]=new Dog(); for(int i=0; i<singer.length; i++) singer[i].voice(); }

Создание объектов класса /** учебный пример */ class Point { private int x, y; public void setX(int ax) { x = ax; } public void setY(int ay) { y = ay; } public void print() { System.out.println(Точка с координатами x= + x +,y= + y); } class TwoPoint { public static void main(String[] args) { Point p1=new Point(); Point p2=new Point(); p1.setX(55); p2.setX(4); p1.setY(77); p2.setY(6); p1.print(); p2.print(); new Point().print(); }

Конструкторы класса Тело конструктора может начинаться: с вызова одного из конструкторов суперкласса - пишется слово super() с параметрами конструктора суперкласса; c вызова другого конструктора этого же класса - записывается слово this() с параметрами в скобках, если они нужны. class Complex { private static final double EPS = 1e-12; private double re, im; Complex(double re, double im) { this.re=re; this.im=im; } Complex(double re) { this(re, 0.0); } Complex() { this(0.0, 0.0); } Complex(Complex z) { this(z.re, z.im); } } public class Parent { private int x, y; //конструкторы public Parent() { x=y=0; } public Parent(int newx, int newy) { x=newx; y=newy; } public class Child extends Parent { //конструкторы public Child() { super(); } public Child(int newx, int newy) { super(newx, newy); }

Конструкторы класса class Point { private int x, y; public void setX(int ax){x=ax;} public void setY(int ay){y=ay;} public void print() { System.out.println(Точка с координатами x=+x+,y=+y); } Point(int x,int y) { this.x=x; this.y=y; } Point(int a) { this.x=this.y=a; } Point() { x = y = 0; } } Point p1=new Point(); Point p2=new Point(55,77); Point p3=new Point(33); Point [] parr = new Point[45]; p1 = parr[5]; int x = parr[5].x; int arri[] = new int[55]; int k = arri[4]; NullPointerException

Инициализация переменных При объявлении Блоки инициализации Конструкторы Порядок выполнения class Point { private int x=33, y=55; public void print() { System.out.println(Точка с координатами x=+x+,y=+y); } Point(int x,int y){this.x=x; this.y=y;} Point(int a){this.x=this.y=a;} {// блок инициализации x=99; y=77; }

Инициализаторы public class Test { private int x, y, z; { // инициализатор объекта x=3; if (x>0) y=4; z=Math.max(x, y); } инициализаторы не имеют имен; исполняются при создании объектов; не могут быть вызваны явно; не передаются по наследству. class UseStatic { static int a = 3; static int b; static { System.out.println(Статический блок инициализации); b = a * 4; } static void method(int x) { System.out.println( x = + x); System.out.println( a = + a); System.out.println( b = + b); } public static void main(String[] args) { method(42); } }

Область видимости переменных class Variables { static int x=9, y;// известны во всех блоках и методах класса, y=0 static {//блок иниц. стат. переменных x= 99; } int a=1, p;// поля экземпляра, известны во всех методах и блоках класса, если //не перекрыты другими одноименными переменными. p=0; { p = 999;// блок иниц. экземпляра. Выполняется при создании экземпляра //после static блоков до вызова конструктора. Нужен для безымянных }//внутренних классов, где нет конструктора. static void f(int b) { int a=2;//перекрывает поле класса int c;// известна только в методе и не иниц. {int c=3;// ошибка! int x=888;//лок переменная блока }// здесь х уже нет for(int d=0; d<10; d++){ //d известна только в блоке int a=4//ошибка int e=5;//лок. перем. блока e++; }//здесь d и е уже нет }

Деструктор protected void finalize() throws ThrowableThrowable class Point { //… protected void finalize() throws ThrowableThrowable { System.out.println(Умираю – я точка:x=+x+,y=+y); super.finalize(); }

Статические члены класса public class StaticDemo { int x; static int count=0; static { count=0; } StaticDemo(int k){x=k; count++;} static int getCount(){return count;} protected void finalize() throws Throwable { count--; super.finalize(); } public static void main(String[]args) { StaticDemo sd1=new StaticDemo(55); System.out.println(StaticDemo.getCount()); StaticDemo sd2=new StaticDemo(66); System.out.println(StaticDemo.getCount()); StaticDemo sd3=new StaticDemo(77); System.out.println(StaticDemo.getCount()); sd1=null; System.gc(); try { Thread.sleep(1000); }catch(Exception e){} System.out.println(StaticDemo.getCount()); } Особенности статических методов: в статическом методе нельзя использовать ссылки super и this; статические методы могут вызывать только статические методы; должны обращаться только к статическим данным; статические методы должны переопределяться только статическими.

Класс Матн static double absabs(double a) static float absabs(float a) static int absabs(int a) static long absabs(long a) static double acosacos(double a) static double asinasin(double a) static double atanatan(double a) static double atan2atan2(double y, double x) static double ceilceil(double a) static double coscos(double a) static double expexp(double a) static double floorfloor(double a) static double loglog(double a) static double maxmax(double a, double b) static float maxmax(float a, float b) static int maxmax(int a, int b). static long maxmax(long a, long b) static double minmin(double a, double b) static float minmin(float a, float b) static int minmin(int a, int b) static long minmin(long a, long b) static double powpow(double a, double b) static double randomrandom() static double rintrint(double a). static long roundround(double a) java.lang.Object java.lang.Object | +--java.lang.Math static double E PI Methods inherited from class java.lang.ObjectObject static int roundround(float a) static double sinsin(double a) static double sqrtsqrt(double a) static double tantan(double a) static double toDegreestoDegrees(double angrad) static doubletoRadianstoRadians(double angdeg)

Наследование class Point { protected int x, y; public void print() { System.out.println(Точка с координатами x=+x+,y=+y); } Point(int x,int y){this.x=x; this.y=y;} Point(int a){this.x=this.y=a;} Point(){x=y=0;} } class Point3D extends Point { private int z; public void print() { System.out.println(Точка с координатами x=+x+,y=+y+z=+z); } Point3D(int x,int y,int z) {super(x,y); this.z=z;} Point3D(int a) {super(a); z=a;} Point3D() {super(0); z=0;} double distance(){return Math.sqrt(x*x+y*y+z*z);} }

Обращение к скрытым членам суперкласса, перекрытие методов class Super { int aNumber; void f(int k){} } class Subbie extends Super { float aNumber; void f(int k){super.f(); /*…*/} } super.aNumber public class Stack { private Vector items; //overrides Object's toString method public String toString() { int n = items.size(); StringBuffer result = new StringBuffer(); result.append("["); for (int i = 0; i < n; i++) { result.append(items.elementAt(i).toString()); if (i < n-1) result.append(","); } result.append("]"); return result.toString(); } }

Запрет перекрытия методов и наследования final class ChessAlgorithm {... final void nextMove(ChessPiece pieceMoved, BoardLocation newLocation) {... }... } final class ChessAlgorithm {... }

Методы и классы abstract abstract class A { int i; abstract void f(); int getI() {return i;} } class B extends A { void f() {i++;} } class Demo { public static void main(String [] args) { B b; b.i=55; b.f(); //A a; }

Самостоятельная работа Проверить, вызываются ли конструкторы базового класса при наследовании, если явно вызов конструктора не задавать. Какие конструкторы вызываются?