ООП на 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)

class User { ... }

 

import kuskilt.Useful;

 

Ei impordita - klass User on klassiga Useful samas package-is (kaustas)

Kompositsioon:

new Useful()

Tuletamine:

extends Useful

private

 

NO

 

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()

 

Разбираемся с hashCode() и equals()