ООП на Java.
Абстракция:
отображение
сущностей
реального
мира в нашу
программу – в
программе
создается упрощенная
модель
предметной
области.
Насколько
детальна
должна быть
эта модель? Зависит
от задачи.
Класс (class) – это новый тип данных. Определение класса содержит описание членов (members) этого класса:
· Поля класса (class fields)
· Методы класса (class methods)
· При надобности - внутренние классы и/или интерфейсы (inner classes and/or interfaces)
class MyClass {
// описание
членов
}
NB! Имена
классов, полей
и методов
должны
соответствовать
правилам Code Conventions for the Java Programming
Language reegleid.
NB! Программы,
которые
представляются
преподавателю,
должны быть
документированы
по правилам JavaDoc: Requirements for Writing Java API Specifications
ja How to Write
Doc Comments for the Javadoc
Tool.
Если имеется определение класса, то можно создавать объекты данного типа (instance):
MyClass instance1 = new
MyClass();
NB! Переменная instance1 – это
не сам
объект, а
ссылка на
месторасположение
этого
объекта в
динамической
памяти JVM (Java Virtual Machine).
NB! Хорошо
написанная
ОО программа
– это набор разнотипных
объектов,
которые посылают
друг другу
сообщения.
Everything is an Object! (Bruce Eckel, Thinking in Java).
Исключение – переменные примитивного типа:
Type |
Size |
Minimum |
Maximum |
Wrapper |
boolean |
— |
— |
— |
Boolean |
char |
16-бит |
Unicode 0 |
Unicode 216- 1 |
Character |
byte |
8-bit |
-128 |
+127 |
Byte |
short |
16-bit |
-215 |
+215 — 1 |
Short |
int |
32-bit |
-231 |
+231 — 1 |
Integer |
long |
64-bit |
-263 |
+263—1 |
Long |
float |
32-bit |
IEEE754 |
IEEE754 |
Float |
double |
64-bit |
IEEE754 |
IEEE754 |
Double |
void |
— |
— |
— |
Void |
Упражнение:
изучить
возможности
объектов
типа Integer
Конструкторы.
·
Конструктор имеется
в любом классе. Даже если
вы его
не написали,
компилятор
Java сам создаст
конструктор
по умолчанию
(default constructor), который, впрочем, пуст, он
не делает
ничего, кроме вызова
конструктора
суперкласса.
·
Конструктор выполняется
автоматически
при создании
экземпляра
класса, после распределения
памяти и обнуления
полей, но до начала использования
создаваемого
объекта.
·
Конструктор не
возвращает
никакого
значения.
Поэтому
в его описании
не пишется
даже слово
void , но можно задать
один из
трех модификаторов
public , protected или private .
·
Конструктор не
является
методом, он даже
не считается
членом класса. Поэтому его нельзя
наследовать
или переопределить
в подклассе.
class MyClass {
MyClass() { } // default constructor
//
описание членов
}
NB! Конструктор
можно
использовать
только в new!
NB! Создание экземляров
класса
возможно
практически
только с помощью
new!
Даже String s = „Tere tulemast“;
реализуется так: String s = new String(„Tere tulemast“);
Сигнатурой
метода (или
конструктора)
называют
набор,
который
состоит из
имени метода
и списка
типов
аргументов
этого метода.
Например:
MyClass(int, float);
NB! В каждом
классе все
методы и
конструкторы
должны иметь
разную
сигнатуру (methods overload).
class MyClass {
MyClass() {
/* teeb midagi */ }
MyClass(int n, float
x) { /* teeb ka midagi */ }
}
NB! Overload по типу
значения
метода
невозможен!
Ключевое
слово this.
Статические члены.
Упражнение: создать класс Thing, где каждый объект имеет порядковый номер – каким по порядку в ходу работы программы он создан. В этом классе должен быть метод, значением которого является количество уже созданных экземпляров класс Thing.
Статические
члены
являются глобальными
членами
класса:
· Статические члены существуют «всегда» - независимо от того, созданы ли экземпляры этого класса или нет.
· Обращение к статическим членам возможен и с помощью имени класс: Asi.getCounter().
· Статические методы «не видят» нестатических членов этого же класса (this!)
Вопрос: почему main() всегда статичен?
Пакеты (packages).
Исходный
код
программы
может
состоять из
нескольких java-файлов.
Эти файлы
могут быть
разбиты на
пакеты.
Принадлежность
java-файла
к пакету
определяется
первой строкой
кода
программы:
package mypackage;
По умолчанию, все java-файлы входят в пакет <default_package>
Чтобы
использовать
в программе
класс из другого
пакета,
необходимо
этот класс
импортировать:
import mypackage.*; // импортируются
все классы
пакета
import mypackage.MyClass; // импортируется
все один
класс
По умочанию
всегда импортруются
все классы из
пакета java.lang.*
NB!
Импортировать
можно только
публичные классы.
NB! В каждом java-файле жожет
быть не более
одного
публичного
класса.
Скрытие
реализации (Hidding The Impementation)
Типы
доступа к
членам
класса (access identifier):
·
private
· тип доступа не указан (package access)
·
protected
·
public
Класс User может использовать уже существующий класс Useful двумя разными способами: kasutada kahel erineval viisil:
1) как компоненту:
class User {
Useful uc = new Useful();
// ......
}
2) как родительский класс:
class User extends Useful {
//...... }
Видимость членов класса Useful в классе User следующая:
Klassi Useful
liikme ligipääsu määraja (access identifier) |
|
||
import kuskilt.Useful; |
Ei impordita - klass User on klassiga Useful samas package-is (kaustas) |
||
Kompositsioon: new Useful() |
Tuletamine: extends Useful |
||
private |
|
NO |
NO |
määraja puudub (package access) |
NO |
NO |
YES |
protected |
NO |
YES |
YES |
public |
YES |
YES |
YES |
Правило
правой руки: все, что
можно, объявите
приватым!
Упражнение:
докажите на
примере
«правильность»
вышеприведенной
таблицы.
Класс Object
В Java
есть специальный
суперкласс
Object и все
классы являются его подклассами.
Поэтому ссылочная
переменная
класса Object может
ссылаться
на объект
любого другого класса. Так как
массивы являются тоже классами,
то переменная
класса Object может
ссылаться
и на любой
массив.
У класса есть несколько
важных методов.
Методы getClass(),
notify(), notifyAll(),
wait() являются
финальными
и их нельзя
переопределять.
Метод toString()
Каждый класс
реализует
метод toString(), так
как он
определён
в классе Object. Но использовать
метод по умолчанию
не слишком
удобно, так как
не содержит
полезной
информации.
Разработчики
предпочитают
переопределять
данный метод под
свои нужды.
Сам метод
имеет форму:
public String toString()
Вам остаётся
возвратить
объект класса String, который будет содержать
полезную
информацию
о вашем классе.
Важная
особенность
компилятора
Ява: если в
выражении
типа String
встречается
объект
х
какого-то
другого типа,
то х автоматически
заменяется
на х.toString()