Sunteți pe pagina 1din 20

PROGRAMARE JAVA

Curs 4

Derivare, motenire, polimorfism n


Java

Derivarea (extinderea) claselor

In Java se spune c o subclas extinde funcionalitatea


superclasei, n sensul c ea poate conine metode i date
suplimentare.
In general o subclas este o specializare, o particularizare
a superclasei i nu extinde domeniul de utilizare al
superclasei.
class VSet extends Vector
{
public void addElement( Object obj)
{
if( !contains(obj))
{
super.addElement(obj);
}
}
}

Derivarea (extinderea) claselor

O subclas poate deveni superclas pentru alte (sub)clase,


iar derivarea (extinderea) poate continua pe oricte niveluri
In Java nu este permis extinderea simultana a mai multor
clase pentru motenire multipl de date i operaii de la
cteva clase. Cuvntul extends poate fi urmat de un singur
nume de clas.
Nu se poate extinde o clas final (cu atributul final) i nu
pot fi redefinite metodele din superclas care au unul din
modificatorii final, static, private

Clasa Object ca baz a ierarhiei de clase Java

Clasa Object (java.lang.Object) este superclasa tuturor


claselor JDK i a claselor definite de utilizatori.
Orice clas Java care nu are clauza extends n definiie
este implicit o subclas derivat direct din clasa Object.
Clasele abstracte i interfeele Java sunt i ele subtipuri implicite
ale tipului Object.
Variabile sau argumente de tip Object (referine la tipul
Object) pot fi nlocuite cu variabile de orice alt tip de clas,
deoarece orice tip clas este n Java derivat din Object i
deci compatibil cu tipul Object.

Clasa Object ca baz a ierarhiei de clase Java

Clasa Object transmite foarte puine operaii utile


subclaselor sale.
Deoarece clasa Object nu conine nici o metod abstract,
nu este obligatorie redefinirea metodelor mostenite, dar n
practic se redefinesc cteva metode: toString(),
equals(), hashCode().

Metoda toString()

Metoda toString() din clasa Object transform n ir


adresa obiectului pentru care se apeleaz i deci trebuie s
fie redefinit n fiecare clas cu date, pentru a produce un
ir cu coninutul obiectului.
Metoda toString() permite obinerea unui ir echivalent
cu orice obiect, deci trecerea de la orice tip la tipul String.
Ea este apelat explicit sau implicit cnd este necesar
conversia

Date d = new Date();


String s = d.toString(); // apel explicit
System.out.println (d); // apel implicit: println( d.toString())
String s = d+\n;
// apel implicit: d.toString()+\n

Metoda equals()

Metoda equals() din clasa Object consider c dou


variabile de tip Object sau de orice tip derivat din Object
sunt egale dac i numai dac se refer la un acelai obiect
public boolean equals (Object obj)
{
return (this == obj);
}

Pe de alt parte, un utilizator al clasei String ( sau al altor


clase cu date) se ateapt ca metoda equals() s aib
rezultat true dac dou obiecte diferite (ca adres) conin
aceleai date
De aceea, metoda equals() este rescris n clasele unde
se poate defini o relaie de egalitate ntre obiecte.

Suprascriere de metode n subclase

Redefinirea unei metode trebuie s pstreze "amprenta"


funciei, deci numele i tipul metodei, numrul i tipul
argumentelor.
Dac nu se respect aceste reguli atunci compilatorul
consider c subclasa adaug alt metod la cele
motenite i nu suprascrie o metod motenit.
La nceput compilatorul Java nu putea verifica acest fel de
eroare de programare i de aceea s-a adugat limbajului o
adnotare numit @Override care poate fi folosit de
programatori pentru a arta c se intenioneaz o
suprascriere i care permite compilatorului s verifice c
metoda redefinit are acelasi tip i aceleasi argumente ca
una motenit

Derivarea ca metod de reutilizare

Principala modalitate de specializare a unei clase este


redefinirea unor metode din superclas. Prin redefinire
(override) se modific operaiile dintr-o metod, dar nu i
modul de utilizare al metodei.
O clas pentru mulimi realizate ca list nlnuit poate fi
obinut la fel de simplu, prin extinderea clasei
java.util.LinkedList, fr s ne intereseze detaliile de
lucru cu lista, care sunt ncapsulate n clasa de bibliotec
deja definit.

Absena unor clase pentru mulimi vector sau mulimi


liste sau dicionare din vectori din bibliotecile Java se
explic tocmai prin uurina de a defini astfel de clase
prin derivare de ctre programatori.

