Clase i obiecte n Java. Crearea obiectelor. Constructori. Variabile clas. Metode statice. Motenirea
I. SCOPUL LUCRRII
Lucrarea de fa are rolul de a prezenta i familiariza studentul cu noiuni privind obiectele i clasele n limbajului Java: clase i crearea obiectelor, rolul constructorilor, semnificaia i utilizarea variabilelor clas, metodele clas, subclasele i motenirea; cu importana i situaiile de utilizare a acestora. La sfritul acestei lucrri, studentul va avea posibilitatea s scrie programe Java n care s foloseasc noiunile menionate anterior.
II. NOIUNI TEORETICE
Observaie: Vezi noiunile prezentate n cursul 2.
1. Crearea obiectelor
S considerm urmtorul exemplu:
public class Vehicul { public String categoria; public String marca; public int nrRoti; public boolean aerCond; public boolean volan;
public Vehicul(String nume,boolean aerCond) { categoria="automobil"; marca=nume; nrRoti=4; this.aerCond=aerCond; volan=true; } public Vehicul(String nume) { categoria="bicicleta"; marca=nume; nrRoti=2; aerCond=false; volan=false; } public void afisare() { System.out.println("Categorie vehicul " +categoria); System.out.println("Denumire "+categoria+": "+marca); P a g e | 2
1. Un fiier surs java care conine o clas public trebuie salvat cu numele clasei respective la care se adaug extensia .java. 2. ntr-un fiier surs java poate exista cel mult o clas declarat public. Astfel programul de mai sus se va salva ntr-un fiier cu numele Vehicul.java. Altfel, la compilare se va semnala eroare. 3. Clasa Vehicul conine doi constructori. Utilizarea mai multor constructori pentru aceeai clas se recomand atunci cnd se urmrete iniializarea obiectelor clasei n moduri diferite. Astfel, n main( ) se vor crea obiecte (vehicule) ce reprezint biciclete i automobile, n funcie de utilizarea unui constructor sau al altuia. 4. Unul din contextele n care utilizarea notaiei bazate pe this (this este referina ctre obiectul curent) este necesar, este atunci cnd se definete un parametru sau o variabil local cu acelai nume ca o dat membru a clasei. Astfel, pentru a se face diferena ntre variabila local sau parametru i data membru a clasei, aceasta din urm este accesat explicit prin referina this (vezi primul constructor al clasei Vehicul: this.aerCond=aerCond). 5. ntr-un constructor se poate referi ca prim instruciune un constructor al clasei curente. Este singura poziie din definiia unui constructor n care poate s apar o referire la un alt constructor. Un astfel de apel apare sub forma:
this(listaDeArgumente); // constructor din aceeasi clasa
unde listaDeArgumente reprezint lista valorilor parametrilor constructorului invocat.
P a g e | 3
Exemplul 2:
public class Floare { public String denumire; public int nrPetale; public String zonaClima="-";
1. Variabilele membru se pot iniializa cnd sunt declarate. Se recomand ca iniializarea s se fac n constructor (n principal, pentru ca fiecare obiect al clasei s poat avea valori diferite pentru datele membru). 2. n cazul n care o dat membru membru este iniializat la declarare iar apoi i n constructor, atunci valoarea sa va fi cea pe care o primete n constructor. Dac n constructor nu mai primete nici o valoare, atunci valoarea sa va rmne cea de la declarare. Astfel, obiectul floare1 va avea pentru data membru zonaClima valoarea - deoarece n primul constructor (cel care este utilizat pentru crearea acestui obiect), aceasta dat membru nu primete nici o valoare. Obiectul floare2, n schimb, este creat cu ajutorul celui de-al doilea constructor, care iniialiazeaz data membru zonaClima la valoarea celui de-al treilea parametru al sau care este tropicala.
2. Variabile clas
S considerm clasa Vehicul prezentat n seciunea anterioar. O vom modifica adugndu-i o dat membru static numit contor care numr obiectele clasei ce sunt create n program. Aceast nou variabil, fiind declarat static, este asociat clasei, ci nu instanelor clasei. O variabil clas poate fi accesat prin numele clasei, deci nu este nevoie de crearea unei instane a clasei doar pentru a o accesa. O variabil static este creat o singur dat, la ncrcarea clasei.
P a g e | 4
public class Vehicul { static int contor=0; public String categoria; public String marca; public int nrRoti; public boolean aerCond; public boolean volan;
Vehicul b1,m1,m2; b1=new Vehicul("Pegas"); b1.afisare(); m1=new Vehicul("Dacia",false); m1.afisare(); m2=new Vehicul("Cielo",true); m2.afisare(); System.out.println("\nExista "+Vehicul.contor+" obiecte ale clasei Vehicul"); } } P a g e | 5
S considerm un alt exemplu:
class Salariat { public static final double impozit=0.15; public String nume; public String functia; public int varsta; public double salariuBrut;
public Salariat(String num,String func,int ani,double sal) { nume=num; functia=func; varsta=ani; salariuBrut=sal; } public double salariuNet() { return salariuBrut*(1-impozit); } public void afisare() { System.out.println("Nume salariat: "+nume); System.out.println("Functia: "+functia); System.out.println("Varsta: "+varsta); System.out.println("SalariuBrut: "+salariuBrut+" lei"); System.out.println("SalariuNet: "+salariuNet()+" lei \n"); } }
public class UtilSal { public static void main(String args[ ]) { Salariat s1=new Salariat("Popa Ion","contabil",36,7300000); Salariat s2=new Salariat("Rada Alina","secretara",28,6000000); System.out.println("Impozit: "+(int)(Salariat.impozit*100)+"% \n"); s1.afisare(); s2.afisare(); } }
Observaie:
Am utilizat n clasa Salariat o dat membru impozit care este declarat i static i final, ceea ce nseamn c este considerat o constant de ctre compilator (valoarea sa nu poate fi modificat).
3. Metode clas (statice) S considerm urmtorul exemplu:
public class Film { static int pretBilet=30000; P a g e | 6
static String cinematograf="Patria"; public String nume; public int durata; // in minute public boolean luatOscar;
public Film(String num,int nrMin,boolean oscar) { nume=num; durata=nrMin; luatOscar=oscar; }
static int getPretBilet() { return pretBilet; }
static void printCinema(Film f) { System.out.println("Filmul "+f.nume+" este difuzat la cinematograful "+cinematograf); } public void afisare() { System.out.println("Nume: "+nume); System.out.println("Durata (in minute): "+durata); if(luatOscar) System.out.println("Filmul a primit premiul Oscar\n"); else System.out.println("Filmul nu a primit premiul Oscar\n"); }
public static void main(String args[ ]) { System.out.println("Pretul unui bilet este: " +Film.getPretBilet()+" lei"); Film f1=new Film("Titanic",180,true); f1.afisare(); Film.printCinema(f1); } }
Observaii: 1. O metod static este considerat c aparine clasei i nu instanierilor clasei. O metod static poate s refere numai variabile sau metode statice (pentru c numai acestea exist fr a se fi instaniat un obiect din clasa respectiv), dar poate s fie apelat din orice metod a clasei. 2. Metoda main( ) care reprezint punctul de plecare pentru orice program Java, este declarat ca fiind static i deci poate s fie referit fr instanierea unui obiect. 3. Limbajul Java permite declararea unei secvene de cod ca fiind static n modul urmtor: static { secventa de cod } 4. Astfel de secvene se pot declara numai n afara metodelor. Corespunztor, n momentul n care clasa respectiv ajunge s fie ncrcat (pentru c a fost referit) se vor executa toate secvenele de cod declarate n acest mod la nivelul clasei. S considerm urmtoarea aplicaie Java:
P a g e | 7
class Floare { int nrPetale; static { System.out.println("floarea"); } public Floare(int nrPetale) { this.nrPetale=nrPetale; } public void afiseaza() { System.out.println(nrPetale); } } public class Exemplu { static { Floare f=new Floare(10); f.afiseaza(); } public static void main(String args[]) { } }
Programul afieaz:
Floarea 10 dei n metoda main( ) nu sunt prevzute prelucrri, s-au executat secvenele de cod indicate cu atributul static din ambele clase definite.
S considerm un alt exemplu:
public class Test { int x; static int y=0;
static void modificaY() { y+=10; } void modificaY(int y) { this.y=y; } void modificaX(int x) { this.x=x; } void func() { Test t=new Test(); y=1; t.y=1; Test.y=1; P a g e | 8
public static void main(String args[]) { Test t=new Test(); t.func(); } } n metoda func( ) a clasei Test a fost creat un obiect care reprezint o instaniere a clasei. Se observ c n timp ce pentru variabila static y exist 5 variante pentru atribuirea unei valori (toate referindu-se la variabila global y), pentru variabila x cele dou modificri ale valorii lui x se refer la variabile diferite n primul caz (x=1) este vorba despre data membru x a obiectului pentru care se execut metoda, iar n cel de-al doilea caz (t.modifica(x)) este vorba despre data membru x a obiectului de tip Test creat n metoda func().
4. Motenirea S considerm urmtorul exemplu (programul Vehicule.java):
class Vehicul { public String denumire; public int nrRoti;
public Vehicul(String denumire,int nrRoti) { this.denumire=denumire; this.nrRoti=nrRoti; } public void afisareVehicul() { System.out.println("\n"); System.out.println("Denumire: "+denumire); System.out.println("Nr roti: "+nrRoti); } }
class Bicicleta extends Vehicul { public boolean combustibil;
public Bicicleta(String denumire,int nrRoti) { super(denumire,nrRoti); combustibil=false; } public void afisareBicicleta() { afisareVehicul(); System.out.println("Bicicleta nu consuma benzina"); } } P a g e | 9
class Motocicleta extends Bicicleta { public Motocicleta(String denumire,int nrRoti) { super(denumire,nrRoti); combustibil=true; } public void afisareMotocicleta() { afisareVehicul(); System.out.println("Motocicleta consuma combustibil"); } }
class Automobil extends Vehicul { public String combustibil; public boolean volan;
Clasic: 1. Se editeaz codul surs al programului Java folosind un editor de text disponibil (de ex., se poate utiliza Notepad). 2. Se salveaz fiierul cu extensia .java. 3. Compilarea mini-aplicaiei Java se va face din linia de comand: javac nume_fiier_surs.java n cazul n care programul conine erori acestea vor fi semnalate i afiate. 4. Pentru rularea aplicaiei Java, se lanseaz interpretorul Java: java nume_clas_care_conine_main
Se folosete utilitarul disponibil n laborator J2SDK Net Beans.
IV. TEM
Se vor parcurge toate exemplele prezentate n platforma de laborator testndu-se practic (acolo unde este cazul).
Modificai clasa Salariat astfel nct salariul fiecrui angajat s poat fi exprimat i n dolari. De asemenea, programul s afieze i cursul de schimb al dolarului utilizat n calcule.
Scriei clasa Student. Fiecare student are un nume, an, grup, i dou note obinute la o anumit materie - una pe semestrul 1 iar cealalt pe semestrul 2. Clasa conine un constructor ce iniializeaz datele membru ale clasei la valorile parametrilor si, o funcie care calculeaz i returneaz media celor dou note, i o funcie de afiare ce afieaz valorile datelor membru i valoarea mediei. Scriei un program complet n care s utilizai obiecte ale clasei Student.
Modificai clasa Film astfel: - adugai clasei o metod static care s returneze valoarea datei membru durata. - ncercai s apelai metoda afisare( ) n cadrul metodei printCinema( ) i invers, apelai metoda printCinema( ) n cadrul metodei afisare( ). Explicai la fiecare caz n parte rezultatele obinute.
Creai urmtoarea ierarhie de clase:
Un disc are un nume i o capacitate. O discheta are n plus o stare (1 dac este write-protected, 0 altfel). Un hard-disk are n plus un controler (de tip sir de caractere; exemplu: IDE, SCSI). Superclasa are un constructor (cu parametri) i o funcie de afiare (afieaz valorile datelor membru). Clasa discheta are un constructor, o funcie de afiare i o funcie care seteaz (modific) starea dischetei. Clasa hard-disk are un constructor i o funcie de afiare. Scriei un program Java care lucreaz cu obiecte de tipul celor 3 clase.