Пацей 4 сем / Лекции / СТПI_2_ООП
.pdfИспользование super и this
public class Card { protected int sum;
public int getSum(){ return sum;}
public void doPay(double amountPayment) { System.out.println("complete payment");
}
}
class CreditCard extends Card { public CreditCard(int a){
super(); //полько один раз
// только первая строка
//только к ближайшему по цепочке int iHave = super.sum;
//обращение к полю суперкласса super.getSum();//обр. к методу суперкласса –
// м.б. по цепочке
}
}
class CreditCard extends Card {
public CreditCard(int sum){ super();
int iHave = super.sum; super.getSum();
this.sum = sum;
}
public CreditCard(){
this(0); //д.б. одна и первая
// обращение к super() невозможно
}
1)Для обращения к полям
2)Длявызова конструкторов
Полиморфизм
►перегружаемый - overloading ►переопределенный – overriding
Все методы Java являются виртуальными (virtual не используется)
public class Card { protected int sum;
public int getSum() {return sum; } @Override
public String toString (){ return "You have "+ sum;
} |
|
|
|
} |
|
You have 0 |
|
class CreditCard extends Card { |
|
||
|
You have 0 and 2000000 |
||
public CreditCard(int sum){ |
} |
||
|
|||
public CreditCard(){ this(0); |
} |
|
|
@Override |
|
|
public String toString(){
return super.toString()+" and 2000000"; }
}
//...
Card a23 = new Card();
CreditCard b12 = new CreditCard(20); System.out.println(a23.toString()); a23=b12;
System.out.println(a23.toString()); }
}
Методы подставки
При переопределении методов можно указывать другой тип возвращаемого значения – но только тип, находящийся ниже в иерархии наследования, чем исходный тип.
public class Card { protected int sum;
public Card getCard(){ return new Card();
}
}
class CreditCard extends Card {
@Override
public CreditCard getCard(){ return new CreditCard();
}
}
// ...
версия метода определяется «ранним связыванием» без использования полиморфизма
Carda23 = new Card();
Card newa23 = a23.getCard(); a23 = new CreditCard();
CreditCard newCredit = a23.getCard(); //ошибка статическа
//идентификация, полиморфизм не работает
CreditCard newCreda23 = (new CreditCard()).getCard();
«Переопределение» статических методов
Динамический полиморфизм к статическим методам класса неприменим (определение на этапе компиляции)
Статические методы всегда следует вызывать через имя класса
Абстрактные классы
1)Содержат: объявления абстрактных методов (реализованы в подклассах), полностью реализованные методы, конструкторы и поля данных
2)объекты создать нельзя
3)допустимо объявлять ссылку на абстрактный класс - инициализировать объектом подкласса
public abstract class AbstractCard { private long id;
public abstract boolean check();
}
Переопределение из Object для информационных классов
protected Object clone() ;
public boolean equals(Object ob) public Class<? extends Object> getClass() protected void finalize()
public int hashCode()
public String toString()
notify(), notifyAll() и wait(), wait(int millis)
Соглашения по equlas
//релизация из Object
public boolean equals(Object obj) { return (this == obj);
}
►рефлексивность ►симметричность ►транзитивность
►непротиворечивость
► ненулевая ссылка при сравнении с
литералом null всегда возвращает значение false