Avantajele reutilizrii unor clase existente este i mai evident


n cazul claselor Swing sau AWT pentru obiecte de interfa
grafic: puini programatori ar putea s scrie singuri clase ca
JFrame, JPanel, JTextField, JTable, JTree s.a. dar obinerea
unor subclase ale acestora este destul de simpl.

O clas derivat nu motenete constructorii superclasei.


Dac nu exist nici un constructor definit explicit ntr-o
subclas atunci se genereaz automat un constructor care
apeleaz un constructor fr argumente din superclas (dac
exist, altfel este eroare de compilare).
Regula anterioar nu se aplic dac exist un constructor cu
argumente n subclas, caz n care apelul (super)
constructorului fr argumente trebuie scris explicit.
Un constructor dintr-o subclasa D poate apela un constructor din
superclasa A folosind cuvntul cheie super i nu prin numele sau.
Apelul super() trebuie s fie prima instruciune din
constructor. Aceast situaie apare atunci cnd subclasa are
variabile n plus fa de superclas; iniializarea variabilelor
motenite se face prin constructorul superclasei iar iniializarea
variabilelor proprii subclasei se face n constructorul subclasei.

public class SortedArray extends ArrayList


{
private Comparator cmp = null; //obj comparator folosit la sortare
// constructori
public SortedArray()
{
super();
}
public SortedArray (Comparator comp)
{
super();
cmp=comp;
}
// metode
public int indexOf (Object obj)
{
if (cmp==null)
return Collections.binarySearch (this,obj);
else
return Collections.binarySearch (this,obj,cmp);
}
}

Derivarea pentru crearea unor ierarhii de


tipuri

Tipurile superclas i subclas sunt compatibile, n sensul


c o variabil (sau un parametru) de un tip A poate fi nlocuit
fr conversie explicit cu o variabil (cu un parametru) de
un subtip D, iar trecerea de la o subclas D la o superclas
A se poate face prin conversie explicit (cast).
Conversia de tip ntre clase incompatibile produce excepia
ClassCastException.
Conversia de la un subtip la supertip (upcast) se face
automat, fr a folosi operatorul de conversie, deoarece se
pot folosi toate metodele din supertip i n subtip.
Vector v= new Vector;
Object obj = v;

Conversia de la un supertip la un subtip (downcast) se face


folosind operatorul de forare a tipului (cast), deoarece
subtipul poate avea metode n plus fat de supertip.
Object obj;
Vector v = (Vector) obj;

Conversia de tip se aplic unor variabile referin (sau


unor argumente de funcii) i nu unor obiecte.
Tipul variabilei referin este folosit de compilator pentru
a verifica dac metodele folosite cu aceast variabil
exist pentru tipul respectiv sau nu.

O variabil de tip Object nu poate fi urmat de o metod din


clasa Vector (de ex. size()) chiar dac obiectul referit de
variabil este de tip Vector.
Object x = new String() ;
Object y = new Vector() ;
Vector v = (Vector) x; // exceptie la executie: un String nu
// poate fi transformat n vector
int sz= y.size(); // eroare la compilare : clasa Object nu
// are metoda size()

Prin derivare succesiv se pot crea ierarhii de tipuri compatibile.

// vector ordonat
public class SVec extends Vec { .... }
// multime vector
public class VSet extends Vec { ... }
// multime ordonata
public class SVSet extends VSet {... }
Vec

SVec

VSet

SVSet

De remarcat c dou subtipuri ale unui tip comun A nu sunt


compatibile ( de exemplu tipurile SVec i VSet nu sunt
compatibile, dei ambele sunt derivate din tipul Vec).

Polimorfism

O funcie polimorfic este o funcie care are acelasi prototip,


dar implementri (definiii) diferite n clase diferite dintr-o
ierarhie de clase (obinute prin suprascrierea metodei).
Metodele equals() i toString() sunt exemple tipice de
funcii polimorfice, al cror efect depinde de tipul obiectului
pentru care sunt apelate (altul dect tipul variabilei
referin).
Object
Object
String
String

d = new Date();
f = new Float (3.14);
ds = d.toString(); // apel Date.toString()
fs = f.toString(); // apel Float.toString()

Asocierea unui apel de metod cu funcia ce trebuie apelat


se numeste "legare" (Binding). Legarea se poate face la
compilare (legare timpurie) sau la execuie ("legare trzie"
sau "legare dinamic").
Pentru metodele finale i statice legarea se face la compilare,
adic un apel de metod este tradus ntr-o instruciune de salt
care conine adresa funciei apelate.
Legarea dinamic are loc n Java pentru orice metod care nu
are atributul final sau static, metod numit polimorfic.
In Java majoritatea metodelor sunt polimorfice. Metodele
polimorfice Java corespund funciilor virtuale din C++.

