Sunteți pe pagina 1din 24

smaranda.belciug@inf.ucv.ro Laborator 3 Text Input i Output In Java nu este uor s citeti date introduse de utilizator n program.

S-a observat deja c output-ul se efectueaz cu ajutorul subrutinei System.out.print. Aceast subrutin este parte a obiectului predefinit System.out. Exist un obiect similar numit System.in pentru a citi date introduse de utilizator, dar pentru folosirea sa sunt necesare abiliti de programator. Din fericire Java 5.0 a introdus clasa Scanner.
import java.util.Scanner; public class InputExp { public static void main(String[] args) { String nume; int salariu; Scanner in = new Scanner(System.in); //citeste o linie de la consola si o stocheaza intr-o variabila nume = in.nextLine(); //citeste un intreg de la consola si-l stocheaza salariu=in.nextInt(); in.close();

System.out.println("Nume :"+nume); System.out.println("Salariu :"+salariu); } }

Crearea claselor Definirea claselor class Stiri{ //corpul clasei } In mod prestabilit, clasele motenesc clasa Object, care este superclasa tuturor claselor din ierarhia de clase Java. Dac clasa dumneavoastr este o subclas, se folosete cuvntul cheie extends pentru a indica superclasa noii clase. class StiriSportive extends Stiri{ //corpul clasei }

smaranda.belciug@inf.ucv.ro Crearea variabilelor de clas i de instan Definirea variabilelor de instan


class Jabberwock extends Reptile { String culoare; String sex; boolean flamand; int varsta; }

Constante Definiie 1. O constant, denumit i variabil constant, este o variabil a crei valoare nu se modific niciodat. Acest lucru poate prea cumva paradoxal, innd cont de nelesul cuvntului variabil. Pentru a declara o constant, folosii cuvntul cheie final nainte de declararea variabilei i atribuii valoarea iniial pentru variabila respectiv, ca n urmtoarele exemple: final float pi = 3.141592; final boolean debug = false; final int numarulCorinei = 0724213244; Constantele pot fi folositoare pentru denumirea diferitelor stri ale unui obiect sau pentru testarea acestor stri. S presupunem c avei o etichet text care poate fi aliniat la stnga, la dreapta sau centrat. Putei defini aceste constante drept numere ntregi: final int LEFT = 0; final int RIGHT = 1; final int CENTER = 2; Pentru a ptra valoarea curent a alinierii textului, se declar variabila ntreag aliniere: int aliniere; this.aliniere = CENTER; switch(this.aliniere) { case LEFT: //actiuni executate alinierea la stnga break; case RIGHT: //actiuni executate alinierea la dreapta break; case CENTER: //actiuni executate alinierea centrat break; 2

smaranda.belciug@inf.ucv.ro } Variabile de clas Pentru a declara o variabil de clas se folosete cuvntul cheie static. static int suma; static final int maxObiecte = 10; Crearea metodelor Definirea metodelor Definiia metodelor cuprinde patru pri principale: Numele metodei Tipul obiectului sau tipul de date primitiv returnat de metod O list de parametri Corpul metodei Primele trei pri ale unei definiii de metod formeaz ceea ce se numete semntura metodei. tipRetur numeMetoda (tip1 arg1, tip2 arg2, tip3 arg3 ) { //corpul metodei } n cazul n care se returneaz un tablou se vor folosi parantezele []. int[] creareDomeniu(int inf, int sup){ //corpul metodei } Exemplu.
class ClasaDomeniu { int[] creareDomeniu(int inf, int sup){ int tab1[] = new int[(sup - inf) + 1]; for (int i = 0; i < tab1.length; i++){ tab1[i] = inf++; }//end for i return tab1; }//end creareDomeniu public static void main(String args[]){ int unTablou[]; ClasaDomeniu unDomeniu = new ClasaDomeniu(); unTablou = unDomeniu.creareDomeniu(1,10); System.out.print("Tabloul: ["); for (int i = 0; i < unTablou.length; i++){ System.out.print(unTablou[i] + " ");

smaranda.belciug@inf.ucv.ro
}//end for i System.out.println("]"); }//end main }//end class Tabloul: [1 2 3 4 5 6 7 8 9 10 ]

Cuvntul cheie this n corpul unei definiii de metod putei s v referii la obiectul curent obiectul a crei metod a fost apelat. Pentru a referi obiectul curent n astfel de cazuri, se folosete cuvntul cheie this acolo unde n mod normal s-ar folosi numele unui obiect. t = this.x; this.resetDate(this); return this; In multe cazuri s-ar putea s nu fie nevoie s folosii explicit cuvntul this, deoarece este presupus. t = x; resetDate(this); Deoarece this este o referin a instanei curente a clasei, trebuie s o folosii doar n cadrul corpului unei definiii de metod de instan. Metodele de clas, declarate prin cuvntul cheie static, nu pot folosi this. Domeniu de vizibilitate al variabilelor i definiiile de metode Unul dintre lucrurile pe care trebuie s le tii nainte de a folosi o variabil este domeniul ei de vizibilitate (scope) Definiie 2. Domeniu de vizibilitate (scope) este acea parte a programului n care o variabil sau o alt informaie poate fi folosit. Dac acea parte a programului care definete domeniul de vizibilitate al unei variabile i termin execuia, variabila nu mai exist. Variabila shadow Metodele i clasele interne sunt declarate n alte clase. Astfel se permite structurilor interne s se refere la variabilele din struncturile externe. Acest fapt este foarte folositor, dar i foarte periculos. Variabila intern este variabila shadow i arunc o umbr asupra variabilei externe. Sfatul meu: nu folosii variabilele shadow!
class Shadow { static int test = -3; static void printa() {

smaranda.belciug@inf.ucv.ro
//--- afiseaza pe x din domeniul de vizibilitate System.out.println("printa: test = " + test); }//end printa static void printb(int test) { //--- test este parametrul functiei (la fel ca o variabila locala System.out.println("printb: test = " + test); }//end printb public static void main(String[] args) { int test = 15; //--- se afiseaza variabila locala.. nu cea de clasa System.out.println("main : test = " + test); //--- se afiseaza variabila de clasa, nu cea locala System.out.println("main : Shadow.test = " + Shadow.test); printa(); printb(5485); }//end main }//end class Shadow main : main : printa: printb: test = 15 Shadow.test = -3 test = -3 test = 5485

class TestDomeniuVizibilitate { int test = 10; void printTest() { int test = 20; System.out.println("test = " + test); }//end printTest public static void main(String args[]){ TestDomeniuVizibilitate st = new TestDomeniuVizibilitate(); st.printTest(); }//end main }//end class test = 20

Transmiterea argumentelor ctre metode


class TransmiterePrinReferinta { int unuZero(int arg[]){ int index = 0; for (int i = 0; i < arg.length; i++){ if (arg[i] == 1){ index++; arg[i] = 0; }//end if }//end for i return index;

smaranda.belciug@inf.ucv.ro
}//end unuZero public static void main(String args[]){ int tab1[] = {1,3,4,5,1,1,7}; TransmiterePrinReferinta test = new TransmiterePrinReferinta(); int totalUnu; System.out.print("Valorile din tablou: [ "); for (int i = 0; i < tab1.length; i++){ System.out.print(tab1[i] + " "); }//end for i System.out.println("]"); totalUnu = test.unuZero(tab1); System.out.println("Numarul de valori unu = " + totalUnu); System.out.print("Noile valori din tablou: ["); for (int i = 0; i < tab1.length; i++){ System.out.print(tab1[i] + " "); }//end for i System.out.print("]"); }//end main }//end class Valorile din tablou: [ 1 3 4 5 1 1 7 ] Numarul de valori unu = 3 Noile valori din tablou: [0 3 4 5 0 0 7 ]

Metode de clas Relaia dintre variabilele de instan i cele de clas este comparabil cu diferena dintre modurile de lucru ale metodelor de instan i de clas. Metodele de clas sunt disponibile oricrei instane a clasei i pot fi fcute disponibile i altor clase. O metod de clas nu necesit o instan a clasei pentru a fi apelat. Metodele de clas au cuvntul cheie static n faa semnturii. Folosirea metodelor pentru ndeplinirea sarcinilor Suprancrcarea metodelor (overloading) crearea de metode cu diferite semnturi i definiii, ns cu acelai nume Crearea metodelor constructor metode care permit iniializarea obiectelor, pentru a le defini starea iniial n momentul crerii Suprascrierea metodelor (overriding) crearea unei definiii diferite pentru o metod care a mai fost definit n superclas

smaranda.belciug@inf.ucv.ro Metode de finalizare (finalizer) metode care fac curenie dup terminarea lucrului cu un obiect, nainte ca acesta s fie nlturat din sistem.

Crearea de metode cu acelai nume i argumente diferite (overloading) Metodele care poart acelai nume se difereniaz ntre ele prin dou caracteristici: Numrul argumentelor pe care le preiau Tipul datelor sau obiectelor fiecrui argument Suprancrcarea metodelor elimin nevoia de a defini metode complet diferite care s fac n principiu acelai lucru. De reinut este faptul c Java nu ia n considerarea tipul valorii returnate pentru a face diferenierea ntre metodele suprancarcate. n plus, numele variabilelor pe care le alegei pentru fiecare argument al metodei nu sunt relevante tot ceea ce conteaz este numrul i tipul acestora. Exemplu.
import java.awt.Point; class DreptunghiulMeu { int int int int x1 y1 x2 y2 = = = = 0; 0; 0; 0; construireaDreptunghi(int x1, int y1, int x2, x1; y1; x2; y2;

DreptunghiulMeu int y2){ this.x1 = this.y1 = this.x2 = this.y2 =

return this; } DreptunghiulMeu construireDreptunghi(Point stangaSus, Point dreaptaJos){ x1 = stangaSus.x; y1 = stangaSus.y; x2 = dreaptaJos.x; y2 = dreaptaJos.y; return this; } DreptunghiulMeu contruireDreptunghi(Point stangaSus, int l, int h){ x1 y1 x2 y2 = = = = stangaSus.x; stangaSus.y; x1 + l; y1 + h;

return this; }

smaranda.belciug@inf.ucv.ro
void afisareDreptunghi(){ System.out.print("DreptunghiulMeu: <" + x1 + ", " + y1); System.out.println(", " + x2 + ", " + y2 + " >"); } public static void main(String args[]){ DreptunghiulMeu dreptunghi = new DreptunghiulMeu(); System.out.println("Apelez construireDreptunghi cu coordonatele 25,25,50,50:"); dreptunghi.construireaDreptunghi(25, 25, 50, 50); dreptunghi.afisareDreptunghi(); System.out.println("***"); System.out.println("Apelez construireDreptunghi cu punctele (10,10), (20,20):"); dreptunghi.construireDreptunghi(new Point(10,10), new Point(20,20)); dreptunghi.afisareDreptunghi(); System.out.println("***"); System.out.print("Apelez construireDreptunghi cu un punct (10,10):"); System.out.println("latime (50) si inaltime (50):"); dreptunghi.contruireDreptunghi(new Point(10,10), 50, 50); dreptunghi.afisareDreptunghi(); System.out.println("***"); } }//end class Apelez construireDreptunghi cu coordonatele 25,25,50,50: DreptunghiulMeu: <25, 25, 50, 50 > *** Apelez construireDreptunghi cu punctele (10,10), (20,20): DreptunghiulMeu: <10, 10, 20, 20 > *** Apelez construireDreptunghi cu un punct (10,10):latime (50) si inaltime (50): DreptunghiulMeu: <10, 10, 60, 60 > ***

Metode constructor Definiie 3. O metod constructor este o metod apelat la crearea unui obiect cu alte cuvinte, atunci cnd obiectul este construit. Spre deosebire de alte metode, o metod constructor nu poate fi apelat direct; Java apeleaz metodele constructor n mod automat. Atunci cnd este folosit instruciunea new pentru crearea unei instane a unei clase, Java execut trei activitai: Aloc memorie pentru obiect Iniializeaz variabilele de instan ale obiectului fie la valorile iniiale, fie la cele prestabilite Apeleaz metodele constructor ale clasei

smaranda.belciug@inf.ucv.ro Metode constructor de baz Constructorii seamn foarte mult cu metodele obinuite, cu dou diferene importante: Metodele constructor au ntotdeauna acelai nume cu cel al clasei Metodele constructor nu returneaz nimic Exemplu.
class Persoana { String nume; int varsta; Persoana (String n, int a){ nume = n; varsta = a; } void printPerson(){ System.out.print("Buna, eu sunt " + nume); System.out.println(". Am " + varsta + " de ani."); } public static void main(String args[]){ Persoana p; p = new Persoana("Luke",50); p.printPerson(); System.out.println("---"); p = new Persoana("Laura", 35); p.printPerson(); System.out.println("---"); } } Buna, eu sunt Luke. Am 50 de ani. --Buna, eu sunt Laura. Am 35 de ani. ---

Suprancrcarea metodelor constructor


import java.awt.Point; class DreptunghiulMeu2 { int int int int x1 y1 x2 y2 = = = = 0; 0; 0; 0;

DreptunghiulMeu2(int x1, int y1, int x2, int y2){ this.x1 = x1; this.y1 = y1; this.x2 = x2; this.y2 = y2; }

smaranda.belciug@inf.ucv.ro
DreptunghiulMeu2(Point stangaSus, Point dreaptaJos){ x1 = stangaSus.x; y1 = stangaSus.y; x2 = dreaptaJos.x; y2 = dreaptaJos.y; } DreptunghiulMeu2(Point stangaSus, int l, int h){ x1 = stangaSus.x; y1 = stangaSus.y; x2 = x1 + l; y2 = y1 + h; } void afisareDreptunghi(){ System.out.print("DreptunghiulMeu: <" + x1 + ", " + y1); System.out.println(", " + x2 + ", " + y2 + " >"); } public static void main(String args[]){ DreptunghiulMeu2 dreptunghi; System.out.println("Apelez DreptunghiulMeu2 cu coordonatele 25,25,50,50:"); dreptunghi = new DreptunghiulMeu2(25, 25, 50, 50); dreptunghi.afisareDreptunghi(); System.out.println("***"); System.out.println("Apelez DreptunghiulMeu2 cu punctele (10,10), (20,20):"); dreptunghi = new DreptunghiulMeu2(new Point(10,10), new Point(20,20)); dreptunghi.afisareDreptunghi(); System.out.println("***"); System.out.print("Apelez DreptunghiulMeu2 cu un punct (10,10):"); System.out.println("latime (50) si inaltime (50):"); dreptunghi = new DreptunghiulMeu2(new Point(10,10), 50, 50); dreptunghi.afisareDreptunghi(); System.out.println("***"); } }//end class Apelez DreptunghiulMeu2 cu coordonatele 25,25,50,50: DreptunghiulMeu: <25, 25, 50, 50 > *** Apelez DreptunghiulMeu2 cu punctele (10,10), (20,20): DreptunghiulMeu: <10, 10, 20, 20 > *** Apelez DreptunghiulMeu2 cu un punct (10,10):latime (50) si inaltime (50): DreptunghiulMeu: <10, 10, 60, 60 > ***

10

smaranda.belciug@inf.ucv.ro Suprascrierea metodelor Atunci cnd apelai metoda unui obiect, Java caut definiia metodei respective n clasa obiectului. Dac nu o gsete, caut mai sus n ierarhia de clase pn cnd gsete o definiie. Procesul de motenire a metodelor v permite s definii i s folosii repetat metode n subclase, fr a fi nevoie s duplicai codul. Totui pot exista cazuri cnd dorii ca un obiect s rspund acelorai metode, dar s aib un comportament diferit la apelarea acestora. n acest caz, metoda se poate suprascrie. Pentru a suprascrie o metod, definii ntr-o subclas o metod cu aceeai semntur ca a unei metode dintr-o superclas. Astfel, atunci cnd metoda este apelat, metoda din subclas este gsit prima i va fi executat n locul celei din superclas. Crearea de metode care suprascriu metode existente Listing-ul fiierului AfisareClasa.java
class AfisareClasa{ int x = 0; int y = 1; void afisareDate(){ System.out.println("x este " + x + ", y este " + y); System.out.println("Sunt o instanta a clasei " + this.getClass().getName()); } }

Listing-ul fiierului AfisareSubClasa.java


class AfisareSubClasa extends AfisareClasa{ int z = 3; public static void main(String args[]){ AfisareSubClasa obiect = new AfisareSubClasa(); obiect.afisareDate(); } } x este 0, y este 1 Sunt o instanta a clasei AfisareSubClasa

Listing-ul fiierului AfisareSubClasa3.java


class AfisareSubClasa2 extends AfisareClasa{ int z = 3; void afisareDate(){ System.out.println("x este " + x + ", y este " + y + ", z este " + z); System.out.println("Sunt o instanta a clasei " + this.getClass().getName()); }

11

smaranda.belciug@inf.ucv.ro
public static void main(String args[]){ AfisareSubClasa2 obiect = new AfisareSubClasa2(); obiect.afisareDate(); } } x este 0, y este 1, z este 3 Sunt o instanta a clasei AfisareSubClasa2

Apelarea metodei originale De obicei, exist dou motive pentru care se face suprascrierea unei metode implementate deja de o superclas: Pentru a nlocui complet definiia metodei originale Pentru a extinde funcionarea metodei originale Pentru apelarea metodei originale se folosete cuvntul cheie super. void metodaMea(String a, String b){ //diverse lucruri super.metodaMea(a,b); //alte lucruri }
class AfisareClasa{ int x = 0; int y = 1; void afisareDate(){ System.out.println("Sunt o instanta a clasei " + this.getClass().getName()); System.out.println("x este " + x); System.out.println("y este " + y); } } class AfisareSubClasa2 extends AfisareClasa{ int z = 3; void afisareDate(){ super.afisareDate(); System.out.println("z este " + z); } public static void main(String args[]){ AfisareSubClasa2 obiect = new AfisareSubClasa2(); obiect.afisareDate(); } } Sunt o x este y este z este instanta a clasei AfisareSubClasa2 0 1 3

12

smaranda.belciug@inf.ucv.ro Suprascrierea constructorilor Din punct de vedere tehnic, constructorii nu pot fi suprascrii. Totui, atunci cnd definii metode constructor pentru clasa dvs. putei modifica felul n care este iniializat obiectul nu doar prin iniializarea noilor variabile adugate clasei, ci i prin modificarea coninutului variabilelor deja prezente. Pentru aceasta se apeleaz explicit metodele constructor ale superclasei i apoi se fac modificrile variabilelor dorite. Atenie! Java are o regul strict: prima instruciune din constructor trebuie s fie super(). Exemplu.
import java.awt.Point;

class PunctCuNume extends Point{ String nume; PunctCuNume(int x, int y, String nume){ super(x,y); this.nume = nume; } public static void main(String args[]){ PunctCuNume pn = new PunctCuNume(5,5,"PunctMic"); System.out.println("x este " + pn.x); System.out.println("y este " + pn.y); System.out.println("Numele este " + pn.nume); } } x este 5 y este 5 Numele este PunctMic

Metode de finalizare Metodele finalizer sunt opusul metodelor constructor. finalize(); Apelarea metodei finalize() nu semnaleaz sistemului distrugerea obiectului i recuperarea memoriei ocupate. Numai tergerea tuturor referinelor la obiectul respectiv duce la marcarea lui pentru distrugere. Metodele de finalizare sunt folosite pentru a distrugerea referinelor ctre alte obiecte.

13

smaranda.belciug@inf.ucv.ro Rolul claselor: pachete, interfee i alte caracteristici Modificatori (modifiers) n primele laboratoare ai nvat cum se definesc clasele, metodele i variabilele. Modificatorii sunt cuvinte cheie care se adaug acestor definiii pentru a le modifica nelesul. Limbajul Java folosete mai multe tipuri de modificatori, printre care: Modificatori pentru controlul accesului la o clas, metod sau variabil: public, protected i private Modificatorul static, pentru creara metodelor i variabilelor de clas Modificatorul final, pentru finalizarea implementrilor de clase, metode i variabile Modificatorul abstract, pentru crearea de clase i metode abstracte Modificatorii synchronized i volatile, folosii pentru fire de execuie. Pentru a folosi un modificator , vei include cuvntul cheie care-l reprezint n definiia clasei, metodei sau variabilei ce urmeaz a fi modificat. public class AppletulMeu extends java.applet.Applet{.} private boolean omorJabberwock; static final double saptamani = 3; protected static final int Sens = 42; Dac se folosesc mai muli modificatori ntr-o instruciune, i putei folosi n orice ordine, att timp ct acetia preced elementul pe care-l modific. Controlul accesului la metode i variabile Prin controlul accesului putei stabili modul n care va fi accesat clasa dvs din alte clase. Unele variabile i metode ale clasei sunt folositoare doar n interiorul acesteia, deci ar trebui s fie invizibile pentru alte clase care pot interaciona cu clasa dvs. Acest proces se numete ncapsulare (encapsulation): un obiect poate controla modul cum este vzut i cum se poate interaciona cu el din exterior. Definiie 1. ncapsularea este procesul de prevenire a citirii sau a modificrii unor variabile aparinnd unei clase de ctre alte clase. Singura metod de folosire a acestor variabile este prin apelarea metodelor clasei, dac acestea sunt disponibile. Limbajul Java ofer patru niveluri de control al accesului: public, private, protected i un nivel special, care este specificat prin absena modificatorului. Accesul prestabilit O variabil sau o metod declarat fr niciun modificator al accesului este disponibil tuturor celorlalte clase dintr-un acelai pachet (packages).

14

smaranda.belciug@inf.ucv.ro Orice variabil declarat fr modificator poate fi citit sau modificat de orice clas care face parte din acelai pachet. Orice metod declarat astfel poate fi apelat de orice clas din acelai pachet. Alte clase nu pot accesa aceste elemente n niciun mod. Accesul privat Pentru a ascunde complet o metod sau o variabil, n scopul de a nu fi folosit de nicio alt clas, se folosete modificatorul private. Metodele i variabilele nu pot fi accesate dect din clasa curent, unde sunt definite. Aceast restricie afecteaz i motenirea: nici variabilele private i nici metodel private nu pot fi motenite de subclase. Variabilele private sunt foarte folositoare n dou cazuri: Atunci cnd alte clase nu au niciun motiv s foloseasc variabila respectiv Atunci cnd alt clas poate produce dezastre dac variabila respectiv este folosit necorespunztor Exemplu. O clasa Java denumit Bingo, care genereaz numere de bingo pentru un site de jocuri. Acest clas conine o variabil denumit rataCastiguri, prin care se controleaz numrul de ctiguri i de pierderi generate. Variabila are un impact major asupra jocului. Daca ea ar fi modificat de alte clase, performana jocului s-ar modifica substanial. Variabila trebuie declarat private. Accesul public Modificatorul public face ca o metod sau o variabil s fie complet disponibil unei alte clase. Metoda main() trebuie s fie public, atfel nu poate fi apelat de interpretorul Java pentru a lansa n execuie clasa. n cadrul motenerii, toate variabilele i metodele publice ale unei clase sunt preluate i de subclasele sale. Accesul protejat Protected limiteaz vizibilitatea unei metode sau variabile doar pentru urmtoarele grupuri: Subclasele unei clase Alte clase din acelai pachet Compararea nivelurilor de control al accesului Vizibilitate Din aceeai clasa Din orice clas care aparine aceluiai pachet Din orice clasa din afara public Da da da protected Da da nu default Da da nu private da nu Nu

15

smaranda.belciug@inf.ucv.ro pachetului Dintr-o subclasa a aceluiai pachet Dintr-o subclas din afara pachetului Controlul accesului i motenirea - Metoda public dintr-o superclas trebuie s fie, de asemenea, public n toate sublasele - Metodele protected dintr-o superclas pot fi protected sau public n subclase; nu pot fi declarate private; - Metodele declarate fr control al accesului (deci fr modificator) pot fi declarate n subclase cu un grad de protecie mai ridicat Metode de accesare Pentru citirea i scrierea variabilelor se folosesc metode de accesare diferite. Convenia este: dac se citete valoarea unei variabile numele metodei s nceap cu get, iar setarea variabilelor cu set. Variabile i metode statice Variabilele i metodele de clas pot fi accesate folosind numele clasei urmat de un punct i de numele variabilei sau metodei: Color.black sau Cerc.pi. Se poate folosi i numele unui obiect al clasei, dar pentru variabilele i metodele de clas este mai bine s folosii numele clasei. Variabilele i metodele de instan nu pot fi referite niciodat prin numele clasei. Variabilele de clas pot fi declarate private i pot fi folosite numai prin intermediul metodelor de acces.
public class NumarInstante{ private static int nrInstante = 0; protected static int getNrInstante(){ return nrInstante; } private static void incrNrInstante(){ nrInstante++; } NumarInstante(){ NumarInstante.incrNrInstante(); } public static void main(String args[]){ System.out.println("Am inceput cu " + NumarInstante.getNrInstante() + " instante"); for (int i = 0; i < 10; i++) new NumarInstante();

da da

da da

da nu

nu nu

16

smaranda.belciug@inf.ucv.ro
System.out.println("S-au creat " + NumarInstante.getNrInstante() + " instante"); } } Am inceput cu 0 instante S-au creat 10 instante

Observai ca nu exist nicio metod de accesare care poate seta valoarea. Motivul este c valoarea acesteia trebuie incrementat doar la crearea unei noi instante, ea nu trebuie setat la o valoarea oarecare. Clase, metode i variabile finale Modificatorul final este folosit cu clase, metode i variabile pentru a indica faptul c acestea nu vor fi modificate. El are nelesuri diferite pentru fiecare dintre aceste categorii: Dintr-o clas final nu mai pot deriva subclase O metod final nu poate fi suprascris de nicio clas O variabil final nu i poate schimba valoarea Variabile O variabil final este o constant. In cazul variabilelor modificatorul final este nsoit i de modificatorul static, pentru a crea din constant o variabil de clas. Dac valoarea nu poate fi modificat, nu exist motive ca fiecare instan a clasei s posede o copie a valorii; toate pot folosi o variabil de clas cu acelai rol. Metode Metodele finale sunt acele metode care nu pot fi suprascrise niciodat de o subclas. Singurul motiv pentru care ai declara o metoda final este pentru o execuie mai eficient. n mod normal, atunci cnd un mediu de execuie Java ruleaz o metod, el caut metoda mai nti n clasa curent, dup aceea n superclas i urc mai departe n ierarhie pn ce gsete definiia acesteia. Prin acest proces se pierde din vitez n favoarea flexibilitii i a uurinei n dezvoltare. Clase Clasele sunt finalizate prin introducerea modificatorului final n declaraia acestora. Dintr-o clas final nu se pot deriva subclase. Ca i n cazul metodelor, acest proces aduce anumite avantaje legate de viteza de execuie. Nu prea exist motive pentru a declara propriile clase drept finale, deoarece clasele care pot s-i pun la dispoziie metodele i atributele unor subclase sunt mai folositoare.

17

smaranda.belciug@inf.ucv.ro Clase i metode abstracte ntr-o ierarhie de clase, cu ct clasa se afl pe un nivel mai nalt, cu att definirea sa este mai abstract. O clas aflat ierarhic deasupra altor clase poate defini doar comportamentul i atributele comune celorlalte. Definirea unor atribute i metode specifice trebuie s se fac undeva mai jos n ierarhie. n procesul de definire a unei ierarhii de clase, atunci cnd luai comportamentele i atributele comune unor grupuri de clase, vei descoperi uneori cte o clas care nu se instaniaz direct. De fapt, aceasta servete doar ca loc de pstrare a metodelor i atributelor pe care le folosesc n comun subclasele sale. Aceste clase se numesc clase abstracte i sunt create folosind modificatorul abstract. public abstract class BroadwayBoogieWoogie{ //.. } Clasele abstracte pot conine aceleai elemente ca o clas normal, inclusiv metode constructor, deoarece subclasele lor pot avea nevoie s moteneasc aceste metode. Ele pot s conin i metode abstracte, care sunt doar semnturi de metode, fr nicio implementare. Ele sunt declarate la fel prin modificatorul abstract. Nu se poate declara o metod abstract ntr-o clas non-abstract. Dac o clas abstract nu conine altceva dect o metode abstracte, este mai bine s se foloseasc o interfa. Pachete Folosirea pachetelor reprezint o modalitate de a organiza grupuri de clase. Un pachet (package) conine un numr de clase nrudite ca scop, ca domeniu sau din punct de vedere al motenirii. Pachetele sunt folositoare din mai multe motive: Permit organizarea claselor n uniti (grupuri). Aa cum pe hdd avei directoare i subdirectoare pentru a v organiza fiierele i aplicaiile, pachetele v permit s organizai clasele n grupuri din care putei folosi doar ceea ce avei nevoie pentru fiecare program. Reduc probleme datorate conflictelor de nume. Cu ct crete numrul de clase Java, cu att crete posibilitatea de a folosi nume de clas deja existent, ceea ce va duce la apariia unor conflicte i erori la integrarea acestora n programe. Pachetele v permit s ascundei clasele i deci s evitai aceste conflicte. V permit s protejai clasele, variabilele i metodele n mai multe moduri dect la nivel de clas, aa cum ai nvat astzi. Pot fi folosite la identificarea claselor.

18

smaranda.belciug@inf.ucv.ro Chiar dac un pachet este n esen o colecie de clase, aceasta poate conine i alte pachete formnd un alt nivel de organizare cumva asemntor ierarhiei de clase. Fiecare nivel reprezint o grupare de clase mai mic i cu sarcini mai precise. Folosirea pachetelor Pentru a folosi o clas coninut ntr-un pachet, putei folosi unul dintre urmtoarele trei mecanisme: Cnd clasa pe care dorii s o folosii se alf n pachetul java.lang, o putei referi pur i simplu prin numele ei. Clasele din java.lang sunt automat disponibile n toate programele. Cnd clasa pe care dorii s o folosii se afl ntr-un alt pachet, putei s o referii folosindu-I numele complet, adic inclusiv pe cel al pachetului (java.awt.Font) Pentru clasele pe care le folosii frecvent din alte pachete, putei importa clasele individuale sau ntregul pachet de clase. Dup ce clasa sau pachetul au fost importate putei s referii clasa doar prin numele su. Clasele care nu sunt declarate ca fcnd parte dintr-un anumit pachet sunt automat incluse ntr-un pachet prestabilit. Aceste clase pot fi referite prin numele lor, de oriunde din cod. Pachete complete i nume de clase Pentru a referi o clas dintr-un alt pachet, putei s folosi numele ei complet: numele clasei, precedat de toate numele pachetului. Pentru aceasta nu este nevoie s importai clasa sau pachetul: java.awt.Font f = new java.awt.Font(); Comanda import Pentru a importa clasele dintr-un pachet se folosete comanda import. import java.util.Vector; Sau se poate importa un pachet ntreg de clase: import java.awt.*; Conflicte de nume Dac de exemplu avei dou pachete: clasejonathan i clasebourne, n care se afl o dou clase cu acelai nume AruncaPeFereastr, n momentul scrierii codului urmtor: import clasejonathan;

19

smaranda.belciug@inf.ucv.ro import clasebourne; AruncaPeFereastr arunca = new AruncaPeFereastra(); Compilatorul Java nu va folosi niciuna dintre versiunile clasei, ci va semnala un conflict de nume i va refuza s compileze programul. Pentru a evita acest fapt, trebuie referit clasa prin numele complet: clasejonathan.AruncaPeFereastra arunca = new clasejonathan.AruncaPeFereastra(Phil) Crearea propriilor pachete Alegerea unui nume pentru pachet. Prin convenie numele de pachete ncep cu liter mic pentru a le deosebi de numele claselor. Crearea structurii de directoare pe hdd conform numelui pachetului. Adugarea unei clase ntr-un pachet. Pasul final este de a introduce clasa n pachet i de a aduga o instruciune n definiia clasei, nainte de orice instruciuni import care vor fi folosite. Intruciunea package se folosete mpreun cu denumirea pachetului, astfel: package com.prefect.canasta; Instruciunea package, dac exist, trebuie s fie prima linie a codului fiierului surs, eventual dup comentarii sau linii goale, ns nainte de orice comenzi import.

Pachetele i controlul accesului la clase Listing-ul de mai jos prezint dou clase care ilustreaz accesul la clase. Prima este o clas public ce implementeaz o list nlnuit; a doua reprezint un nod privat al listei.
package colectie; public class ListaInlantuita{ private Nod radacina; public void add(Object o){ radacina = new Nod(o,radacina); } //.... } class Nod {//nu este publica private Object continut; private Nod urmatorul; Nod(Object o, Nod n){ continut = o; urmatorul = n; } //........ }

20

smaranda.belciug@inf.ucv.ro Atenie! Intr-un fiier putei introduce oricte definiii de clas dorii, ns doar una dintre ele poate fi declarat public, iar numele fiierului trebuie s fie identic cu numele acestei clase publice. Atunci cnd Java compileaz fiierul, vor fi create fiiere .class separate pentru fiecare clas din cadrul fiierului. Interfee Interfeele, ca i clasele sau metodele abstracte, ofer un model de comportament care se presupune c va fi implementat de alte clase. Problema unicei moteniri S presupunem c avem o ierahie de clase referitoare la biologie. Clasa Animal se afl pe primul nivel Clasele Mamifer i Pasare pe nivelele inferioare Atributele clasei Mamifer sunt: naste_pui_vii i are_blan; Atributele clasei Pasare sunt: depune_oua i are_cioc

Clasa Ornitorinc ar trebui s combine atributele din cele dou clase. Dar, deoarece clasele pot avea n Java o singur superclas, acest tip de problem nu poate fi rezolvat elegant. Java conine o alt ierarhie, total separat de ierarhia principal, care conine clase cu comportament combinat. Astfel, atunci cnd creai o nou clas, aceasta are o singura superclas primar, ns poate alege i alte comportamente din cealalt ierarhie. Aceast nou ierarhie se numete ierarhie de interfee. O interfa Java este o colecie de comportamente abstracte, care pot fi combinate n orice clas pentru a introduce n acea clas comportamente care nu pot fi motenite de la superclas. Tehnic, o interfa Java nu conine nimic altceva dect definiii de metode abstracte i constante fr variabile de instan sau implementri de metode. Interfeele sunt implementate i folosite n biblioteca de clase Java ori de cte ori este nevoie ca un anumit comportament s fie implementat n alte clase. Interfeele i clasele Interfeele i clasele, chiar dac au definiii diferite, au foarte multe n comun. Interfeele, ca i clasele, sunt declarate n fiiere surs, cte un fiier pentru fiecare interfa. Ca i clasele, acestea sunt compilate n fiiere .class folosind compilatorul Java. Implementarea i folosirea interfeelor Cu interfeele puei face dou lucruri: s le folosii n clasele dvs. sau s definii unele proprii.

21

smaranda.belciug@inf.ucv.ro

Pentru a folosi o interfa, trebuie folosit cuvntul cheie implements ca partea a definiiei clasei. public class Neko extends java.applet.Applet implements Runnable{ //. } n acest exemplu, java.applet.Applet este superclasa, ns interfaa Runnable extinde comportamentul implementat de aceasta. Deoarece interfeele nu ofer nimic altceva dect definiii abstracte de metode, ele trbeuie implementate n clasele dvs. folosind semnturile provenite din interfa. Reinei c odat inclus o interfa, va trebui s implementai toate metodele acesteia, nu putei s alegei doar metodele de care avei nevoie. Exemplu. S presupunem c avem o implementare bun a clasei Fruct i o interfa ModelFruct, ceea ce reprezint ceea ce un Fruct este capabil s fac. Vrem s implementm o nou clas: Portocal. Dorim ca portocal s fie un fruct, ns dorim s fie i un obiect sferic pe care-l s-l aruncm, s-l rotim etc.
interface ModelFruct{ void stricare(); void stoarcere(); //.... } class Fruct implements ModelFruct{ private Color culoareaMea; private int zilePanaLaStricare; //... } interface ModelSfera{ void aruncare(); void rotire(); //.... } class Portocala extends Fruct implements ModelSfera{ //aruncare() poate sa provoace stoarcere() //(caracteristici unice pentru mine) }

Implementarea unor interfee multiple Spre deosebire de ierarhia de clase cu motenire unic, n clasele dvs putei folosi oricte interfee dorii; clasa returnat va implementa comportamentul combinat al tuturor interfeelor incluse. Pentru a include mai multe interfee ntr-o clas, separai numele lor prin virgul.

22

smaranda.belciug@inf.ucv.ro public class Neko extends Comestibil,Sortabil, Observable{ // } java.applet.Applet implements Runnable,

Totui pot aprea probleme. Ce se ntmpl cnd dou interfee definesc aceeai metod? Dac metoda area aceeai semntur n ambele interfee, implementai n clasa dvs. o metod a crei definiie satisface ambele interfee; Dac metodele au liste de parametri diferii, va fi o situaie de suprancrcare a metodelor; implementai ambele metode, fiecare cu definiii satisfcnd interfaa respectiv; Dac ambele metode au aceeai list de parametri, ns returneaz tipuri diferite, nu vei putea crea o metod care s le satisfac pe ambele. n acest caz vei avea erori. Interfeele se pot folosi i pentru combinarea metodelor diferitelor clase, pot fi folosite i pentru combinarea unor constante utile. De exemplu, dac o interfa definete un set de constante care sunt folosite apoi n mai multe clase, valoarea acestor constante poate fi modificat global fr a trebui s modificai toate clasele. Crearea i extinderea interfeelor n definiia unei interfee metodele pot fi public sau abstract. Nu se pot declara metode private sau protected ntr-o interfa. O interfa necesit doar proiectare nu i implementare!! Interfeele pot aparine unor pachete. Cum se poate defini lista de parametri pentru metodele din interfee? Nu tii ce clas urmeaz s le foloseasc! Rspunsul const n faptul c putem folosi un nume de interfa peste tot unde poate fi folosit un nume de clas. Interfeele pot fi organizate ntr-o ierarhie. Spre deosebire de clase, aici nu exist un vrf al ierarhiei. Ierarhia de interfee este una cu motenire multipl. Clase interioare Clasele care apartin unui pachet sunt clase de nivel nalt (top-level classes). Se pot defini clase n interiorul altor clase (inner classes).
import java.awt.Button; import java.awt.Color; public class Interior extends java.applet.Applet{ Button b1 = new Button("One"); ButonAlbastru b2 = new ButonAlbastru("Two");

23

smaranda.belciug@inf.ucv.ro
public void init(){ add(b1); add(b2); } class ButonAlbastru extends Button{ ButonAlbastru(String eticheta){ super(eticheta); this.setBackground(Color.BLUE); } } }

Clasele interioare sunt invizibile pentru alte clase, ceea ce nseamn c nu trebuie s v facei probleme privind conflictele de nume cu alte clase. Clasele interioare pot avea acces la variabilele i metodele din domeniul de vizibilitate al clasei de nivel superior, lucru care nu ar fi fost valabil daca ar fi fost separate.

24

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