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

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

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

Использование 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

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