Добавил:
ПОИТ 2016-2020 Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Пацей 4 сем / Лекции / СТПI_2_ООП

.pdf
Скачиваний:
70
Добавлен:
29.04.2018
Размер:
15.18 Mб
Скачать

Возможная реализация

public class Card { protected int sum; protected int number;

public Card getCard() { return new Card(); }

public boolean equals(Object obj) { if (this == obj) //рефлексивность

return true;

if (obj == null) // нулева ссылка

return false;

if (getClass() != obj.getClass()) // проверка типа

return false;

Card other = (Card) obj; if (sum != other.sum)

return false;

if (number != other.number)

return false;

else return true;

}

}

hashCode() - соглашения

1)все одинаковые по содержанию объекты одного типа должны иметь одинаковые хэш-коды;

2)различные по содержанию объекты одного типа могут иметь различные

хэш-коды;

3) во время работы приложения значение хэш-кода объекта не изменяется,

если объект не был изменен.

Соглашения по toString()

1)стандартная информация о пакете (опционально)

2)имя класса (опционально)

3)значения полей объекта

// в Object

getClass().getName() + '@' + Integer.toHexString(hashCode())

Клонирование объектов

1) Реализация интерфейса Cloneable

(С++ КК)

не содержит методов (помеченным (tagged) интерфейсам)

clone() класса Object воспроизводит

значения всех его полей может генерировать исключение

CloneNotSupportedException

объект создается без вызова конструктора

public class Card implements Cloneable{ protected int sum;

protected int number;

@Override

public Object clone() throws CloneNotSupportedException { // переопределение

return super.clone(); // вызов базового метода

}

}

//..

try{ temp = (Card)temp.clone();}

catch (CloneNotSupportedException e){}

}

Может применяться для базовых типов, оболочек, неизменяемых (immutable) объектных типов

«Неглубокое» и «глубокое» клонирование

int

new String

int

new String

 

String

 

String

 

 

 

 

 

 

int

new String

int

String

 

String

 

 

2) Клонировать объект поля класса (реализация в суперклассе

public class Card implements Cloneable{ protected int sum;

protected int number;

private ArrayList<Integer> history = new ArrayList<>();

public Card clone() throws //метод замещения

CloneNotSupportedException { // переопределение Card copy = null;

try {

copy = (Card)super.clone();

copy.history = (ArrayList<Integer>)history.clone(); } catch (CloneNotSupportedException e) {

//"не реализован интерфейс Cloneable !";

}

return copy; }

} class CardRunner{

public static void main(String[] args) { Card temp =new Card();

try{ temp = (Card)temp.clone();}

catch (CloneNotSupportedException e){}

}

}

«Сборка мусора»

1) форсировать невозможно, можно рекомендовать

System.gc(); Runtime.getRuntime().gc(); System.runFinalization();

// finalize для объектов без ссылок

2) освободить внешние ресурсы – try-finally и autocloseable

3) protected void finalize()

вызывается перед «сборкой мусора

метод может быть вообще не выполнен!

если возникнет исключительная ситуация, она будет проигнорирована

public class Card implements Cloneable{

// ...

protected void finalize() throws Throwable { try {

// код освобождения ресурсов

System.out.println("объект будет удален");

}finally { super.finalize();

}}

//...

Card temp

= new Card();

Card

newC

= new Card();

newC

= temp;

newC.finalize();

ВНУТРЕННИЕ КЛАССЫ

Нестатические вложенные классы называются внутренними (inner).

public class DebetCatd {

private Dogovor dog;

// abstract, final, private, protected - допустимы

public class Dogovor { // определение внутреннего (inner) класса // поля и методы

public void sign() {

System.out.println("Подписание");

} } // конец объявления внутреннего класса

public final void init() { // метод внешнего класса

dog = new Dogovor(); dog.sign();

}

public static void main(String[] args) {

DebetCatd.Dogovor s12 = new DebetCatd().new Dogovor();

}

Соседние файлы в папке Лекции