Concluzie

Soluia funciilor polimorfice este specific programrii


orientate pe obiecte i se bazeaz pe existena unei ierarhii
de clase, care conin metode (nestatice) cu aceeai
semnatur, dar cu efecte diferite n clase diferite.
Numai metodele obiectelor pot fi polimorfice, n sensul c
selectarea metodei apelate se face n funcie de tipul
obiectului pentru care se apeleaz metoda
O metod static, chiar dac este redefinit n subclase, nu
poate fi selectat astfel, datorit modului de apelare.

S-ar putea să vă placă și

  • Curs Pedagogie I
    Curs Pedagogie I
    Document77 pagini
    Curs Pedagogie I
    Cristi Munteanu
    Încă nu există evaluări
  • Filtre 1
    Filtre 1
    Document12 pagini
    Filtre 1
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Proiect IA
    Proiect IA
    Document10 pagini
    Proiect IA
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Lab1 FormaPoloneza
    Lab1 FormaPoloneza
    Document16 pagini
    Lab1 FormaPoloneza
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • JAVAC03 Prezentare
    JAVAC03 Prezentare
    Document23 pagini
    JAVAC03 Prezentare
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • AES Implementat Pe FPGA
    AES Implementat Pe FPGA
    Document15 pagini
    AES Implementat Pe FPGA
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • JAVAC01 Prezentare
    JAVAC01 Prezentare
    Document43 pagini
    JAVAC01 Prezentare
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Alga
    Alga
    Document15 pagini
    Alga
    Rusu Radu Ionel
    Încă nu există evaluări
  • Rânduiala Utreniei de Duminică
    Rânduiala Utreniei de Duminică
    Document6 pagini
    Rânduiala Utreniei de Duminică
    ecleziarhbarbosradu
    86% (7)
  • JAVAC05 Prezentare
    JAVAC05 Prezentare
    Document47 pagini
    JAVAC05 Prezentare
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Colinde Mai Putin Cunoscute
    Colinde Mai Putin Cunoscute
    Document6 pagini
    Colinde Mai Putin Cunoscute
    ElénaBroscoi
    Încă nu există evaluări
  • Curs 01
    Curs 01
    Document5 pagini
    Curs 01
    Cristi Sava
    Încă nu există evaluări
  • JAVAC02 Prezentare
    JAVAC02 Prezentare
    Document17 pagini
    JAVAC02 Prezentare
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Uniunea Europeana
    Uniunea Europeana
    Document32 pagini
    Uniunea Europeana
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Logica Matematica
    Logica Matematica
    Document2 pagini
    Logica Matematica
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Termeni Ideoologii
    Termeni Ideoologii
    Document3 pagini
    Termeni Ideoologii
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Optica Geometrica
    Optica Geometrica
    Document8 pagini
    Optica Geometrica
    Cristi Ciureanu
    100% (1)
  • CRACIUN
    CRACIUN
    Document5 pagini
    CRACIUN
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Regimuri Totalitare
    Regimuri Totalitare
    Document2 pagini
    Regimuri Totalitare
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Clasa Graf Neorientat
    Clasa Graf Neorientat
    Document22 pagini
    Clasa Graf Neorientat
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Iapa Lui VodA
    Iapa Lui VodA
    Document2 pagini
    Iapa Lui VodA
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Index 3427
    Index 3427
    Document7 pagini
    Index 3427
    Cotruta Victor
    Încă nu există evaluări
  • Arad Obiectiva Turistice
    Arad Obiectiva Turistice
    Document5 pagini
    Arad Obiectiva Turistice
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • A1caracterizare Stefan Gheorghidiu
    A1caracterizare Stefan Gheorghidiu
    Document2 pagini
    A1caracterizare Stefan Gheorghidiu
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Familia Lui Jupiter
    Familia Lui Jupiter
    Document11 pagini
    Familia Lui Jupiter
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Alexandru Lăpuşneanul
    Alexandru Lăpuşneanul
    Document3 pagini
    Alexandru Lăpuşneanul
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Esteri
    Esteri
    Document11 pagini
    Esteri
    Mihai Alexandru Olaru
    Încă nu există evaluări
  • Padurea de Aur
    Padurea de Aur
    Document1 pagină
    Padurea de Aur
    Mihai Alexandru Olaru
    Încă nu există evaluări