In programarea orientata pe obiecte mostenirea permite construirea de ierarhii de clase. Mostenirea reprezinta o proprietate a claselor prin intermediul careia poate fi definita o noua clasa, care sa preia atributele si metodele unei clase mai vechi. Aceasta proprietate este implementata cu ajutorul claselor derivate.
Clasa derivata, sau subclasa, se gaseste intotdeauna pe un nivel inferior celui corespunzator superclasei, sau clasei de baza. In limbajul Java poate fi utilizata doar mostenirea simpla, adica fiecare clasa derivata are o singura clasa de baza (parinte).
Relatia de derivare este precizata la definirea clasei derivate, folosind constructia extends.
[modificatori_clasa] class nume_clasa [extends super_clasa][implements lista_interfete] { // corp_clasa }
Cu cat ne deplasam mai mult de la varful ierarhiei de clase catre margini, clasele devin tot mai specializate.
package ro.virtualcampus.unit; | |
public class Facultate { | |
private String nume; | |
private String adresa; | |
public Facultate(String nume, String adresa) { | |
this.nume = nume; | |
this.adresa = adresa; | |
} | |
public String getNume() { | |
return nume; | |
} | |
public void setNume(String nume) { | |
this.nume = nume; | |
} | |
public String getAdresa() { | |
return adresa; | |
} | |
public void setAdresa(String adresa) { | |
this.adresa = adresa; | |
} | |
@Override | |
public String toString() { | |
return "Facultate [nume=" + nume + ", adresa=" + adresa + "]"; | |
} | |
} |
package ro.virtualcampus.person; | |
import java.io.*; | |
public class Persoana { | |
protected static BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); | |
protected static int nrPersoane = 0; | |
protected String nume; | |
protected int varsta; | |
public Persoana() { | |
nrPersoane++; | |
this.nume = "necunoscut"; | |
this.varsta = 0; | |
} | |
public Persoana(int varsta) { | |
this(); | |
this.varsta = varsta; | |
} | |
public Persoana(String nume, int varsta) { | |
nrPersoane++; | |
this.nume = nume; | |
this.varsta = varsta; | |
} | |
public Persoana(String obj) throws IOException { | |
nrPersoane++; | |
System.out.println("Citire date: " + obj); | |
System.out.print("nume: "); | |
this.nume = in.readLine(); | |
System.out.print("varsta: "); | |
this.varsta = Integer.parseInt(in.readLine()); | |
} | |
public static int getNrPersoane() { | |
return nrPersoane; | |
} | |
public void setNume(String nume) { | |
this.nume = nume; | |
} | |
public String getNume() { | |
return nume; | |
} | |
public void setVarsta(int varsta) { | |
this.varsta = varsta; | |
} | |
public int getVarsta() { | |
return varsta; | |
} | |
@Override | |
public String toString() { | |
return "Persoana [nume=" + nume + ", varsta=" + varsta + "]"; | |
} | |
} |
package ro.virtualcampus.person; | |
import java.io.IOException; | |
import ro.virtualcampus.unit.Facultate; | |
public class Student extends Persoana { | |
private Facultate facultate; | |
private int anStudiu; | |
public Student(String nume, int varsta, Facultate facultate, int anStudiu) { | |
super(nume, varsta); | |
this.facultate = facultate; | |
this.anStudiu = anStudiu; | |
} | |
public Student(String obj) throws IOException { | |
super(obj); | |
facultate = new Facultate(null, null); | |
System.out.print("nume facultate: "); | |
this.facultate.setNume(in.readLine()); | |
System.out.print("adresa facultate: "); | |
this.facultate.setAdresa(in.readLine()); | |
System.out.print("an studiu: "); | |
this.anStudiu = Integer.parseInt(in.readLine()); | |
} | |
public Facultate getFacultate() { | |
return facultate; | |
} | |
public void setFacultate(Facultate facultate) { | |
this.facultate = facultate; | |
} | |
public int getAnStudiu() { | |
return anStudiu; | |
} | |
public void setAnStudiu(int anStudiu) { | |
this.anStudiu = anStudiu; | |
} | |
@Override | |
public String toString() { | |
return "Student [facultate=" + facultate + ", anStudiu=" + anStudiu | |
+ ", nume=" + nume + ", varsta=" + varsta + "]"; | |
} | |
} |
Toate clasele in Java sunt derivate din aceeasi superclasa (Object). Aceasta clasa este definita in pachetul java.lang si reprezinta varful ierarhiei de clase Java. Din acest motiv, toate clasele mostenesc metodele care sunt definite in clasa Object.
Printre cele mai importante metode din clasa Object sunt:
• equals(): este utilizata pentru a compara doua obiecte;
• toString(): permite asocierea de informatie de tip String fiecarui obiect.
package ro.virtualcampus.app; | |
import java.io.IOException; | |
import ro.virtualcampus.person.Persoana; | |
import ro.virtualcampus.person.Student; | |
import ro.virtualcampus.unit.Facultate; | |
public class Aplicatie { | |
public static void main(String args[]) throws IOException { | |
Persoana mb = new Persoana(); | |
System.out.println("numar persoane: " + Persoana.getNrPersoane()); | |
mb.setNume("Maria Boca"); | |
System.out.println(mb); | |
Student bc = new Student("Bogdan Cornu", 23, new Facultate("ET", "T.Lalescu"), 2); | |
System.out.println(bc); | |
System.out.println("numar persoane: " + Persoana.getNrPersoane()); | |
Student gh = new Student("GH"); | |
System.out.println(gh.toString()); | |
System.out.println("numar persoane: " + Persoana.getNrPersoane()); | |
} | |
} |
numar persoane: 1 Persoana [nume=Maria Boca, varsta=0] Student [facultate=Facultate [nume=ET, adresa=T.Lalescu], anStudiu=2, nume=Bogdan Cornu, varsta=23] numar persoane: 2 Citire date: GH nume: Geta Hoanta varsta: 21 nume facultate: ET adresa facultate: T.Lalescu an studiu: 1 Student [facultate=Facultate [nume=ET, adresa=T.Lalescu], anStudiu=1, nume=Geta Hoanta, varsta=21] numar persoane: 3
In cazul in care nu se doreste extinderea unei clase, sau nu se doreste supradefinirea metodelor acesteia, este necesara marcarea clasei/metodelor, la definire, cu modificatorul final. O metoda declarata cu modificatorul final nu poate fi supradefinita.