Transcript Document

Programare Orientata Obiect
Curs 5
Mostenirea / Extinderea Claselor
4/9/2015
Curs 5
1
Continutul cursului
1.
2.
3.
4.
5.
Introducere
Platforma Java, Clase si Obiecte
Modificatori, Constructori
Pachete. Incapsularea datelor
Mostenirea / Extinderea claselor
4/9/2015
Curs 5
2
Curs 5
1. Mostenirea / Extinderea claselor
1.1 Definitii. Aspecte generale
1.2 Declararea subclaselor
1.3 Ierarhia de clase
1.4 Metode si proprietati in subclase
1.5 Constructori in subclase
1.6 Suprascriere si supraincarcare (Overriding si overloading)
1.7 Polimorfism
4/9/2015
Curs 5
3
C5. Mostenirea claselor
1.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 claselor
1.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 claselor
1.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:
Subclasa:
public class Person{
private String name;
public class Student extends Person {
private int studentNumber;
public Person ( ) {
name = “”;
}
public Student ( ) {
super( );
studentNumber = 0;
}
public Person ( String initialName )
{
this.name = initialName;
}
public Student (String initialName,
int initialStudentNumber) {
super(initialName);
studentNumber =
initialStudentNumber;
}
public String getName ( ) {
return name;
}
public void setName ( String newName
) {
name = newName;
}
public int getStudentNumber ( ) {
return studentNumber;
}
public void setStudentNumber (int
newStudentNumber ) {
studentNumber = newStudentNumber;
}
C5. Mostenirea claselor
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
Superclasa:
Subclasa:
public class Person{
private String name;
public class Student extends Person {
private int studentNumber;
public Person ( ) {
name = “”;
}
public Student ( ) {
super( );
studentNumber = 0;
}
public Person ( String initialName )
{
this.name = initialName;
}
public Student (String initialName,
int initialStudentNumber) {
super(initialName);
studentNumber =
initialStudentNumber;
}
public String getName ( ) {
return name;
}
public void setName ( String newName
) {
name = newName;
}
public int getStudentNumber ( ) {
return studentNumber;
}
public void setStudentNumber (int
newStudentNumber ) {
studentNumber = newStudentNumber;
}
C5. Mostenirea claselor
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 superclasei
2. Se initializeaza campurile
3. 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
class X {
protected int x0 = 1;
protected int w;
public X() {
w = x0;
}
class Y extends X {
protected int y0 = 2;
public Y() {
w = y0;
}
}
}
Y obiectY = new Y();
Pas ce se intampla
0
1
2
3
4
5
6
se initializeaza campurile
se apeleaza constructorul Y
se apeleaza constructorul X
se initializeaza campurile din X
se executa constructorul X
se initializeaza campurile din Y
se executa constructorul Y
x0
y0
w
0
0
0
1
1
1
1
0
0
0
0
0
2
2
0
0
0
0
1
1
2
C5. Mostenirea claselor
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)
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()”); }
}
Concrete1 c1 = new Concrete1();
c1.show( );
Output?
Base.pri()
Concrete1.pro()
Concrete1.pub()
C5. Mostenirea claselor
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
Object
Person
Student
C5. Mostenirea claselor
class 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);
System.out.println(“ext.str = “ + ext.str);
}
Output?
Extend.show: ExtendStr
Extend.show: ExtendStr
sup.str = SuperStr
ext.str = ExtendStr
//3
//4
Continutul cursului
1.
2.
3.
4.
5.
6.
Introducere
Platforma Java, Clase si Obiecte
Modificatori, Constructori
Pachete. Incapsularea datelor
Mostenirea / Extinderea claselor
Clase abstracte
4/9/2015
Curs 4
19