Пацей 4 сем / Лекции / СТПI_2_ООП
.pdfВозможная реализация
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();
}