capitol 4
DESCRIPTION
dasTRANSCRIPT
04/22/23 Curs 5 1
Programare Orientata Obiect
Curs 5Mostenirea / Extinderea Claselor
04/22/23 Curs 5 2
Continutul cursului1. Introducere2. Platforma Java, Clase si Obiecte3. Modificatori, Constructori4. Pachete. Incapsularea datelor5. Mostenirea / Extinderea claselor
04/22/23 Curs 5 3
Curs 5
1. Mostenirea / Extinderea claselor1.1 Definitii. Aspecte generale1.2 Declararea subclaselor1.3 Ierarhia de clase1.4 Metode si proprietati in subclase1.5 Constructori in subclase1.6 Suprascriere si supraincarcare (Overriding si overloading)1.7 Polimorfism
C5. Mostenirea claselor1.1 Definitii. Aspecte generale
– Mostenire (en. Inheritance): – permite construirea de noi clase folosind
clasele existente– permite reutilizarea proprietatilor si metodelor
din clasele existente– Permite adaugarea de noi proprietati si
metode pentru a extinde functionalitatea claselor existente
– Subclasa (clasa copil, clasa derivata): o clasa care mosteneste o alta clasa
– Superclasa (clasa parinte, clasa de baza): clasa care este mostenita
C5. Mostenirea claselor1.1 Definitii. Aspecte generale
– Subclasele mostenesc toate proprietatile si metodele clasei parinte
– Nu au neaparat acces la ele
– Modificatorii de acces (vezi cursul 3), public, private, protected se aplica astfel:
– In subclase doar membrii publici si protected pot fi accesati
– Membrii privati ai superclasei nu pot fi modificati
C5. Mostenirea claselor1.2 Declararea subclaselor
– Extinderea unei clase se realizeaza folosind cuvantul cheie extends:
class A{...}
class B extends A {...}
// A este superclasa clasei B// B este o subclasa a clasei A
C5. Mostenirea claselor
Superclasa:
public class Person{private String name;
public Person ( ) {name = “”;
}
public Person ( String initialName ) {
this.name = initialName;}
public String getName ( ) {return name;
}
public void setName ( String newName ) {
name = newName;}
Subclasa:
public class Student extends Person {private int studentNumber;
public Student ( ) {super( );studentNumber = 0;
}
public Student (String initialName, int initialStudentNumber) {
super(initialName);studentNumber =
initialStudentNumber;}
public int getStudentNumber ( ) {return studentNumber;
}
public void setStudentNumber (int newStudentNumber ) {
studentNumber = newStudentNumber;}
1.3 Ierarhia de clase– O clasa poate extinde doar o singura clasa
– Spre deosebire de C++, Java nu permite mostenirea multipla
– Toate clasele din Java extind o clasa comuna (java.lang.Object)
– Daca nu este specificata nici o clasa care sa fie extinsa compilatorul presupune ca se mosteneste clasa Object
– Se mostenesc metode din clasa Object cum ar fi toString() si equals()
– Ierarhia de clase pentru exemplu anterior:Object
Person
Student
C5. Mostenirea claselor
1.4 Metode si proprietati in subclase
– Un obiect instantiat dintr-o subclasa contine doua tipuri de proprietati si metode:
1. Proprietati/metode definite local in subclasa
2. Proprietati/metode mostenite din superclasa
Care sunt proprietatile si metodele unui obiect instantiat din clasa Student?
C5. Mostenirea claselor
C5. Mostenirea claselor
Superclasa:
public class Person{private String name;
public Person ( ) {name = “”;
}
public Person ( String initialName ) {
this.name = initialName;}
public String getName ( ) {return name;
}
public void setName ( String newName ) {
name = newName;}
Subclasa:
public class Student extends Person {private int studentNumber;
public Student ( ) {super( );studentNumber = 0;
}
public Student (String initialName, int initialStudentNumber) {
super(initialName);studentNumber =
initialStudentNumber;}
public int getStudentNumber ( ) {return studentNumber;
}
public void setStudentNumber (int newStudentNumber ) {
studentNumber = newStudentNumber;}
1.5 Constructori in subclase
– Constructorii nu se mostenesc– Un constructor dintr-o subclasa poate apela un
constructor al superclasei prin folosirea metodei super
– Daca nu se apeleaza un constructor din superclasa in mod explicit atunci se apeleaza constructorul fara argumente, ca prima instructiune a constructorului:
super( )
C5. Mostenirea claselor
1.5 Constructori in subclase
– Atunci cand un obiect este creat, masina virtuala aloca memorie pentru toate campurile. Apoi:
1. Se apeleaza constructorul superclasei2. Se initializeaza campurile3. Se executa constructorul subclasei
– In mod similar se executa constructorul superclasei, prin parcurgerea celor trei etape. Procesul se executa recursiv pana se ajunge la clasa Object
C5. Mostenirea claselor
1.5 Constructori in subclase
C5. Mostenirea claselor
Y obiectY = new Y();
Pas ce se intampla x0 y0 w
0 se initializeaza campurile 1 se apeleaza constructorul Y 2 se apeleaza constructorul X 3 se initializeaza campurile din X 4 se executa constructorul X 5 se initializeaza campurile din Y6 se executa constructorul Y
0 0 00 0 00 0 0 1 0 0 1 0 11 2 11 2 2
class Y extends X { protected int y0 = 2;
public Y() { w = y0; }}
class X { protected int x0 = 1; protected int w;
public X() { w = x0; }}
1.6 Suprascriere si supraincarcare (Overriding si overloading)– Overloading: mai multe metode cu acelasi nume
dar cu liste de parametrii diferite– Intr-o subclasa putem defini metode cu acelasi nume cu
metode din supraclasa si cu parametrii diferiti
– Overriding: inlocuirea unei metode din supraclasa cu o metoda implementata in subclasa
– Lista de parametrii si tipul de data returnat trebuie sa fie exact la fel
– Daca o metoda suprascrisa este apelata printr-un obiect instantiat din subclasa, atunci se apeleaza metoda implementata in subclasa
C5. Mostenirea claselor
1.6 Suprascriere si supraincarcare (Overriding si overloading)– Overriding: O metoda poate fi suprascrisa doar
daca este accesibila in subclasa– Metodele private nu pot fi suprascrise– Metodele public si protected pot fi suprascrise
C5. Mostenirea claselor
1.6 Suprascriere si supraincarcare (Overriding si overloading)
C5. Mostenirea claselor
Concrete1 c1 = new Concrete1();c1.show( );Output?Base.pri()Concrete1.pro()Concrete1.pub()
package P1;
public class Base { private void pri( ) { System.out.println(“Base.pri()”); } protected void pro( ) { System.out.println(“Base.pro()”); } public void pub( ) { System.out.println(“Base.pub()”); }
public final void show( ) { pri(); pro(); pub(); }}
package P2;
import P1.Base;
public class Concrete1 extends Base { public void pri( ) { System.out.println(“Concrete1.pri()”); } public void pro( ) { System.out.println(“Concrete1.pro()”); } public void pub( ) { System.out.println(“Concrete1.pub()”); }}
1.7 Polimorfism– Un obiect instantiat dintr-o clasa poate avea mai
multe forme: fie “forma” clasei, fie “forma” unei clase mostenite
– Un obiect instantiat dintr-o clasa extinsa poate fi folosit in orice situatie este folosit un obiect din supraclasa
C5. Mostenirea claselor
Object
Person
Student
C5. Mostenirea claselorclass SuperShow {
public String str = “SuperStr”;
public void show( ) {System.out.println(“Super.show:” + str);
}}
class ExtendShow extends SuperShow {public String str = “ExtendedStr”;
public void show( ) {System.out.println(“Extend.show:” + str);
}
public static void main (String[] args) { ExtendShow ext = new ExtendShow( ); SuperShow sup = ext; sup.show( ); //1 ext.show( ); //2 System.out.println(“sup.str = “ + sup.str); //3 System.out.println(“ext.str = “ + ext.str); //4}
}
Output?Extend.show: ExtendStrExtend.show: ExtendStrsup.str = SuperStrext.str = ExtendStr
04/22/23 Curs 4 19
Continutul cursului1. Introducere2. Platforma Java, Clase si Obiecte3. Modificatori, Constructori4. Pachete. Incapsularea datelor5. Mostenirea / Extinderea claselor6. Clase abstracte