Завантажити

Download Report

Transcript Завантажити

Лекція 3. Наслідування
План лекції:
1. Підкласи та суперкласи
2. Доступ до елементів
3. Конструктори і наслідування
4. Багаторівнева ієрархія
5. Переозначення методів
6. Динамічне управління методами
7. Абстрактні класи
8. Ключове слово final
1
Підкласи та суперкласи
Наслідування – механізм, який дозволяє
отримувати властивості інших об’єктів
одним
об’єктам
Суперклас – клас, що наслідується
Підклас – клас, що виконує наслідування (отримує властивості
суперкласу)
Реалізація наслідування
після імені підкласу вказується ключове слово extends і ім’я
суперкласу:
class A extends B{
// код
}
В Java, на відміну від С++, немає багатократного наслідування!
В Java, як і в С++, існує багаторівневе наслідування
2
Підкласи та суперкласи - приклад
class A{ // суперклас
int i,j;
void showij(){
System.out.println(“i та j: ”+i+” ”+j);
}
}
class B extends A{ // підклас
int k;
void showk(){
System.out.println(“k: ”+k);
}
void sum(){
System.out.println(“i+j+k=”+(i+j+k));
}
}
Зверніть увагу!
class AB{
public static void main(String arg[]){
A SuperObj=new A();
B SubObj=new B();
SuperObj.i=10;
SuperObj.j=20;
SuperObj.showij();
SubObj.i=7;
SubObj.j=8;
SubObj.k=9;
SubObj.showij();
SubObj.showk();
SubObj.sum();
}
}
ЗАПУСТИТИ
3
Доступ до елементів
Підклас не може звертатись до private-членів суперкласу
Змінна суперкласу може посилатись на об’єкт підкласу
До яких членів можна звертатись, визначається типом змінноїпосилання, а не типом об’єкту, на який вона посилається
Ключове слово super – посилання на суперклас в межах підкласу.
Існує два способи використання ключового слова super:
Некоректне звернення до
1. Виклик конструктора суперкласу
2. Звернення до елементу суперкласу поля підкласу через змінну
суперкласу
Звернення до
class A{
private-елементу
int i;
private int j;
}
class AB2{
public static void main(String args[]){
A a=new A();
B b=new B();
a=b;
class B extends A{
a.i=10;
int k;
//a.j=20; a.k=30;
недопустимі команди
void show(){
b.k=40;
System.out.println(i+”:”+k);}
ЗАПУСТИТИ
b.show();}}
}
4
Конструктори і наслідування
class Box{
При
створенні
конструктора
підкласу
private double width; необхідно передбачити механізм виклику
private
height; конструктора суперкласу.
class double
BoxWeightDemo{
private
depth;
publicdouble
static void
main(String args[]){
Box(Box
obj){width=obj.width;
height=obj.height; depth=obj.depth;}
BoxWeight
obj1=new BoxWeight();
Box(){width=height=depth=-1;}
BoxWeight obj2=new BoxWeight(10,3);
Box(double
h,double
d){width=w; height=h; depth=d;}
BoxWeightw,double
obj3=new
BoxWeight(5,15,25,100);
Box(double
BoxWeightsize){width=height=depth=size;}
obj4=new BoxWeight(obj3);}
double
volume(){return width*height*depth;}
}
void get(){System.out.print(width+”:”+height+”:”+depth);}}
class BoxWeight extends Box{ Виклик конструктора суперкласу з підкласу:
super(аргументи конструктора суперкласу)
double weight;
void show(){get();
System.out.println(”:”+weight);}
BoxWeight(BoxWeight obj){super(obj); weight=obj.weight/2; show();}
BoxWeight(){super(); weight=-1; show();}
BoxWeight(double w,double h,double d,double m){
super(w,h,d); weight=m; show();}
BoxWeight(double size,double m){
ЗАПУСТИТИ
5
super(size); weight=m; show();}}
Посилання на елемент суперкласу
class A{
int i;
}
class B extends A{
Зверніть увагу!
int i;
B(int a,int b){
Змінна з суперкласу
super.i=a;
i=b;}
Змінна з підкласу
void show(){
System.out.println(“Поле i з суперкласу: ”+super.i);
System.out.println(“Поле i з підкласу: ”+i);}
}
class UseSuper{
public static void main(String args[]){
B SubObj=new B(1,2);
SubObj.show();
}
}
Змінна з підкласу
ЗАПУСТИТИ
6
Багаторівнева ієрархія
Клас А
наслідування
Клас B
наслідування
Клас C
наслідування
class A{
Суперклас
// код
}
Підклас
класу
class
B extends
A{ А і
для класу С
//суперклас
код
}
Підклас класу В. Може
class
extends B{ для
бути C
суперкласом
// код іншого класу
}
...............
7
Багаторівнева ієрархія - приклад
► Конструктори викликаються від суперкласу до підкласів.
► Інструкція super має бути першим оператором в конструкторі
підкласу.
► Якщо інструкція super не використана, викликається конструктор
суперкласу без аргументів.
class A{
int a;
A(int i){a=i; System.out.println(a);
}}
class B extends A{
int b;
B(int i,int j){super(i); b=j;
System.out.println(b);}}
class MultiCall{
public static void main(String args[]){
C obj=new C(1,2,3);
}
}
class C extends B{
int c;
C(int i,int j,int k){super(i,j); c=k;
System.out.println(c);}}
1
2
3
Результат:
ЗАПУСТИТИ
8
Переозначення методів
► Якщо в підкласі метод має таке ж ім’я та сигнатуру, що і метод в
суперкласі, то має місце переозначення методу
► Якщо в підкласі метод має таке ж ім’я, але іншу сигнатуру, що
метод в суперкласі, то має місце перевантаження методу
class A{
int a;
A(int i){a=i;}
void show(){
System.out.println(“a=”+a);}
}
class B extends A{
int b;
B(int i,int j){super(i); b=j;}
void show(){
super.show();
System.out.println(“b=”+b);}
}
class Override{
public static void main(String args[]){
A obj1=new A(1);
B obj2=new B(2,3);
obj1.show();
obj2.show();}
ЗАПУСТИТИ
}
Зверніть увагу!
9
Переозначення і перевантаження методів - приклад
class A{
void show(){
System.out.println(“Метод класу А”);}}
Зверніть увагу!
class B extends A{
void show(String msg){
System.out.println(msg);}}
Клас А
class C extends B{
void show(){
System.out.println(“Метод класу C”);}}
Клас В show()
show(String)
Клас С show()
show(String)
class Override2{
public static void main(String args[]){
A obj1=new A();
B obj2=new B();
C obj3=new C();
obj1.show();
obj2.show(); obj2.show(“Клас В”);
obj3.show(); obj3.show(“Клас С”);
}}
show()
Результат:
Метод класу А
Метод класу А
Клас В
Метод класу C
Клас С
ЗАПУСТИТИ
10
Динамічне управління методами
► Динамічне управління методами – механізм, через який питання
про виклик переозначеної функції (методу) вирішується на стадії
виконання програми, а не її компіляції
► Реалізація:
При виклику методу через посилання на суперклас питання про
версію методу вирішується на основі типу об’єкту, на який вказує
посилання
class A{
void show(){
System.out.println(“Клас А”);
}}
class B extends A{
void show(){
System.out.println(“Клас В”);
}}
class C extends A{
void show(){
System.out.println(“Клас C”);
}}
ЗАПУСТИТИ
Клас А
Клас В
Клас С
class Dispatch{
public static void main(String args[]){
A a=new A(); B b=new B(); C c=new C();
A ref;
ref=a; ref.show();
ref=b; ref.show();
ref=c; ref.show();}}
11
Абстрактні класи
► Абстрактний клас – суперклас, в якому визначена лише загальна
структура, без конкретного визначення методів (абстрактні методи)
► Перед іменем абстрактного методу вказується ідентифікатор
abstract
► Любий клас, що містить хоча б один абстрактний метод, має бути
оголошений як абстрактний (сигнатура класу починається з
ідентифікатора abstract)
abstract class A{
abstract void callme();
void callmetoo(){
System.out.println(“Другий”);}}
class B extends A{
void callme(){
System.out.println(“Перший”);}}
class AbstrDemo{
public static void main(String args[]){
B obj=new B();
obj.callme();
ЗАПУСТИТИ
obj.callmetoo();}}
Ключове слово final
1. Визначення констант
(заборона зміни значення
змінної)
2. Відмові від переозначення
(final-метод не можна
переозначати в підкласі)
3. Відмові від наслідування
(final-клас не може бути
суперкласом)
12