public class Persoana { private String nume, prenume; private int anNastere; public Persoana(String nume, String prenume, int
anNastere) { public Persoana(Persoana pers) { public String nume() { return nume; } public String prenume() { return prenume; } public int anNastere() { return anNastere; } public int varsta(int anCurent) { return anCurent-anNastere; } public String toString() { public int hashCode() { |
Clasa contine trei câmpuri private: două referințe la String (nume și prenume) și un câmp de tip int (anNaștere). Întrucât câmpurile sunt private, ele nu sunt vizibile din alte clase (nici chiar din subclasele clasei Persoana).
Clasa Persoana are doi constructori. Primul constructor primește ca argumente valorile celor trei câmpuri: nume, prenume, anNaștere. Întrucât argumentele au aceleași nume cu câmpurile corespunzătoare, în corpul constructorului numele de câmpuri sunt calificate cu referința this. Aceasta se putea evita schimband numele argumentelor. Al doilea constructor are ca argument o instanță a clasei Persoana, fiind ceeace se numește un "constructor de copiere". Vom vedea utilitatea lui in continuare, la declararea clasei Student.
Metodele nume(), prenume() și anNastere() au rolul de a întoarce fiecare valoarea câmpului corespunzator. Fiind publice, ele pot fi utilizate în alte clase. Așa dar, este posibil să obținem în altă clasă valorile câmpurilor unui obiect Persoana, dar nu putem modifica aceste valori. Remarcăm că este posibil ca numele unei metode să coincidă cu cel al unui câmp. Nu are loc nici o confuzie, întrucât numele metodei este insoțit întotdeauna de paranteze, ca în expresia p1.nume(), care are ca valoare numele persoanei p1.
Metoda varsta(int anCurent) întoarce vârsta persoanei, fiind dat ca argument anul pentru care se calculează. Este un exemplu de metodă care întoarce un atribut al persoanei (vârsta), care nu este memorat într-un câmp, ci se obține prin calcul.
Metodele toString() și hashCode() redefinesc metodele corespunzătoare ale superclasei Object.
public class Student extends Persoana { private String fac, gr; private int anStudii; public Student(String nume, String prenume, int
anNastere, public Student(Persoana pers, String facultate, int an, public Student(Student stud) { public String facultate() { return fac; } public int an() { return anStudii; } public String grupa() { return gr; } public String toString() { |
Clasa Student moștenește câmpurile și metodele superclasei Persoana. În plus, conține următoarele câmpuri private: două referințe la String (fac - facultatea și gr - grupa) și un int (anStudii).
Au fost declarați trei constructori. Primul are ca argumente
valorile tuturor câmpurilor, atât ale celor moștenite de la superclasă,
cât și ale celor proprii. Întrucât câmpurile superclasei sunt private,
nu a fost posibilă inițializarea lor directă, prin operații de
atribuire, ci prin apelarea constructorului superclasei sub forma
super(nume, prenume, anNastere);
Al doilea constructor are ca prim argument o referință la persoană, iar
ultimele trei argumente sunt aceleași ca la constructorul precedent.
Pentru inițializarea câmpurilor superclasei a fost invocat constructorul
acesteia sub forma
super(pers);
în care pers este referința la o Persoana. S-a utilizat aici
constructorul de copiere Persoana(Persoana pers). Remarcăm că nu
am fi putut utiliza instrucțiunea
super(pers.nume, pers.prenume, pers.anNastere);
deoarece câmpurile clasei Persoana sunt private și nu sunt, deci,
accesibile din clasa Student. În lipsa constructorului de copiere, am fi
putut utiliza in schimb instructiunea
super(pers.nume(), pers.prenume(), pers.anNastere());
deoarece metodele nume(), prenume() și anNastere()
sunt publice.
Metodele publice facultate(), an() și grupa() întorc valorile câmpurilor specifice clasei Student, respectiv fac, anStudii și gr.
Metoda toString() redefinește metoda cu aceeași signatură a superclasei.
class TestStud { public static void main(String args[]) { Persoana p1=new Persoana("Vasiliu","George",1981), p2; Student s1=new Student(p1, "NIE",2,"2221a"), s2=new Student("Ionescu","Maria", 1980, "NIE", 2, "2322b"), s3; Object ob1, ob2, ob3; Persoana tabPers[]=new Persoana[3]; ob1=s1; ob2=p2=s2; ob3=p1; System.out.println("p1="+p1); System.out.println("s1="+s1); System.out.println("s2="+s2); System.out.println("ob1="+ob1); System.out.println("p2="+p2); System.out.println("ob2="+ob2); System.out.println("ob3="+ob3); System.out.println("Numele lui p1: "+p1.nume()); System.out.println("Numele lui s1: "+s1.nume()); System.out.println("Numele lui ob1: "+((Persoana)ob1).nume()); s3=(Student)ob2; System.out.println("s3="+s3); System.out.println("In anul 2000, s3 are "+s3.varsta(2000)+" ani"); System.out.println("p2.hashCode()="+p2.hashCode()); System.out.println("s1.hashCode()="+s1.hashCode()); tabPers[0]=p1; tabPers[1]=s1; tabPers[2]=s2; System.out.println("Tabloul de persoane tabPers contine:"); System.out.println("Clasa lui p1: "+p1.getClass().getName()); System.out.println("Clasa lui ob2: "+ob2.getClass().getName()); for(int i=0; i<tabPers.length; i++) System.out.println(tabPers[i]); } } |
Se testează funcționarea metodelor polimorfe toString() din clasele Persoană și Student, funcționarea castului de la Object la Student si funcționarea metodei hashCode(), redefinită în clasa Persoana și mostenită de clasa Student. Se testează, de asemenea, metoda getClass(), moștenita de la clasa Object. Se construiește și se utilizează un tablou de referințe la Persoana.
Complilând fișierul TestStud1.java și executând aplicația TestStud1 constatăm că se obțin aceleași rezultate ca în cazul aplicației TestStud. Întrucât clasele Persoana1 și Student1 sunt publice, compilarea explicită a fișierelor respective nu este necesară, deoarece ea se face automat când se compilează fișierul TestStud1.java.