close

Вход

Забыли?

вход по аккаунту

?

Объектно-ориентированное

код для вставкиСкачать
Объектно-ориентированное
программирование на JAVA
Литература
Брюс Эккель. Философия Java. Библ.
программиста. СПб:Питер,2001-880с.
Ноутон П., Шилдт Г. Java2. СПб:БХВПетербург,2000-1072 с.
Морган М. Руководство разработчика.
М.:Вильямс,2000 – 720с.
Дарвин Ян. Java Сборник рецептов для
профессионалов.CПб:Питер,2002 – 768c.
Смирнов Н. Java2. М.:ТриЛ, 2000,- 320с
И. Хабибуллин. Самоучитель JAVA. 3-е
изд. перераб. и доп. – СПб.:БХВПетербург, 2008. – 768 с.: ил.
Отличия от С++
Java гораздо более последовательно воплощает
парадигму объектно-ориентированного
программирования,
В Java отсутствуют некоторые свойства C++,
делающие последний трудным для понимания и
легким для ошибок (например, арифметика
указателей),
В Java введены некоторые дополнительные
свойства, расширяющие его функциональность
(например, нити и синхронизация).
Платформа Java или среда выполнения Java (JRE
- java runtime environment) - это набор программных
средств, обеспечивающих выполнение Javaпрограммы на любой аппаратной платформе и в
среде любой ОС.
Основные типы программ, создаваемые
на Java
Приложения
Апплеты
Сервлеты
Программы, выполняющиеся в
средах других продуктов
программного обеспечения
История Java
OAK (1992)
Java JDK 1.0 -1.0.2(1995)
Java JDK 1.1-1.1.9(1996)
Java SDK 1.2-1.4 (1997-1999)
J2SE (Java Standart Edition) – средство разработчика
J2ME (Java Micro Edition) – для малогабаритных устройств
J2EE (Java Enterprise Edition) – распределенные серверные
приложения
Java API состоит из 2 частей: базовых API и
расширенных API
Примерно 50 пакетов,
Стандартные - javax,
более 1000 классов,
нестандартные
каждый в среднем до
30 открытых методов
Свойства 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!".
*/
<HTML>
public class HelloWorld extends Applet
<HEAD>
{
<TITLE>A Simple Program
public void paint(Graphics g)
</TITLE>
{
</HEAD>
// Display "Hello World!"
<BODY>
g.drawString("Hello world!", 50, 25);
Here is the output of my
}
program:
}
<APPLET
CODE="HelloWorld.class"
WIDTH=150 HEIGHT=25>
</APPLET>
</BODY>
</HTML
Компиляция и запуск апплета на
Java
javac HelloWorld.java
appletviewer
Hello.html
Открыть в браузере
страницу Hello.html
Утилиты Java
javac - компилятор языка
java - запуск java-приложений
javadoc – генератор документации
appletviewer – просмотрщик апплетов
jar - архиватор
javap - дизассемблер
jdb - отладчик
Отличия и сходства с С++
Комментарии
//
- строчный
/*
*/
- блочный
/**
*/
- автоматическое создание документации
вставляются HTML-теги, а также ярлыки @
Ярлыки класса
@see имя_класса
@version информация
@author информация
@since информация
Ярлыки переменных
@see имя_класса#имя_переменной
Ярлыки методов
@see имя_класса#имя_метода
@param имя и описание
@return описание
@throws имя_исключения описание
@deprecated
Результат работы программы – HTML-файлы
javadoc –help
Место вставки – перед классом, перед переменной, перед
методом
Зарезервированные
идентификаторы
abstract
double
int
strictfp **
boolean
else
interface
super
break
extends
long
switch
byte
final
native
synchronized
case
finally
new
this
catch
float
package
throw
char
for
private
throws
class
goto *
protected
transient
const *
if
public
try
continue
implements
return
void
default
import
short
volatile
do
instanceof
static
while
Отличия и сходства с С++
Примитивные типы данных
Тип
Ссылочные (reference)
Описание
Размер
(целые)
byte
Byte-length integer
8-bit two's complement
short
Short integer
16-bit two's complement
int
Integer
32-bit two's complement
long
Long integer
64-bit two's complement
(вещественные)
float
Single-precision floating point
32-bit
double
Double-precision floating point
64-bit
(другие)
char
A single character
16-bit Unicode
boolean
A boolean value (true or false)
true or false
Отличия и сходства с С++
Арифметические операторы
Оператор
Использование
+
op1 + op2
-
op1 - op2
*
op1 * op2
/
op1 / op2
%
op1 % op2
Оператор
Использование
+
+op
-
-op
Оператор
Использование
++
op++
++
++op
--
op--
--
--op
Отличия и сходства с С++
Логические операторы и операторы отношения
Оператор Использование
&&
op1 && op2
||
op1 || op2
!
! op
&
op1 & op2
|
op1 | op2
Битовые операторы
Оператор
Использование
>
op1 > op2
>=
op1 >= op2
<
op1 < op2
<=
op1 <= op2
==
op1 == op2
!=
op1 != op2
Оператор
Использование
&
op1 & op2
|
op1 | op2
~
~op2
^
op1 ^ op2
Отличия и сходства с С++
Операторы сдвига
Оператор
Использование
>>
op1 >> op2
<<
op1 << op2
>>>
op1 >>> op2
Описание
Беззнаковый сдвиг
Отличия и сходства с С++
Операторы присваивания
Оператор
Использование
Действия
=
op1=op2
+=
op1 += op2
op1 = op1 + op2
-=
op1 -= op2
op1 = op1 - op2
*=
op1 *= op2
op1 = op1 * op2
/=
op1 /= op2
op1 = op1 / op2
%=
op1 %= op2
op1 = op1 % op2
&=
op1 &= op2
op1 = op1 & op2
|=
op1 |= op2
op1 = op1 | op2
^=
op1 ^= op2
op1 = op1 ^ op2
<<=
op1 <<= op2
op1 = op1 << op2
>>=
op1 >>= op2
op1 = op1 >> op2
>>>=
op1 >>>= op2
op1 = 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.
new
new 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
Массивы в 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;
Break без
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");
}
}
}
метки
Отличия и сходства с С++
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:
Break c меткой
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");
}
}
Массивы массивов
int x[][]=new int[3][5];
А что получилось так?
x[0]=new int[7];
x[1]=new int[0];
x[2]=null;
Этот вариант лучше.
int x[][]=new int[3][];
// прямоугольная таблица
Преобразование типов для
массивов
Тип
переменной
Допустимые типы ее значения
Массив простых null
чисел
в точности совпадающий с типом переменной
Массив
null
ссылочных
совпадающий с типом переменной
значений
массивы ссылочных значений, удовлетворяющих
следующему условию: если тип переменной –
массив на основе типа A, то значение типа массив на
основе типа B допустимо тогда и только тогда, когда
B приводимо к A
Object
null
любой ссылочный, включая массивы
Клонирование массивов.
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.*;
/*
<applet code=HelloDemo width=200 height=100>
</applet>
*/
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 {
@Override
void voice(){
System.out.println(“gav-gav!”);
}
}
class Cat extends Pet {
@Override
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 TwoPoint
*/
class Point
public static void main(String[] args)
{
{
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 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;
static {
x= 99;
}
int a=1, p;
{ p = 999;
// известны во всех блоках и методах класса, y=0
//блок иниц. стат. переменных
// поля экземпляра, известны во всех методах и блоках класса, если
//не перекрыты другими одноименными переменными. p=0;
// блок иниц. экземпляра. Выполняется при создании экземпляра
//после 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 Throwable
class Point
{
//…
protected void finalize() throws Throwable
{
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;
статические методы могут вызывать только статические методы;
должны обращаться только к статическим данным;
статические методы должны переопределяться только статическими.
Класс Матн
java.lang.Object
|
+--java.lang.Math
static double
static double
E
PI
static double abs(double a) static double max(double a, double b)
static float
static float abs(float a)
static int abs(int a)
static int
static long abs(long a)
static long
max(float a, float b)
max(int a, int b)
.
max(long a, long b)
static double acos(double a)static double min(double a, double b)
static double asin(double a)
static float
static double atan(double a)
static int
min(float a, float b)
min(int a, int b)
static int
round(float a)
static double
sin(double a)
static double atan2(double y, static long
min(long a, long b)
double x)
static double
sqrt(double a)
static double ceil(double a)
tan(double a)
static double cos(double a)
static double
static double
static double
toDegrees(double static double
angrad)
static double
exp(double a)
toRadians(double static double
angdeg)
log(double a)
static double
pow(double a, double b)
static double
random()
static double
rint(double a)
floor(double a)
static long
.
round(double a)
Наследование
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;
}
}
Самостоятельная работа
Проверить, вызываются ли
конструкторы базового класса при
наследовании, если явно вызов
конструктора не задавать. Какие
конструкторы вызываются?
Документ
Категория
Презентации
Просмотров
10
Размер файла
410 Кб
Теги
1/--страниц
Пожаловаться на содержимое документа