Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Clase si obiecte in Java

java



+ Font mai mare | - Font mai mic



Clase si obiecte in Java

1.1.   Referinte

Dupa cum am aratat in capitolul 2, o clasa este un sablon pentru mai multe obiecte cu caracteristici asemanatoare. Un obiect este o colectie de variabile (atribute) si metode asociate descrise in clasa.



Clasa poate fi asemanata cu un tip de date iar obiectul cu o variabila. Daca se declara o variabila folosind numele unei clase ca si tip, aceasta variabila contine o referinta catre un obiect al clasei respective. Cu alte cuvinte, variabila nu va contine obiectul actual ci o referinta catre un obiect / o instanta a clasei. Deoarece folosind numele unei clase ca si tip se declara o referinta catre un obiect, aceste tipuri poarta numele de tipuri referinta.

Se disting doua caracteristici principale ale obiectelor in Java:

      obiectele sunt intotdeauna alocate dinamic. Durata de viata a unui obiect este determinata de logica programului. Ea incepe atunci cand obiectul este creat si se termina in momentul in care obiectul nu mai este folosit, el fiind distrus de un mecanism de curatenie oferit de limbajul Java - garbage collector (colectorul de gunoaie).

      obiectele nu sunt continute de catre variabile. O variabila pastreaza o referinta catre un obiect. o referinta este similara cu ceea ce se numeste pointer in alte limbaje de programare cum ar fi C++. Daca exista doua variabile de acelasi tip referinta si o variabila este atribuita celeilalte, ambele vor referi acelasi obiect. Daca informatia din obiect se modifica, schimbarea este vizibila in ambele variabile.

O variabila referinta poate contine si o referinta catre nimic. Valoarea unei asemenea variabile referinta este null.

In Java nu se permite tipurilor referinta sa fie convertite catre tipuri primitive sau invers.

In capitolul 2 am vazut cum se poate lucra cu tablouri (siruri) fara sa ne punem problema cu ce tip de date lucram - primitiv sau referinta. In Java, sirurile nu sunt tipuri primitive ci referinta. Ele se comporta ca niste obiecte.

1.2.   Obiecte

1.2.1.  Notiuni generale

In Java obiectele sunt create prin instantierea unei clase, cu alte cuvinte prin crearea unei instante a unei clase.

Declararea obiectului se face prin:

NumeClasa numeObiect;

Exemplu:

String s;

Complex c;

In urma declararii, variabila este initializata cu null.

Crearea obiectului echivalenta cu instantierea clasei se realizeaza prin intermediul operatorului new si presupune alocarea spatiului de memorie necesar pastrarii obiectului. Adresa (referinta) catre obiectul respectiv o sa fie memorata in variabila numeObiect.

numeObiect = new NumeClasa();

Exemplu:

s=new String() ;

Complex c=new Complex(2,3);

Declararea si crearea obiectului pot fi facute pe aceeasi linie.

Exemplu:

String s=new String() ;

Complex c=new Complex(2,3);

In momentul in care se realizeaza crearea obiectului are loc si initializarea lui.
Atentie

Spatiul de memorie nu este alocat in momentul declararii obiectului.

Exemplu:

Complex c;
c.re = 10; //EROARE!

Alocarea memoriei se face doar la apelul instructiunii new !

Referirea valorii unei variabile se face prin

obiect.variabila

Exemplu:

Complex c = new Complex();

c.re = 2;

c.im = 3;

System.out.println('Re=' +c.re+ ' Im='+c.im);

Observatie: Accesul la variabilele unui obiect se face in conformitate cu drepturile de acces pe care le ofera variabilele respective celorlalte clase.

Apelul unei metode se face prin

obiect.metoda([parametri])

Exemplu:

Complex c = new Complex();

c.setRe(2);

c.setIm(3);

In Java programatorul nu mai are responsabilitatea distrugerii obiectelor sale intrucat, in momentul rularii unui program, simultan cu interpretorul Java ruleaza si un proces care se ocupa de distrugerea obiectelor care nu mai sunt folosite. Acest proces pus la dispozitie de platforma Java de lucru se numeste garbage collector (colector de gunoaie). Un obiect este eliminat din memorie de procesul de colectare atunci cand nu mai exista nici o referinta la acesta. Referintele (care sun de fapt variabile) sunt distruse:

         natural, atunci cand variabila respectiva nu mai este folosita (de exemplu, la terminarea unei metode)

         explicit, daca atribuim variabilei respective valoare null.

1.2.2.  Operatorul de atribuire =

In cazul in care operatorul = este folosit impreuna cu date de tip primitiv, are loc o atribuire de valori.

Exemplu:

int x = 12, y = 10;

x = y;

Valoarea lui x se schimba, primind valoarea lui y.

In cazul in care operatorul = este folosit impreuna cu date de tip referinta, are loc tot o atribuire de valori. Atata doar ca valorile sunt in acest caz adrese.

Exemplu:

1.                               class Nimic

4.                               class Test

13.                           }

In linia 7 se modifica valoarea atributului x a obiectului a1. In linia 8 continutul variabilei a1 se copiaza in a2. Se afiseaza 10 10. Se schimba valoarea atributului lui a1 si, ne-am astepta sa se afiseze 5 10 dar se afiseaza 5 5. Nu este gresit! In linia 8 se copiaza valoarea lui a1 adica referinta catre obiect in a2. Din acest moment exista un singur obiect catre care refera atat a1 cat si a2. Orice modificare are loc asupra obiectului, ea este vazuta si de a1 si de a2.

Exemplu:

public class Test;

int[] a2;

a2=a1;

for(int i=0; i<a1.length; i++)

a2[i]++;

for(int i=0; i<a1.length; i++)

System.out.print(a1[i]+' ');

System.out.println('');

for(int i=0; i<a2.length; i++)

System.out.print(a2[i]+' ');

}

}

Rezultatul este:

2 3 4 5 6

2 3 4 5 6

1.2.3.  Operatorul de egalitate ==

In cazul in care operatorul == este folosit impreuna cu date de tip primitiv, are loc o testare a egalitatii valorilor celor doua variabile.

Exemplu:

int x = 12, y = 10, z = 12;

x == y are valoarea false; x si y au valori diferite

x == z are valoarea true; x si z au valori egale

In cazul in care operatorul = este folosit impreuna cu date de tip referinta, se verifica daca cele doua variabile refera acelasi obiect.

Exemplu:

1.             class Nimic

6.             }

7.             class Test

20.         }

In linia 9 se creeaza doua obiecte cu aceeasi valoare. Totusi testul din linia 10 are ca rezultat valoarea false. Dupa linia 14 cele doua variabile refera acelasi obiect si, prin urmare, testul din linia 15 are ca rezultat valoarea true.

1.3.   Clase

1.3.1.  Definirea claselor

[public][abstract][final] class NumeClasa

[extends NumeSuperclasa]

[implements Interfata1 [, Interfata2 ]]

Antetul clasei:

[public][abstract][final] class NumeClasa

este format din modificatorii clasei, cuvantul rezervat class si numele clasei NumeClasa.

Prezenta parantezelor [] indica faptul ca ceea ce este cuprins intre ele este optional.

Modificatorii clasei sunt:

         public: daca o clasa este declarata public, ea este accesibila oricarei alte clase. Daca modificatorul public nu apare, clasa poate fi accesata doar de catre clasele din pachetul caruia apartine clasa (daca nu se specifica un anume pachet, toate clasele din directorul curent sunt considerate a fi in acelasi pachet). Spatiul de cautare este definit de variabila sistem CLASSPATH.

         abstract: o clasa declarata abstracta este o clasa sablon adica ea este folosita doar pentru a crea un model comun pentru o serie de subclase. O clasa trebuie declarata abstracta daca ea este incomplet implementata adica nu toate metodele ei sunt definite. O astfel de clasa nu poate fi instantiata, dar poate fi extinsa de alte clase care sa implementeze metodele nedefinite. Doar clasele abstracte pot sa contina metode abstracte (metode declarate dar nu implementate).

         final o clasa poate fi declarata finala daca a fost complet definita si nu se doreste sa fie extinsa (sa aiba subclase); cu alte cuvinte ea nu poate apare in clauza extends a altei clase.

Observatie: O clasa declarata atat abstracta cat si finala genereaza eroare. Daca clasa este abstracta inseamna ca ea contine metode neimplementate si, prin urmare trebuie extinsa de o alta clasa care sa le implementeze. Dar, daca ar fi si finala, nu ar putea fi extinsa.

Dupa numele clasei se pot specifica, daca este cazul, clasele mostenite si interfetele implementate. O clasa poate mosteni o singura clasa, prin urmare daca apare clauza extends ea este urmata doar de numele unei clase. Insa, o clasa poate implementa mai multe interfete, ale caror nume apar dupa clauza implements si trebuie separate prin virgula. Asupra mostenirii si interfetelor se gasesc mai multe detalii in subcapitolele "Mostenire" respectiv "Interfete".

Corpul unei clase urmeaza dupa antetul clasei si este cuprins intre acolade. Contine:

         declararea variabilelor instanta si clasa care impreuna formeaza variabilele membru;

         definirea metodelor instanta si clasa care impreuna formeaza metodele membru.

Observatie: variabilele unei clase pot avea acelasi nume cu metodele clasei.

1.3.2.  Variabile membru

Variabilele se declara de obicei inaintea metodelor, desi acest lucru nu este impus de compilator.

 class NumeClasa 

Variabilele unei clase sunt doar cele care sunt declarate in corpul clasei si nu in corpul unei metode. Variabilele declarate in cadrul unei metode sunt locale metodei respective.

Declararea unei variabile presupune specificarea urmatoarelor lucruri:

         numele variabilei;

         tipul de date;

         nivelul de acces la acea variabila de catre alte clase;

         daca este constanta sau nu;

         tipul variabilei: instanta sau clasa

Tiparul declararii unei variabile este:

[modificatori] TipDeDate numeVariabila [ = valoareInitiala ] ;

unde un modificator poate fi :

         un specificator de acces: public, protected, private;

         unul din cuvintele rezervate: static, final, transient, volatile.

Exemple:

double x;

protected static int n;

public String s = 'abcd';

private Point p = new Point(10, 10);

final long MAX = 100000L;

Detalii despre modificatorii de acces se gasesc in subcapitolul "Modificatori de acces pentru membrii unei clase".

Cuvintele rezervate: static, final, transient, volatile au urmatoarele roluri:

         static este folosit pentru declararea variabilelor clasa.

Exemplu:

int x ; //variabila instanta

static int nrDeObiecteCreate; //variabila clasa

         final este folosit pentru declararea constantelor. O constanta este o variabila a carei valoare nu mai poate fi schimbata. Valoarea unei variabile finale nu trebuie specificata neaparat la declararea ei, ci poate fi specificata si ulterior, dupa care ea nu va mai putea fi modificata.

Exemplu: se declara si se initializeaza o variabila finala (linia 1). Valoarea ei nu mai poate fi modificata (linia 3).

1.             final double PI = 3.14 ;

2.            

3.             PI = 3.141 // eroare la compilare

Exemplu: se declara o variabila finala (linia 2). In linia 4 se initializeaza iar in linia 5 se doreste modificarea valorii ei.

1.             class Test

7.             }

         transient este folosit la serializarea obiectelor, pentru a specifica ce variabile membru ale unui obiect nu participa la serializare.

         volatile este folosit pentru a semnala compilatorului sa nu execute anumite optimizari asupra membrilor unei clase. Este o facilitate avansata a limbajului Java.

1.3.3.  Metode

1.3.3.1                   Definirea metodelor

Metodele sunt folosite pentru descrierea comportamentului unui obiect. O metoda se declara astfel:

[modificatori] TipReturnat numeMetoda ([argumente])

[throws TipExceptie]

1.3.3.2                   Modificatorii metodelor

Un modificator poate fi :

         un specificator de acces: public, protected, private;

         unul din cuvintele rezervate: static, abstract, final, native, synchronized.

Detalii despre modificatorii de acces se gasesc in subcapitolul "Modificatori de acces".

Cuvintele rezervate: static, abstract, final, native, synchronized au urmatoarele roluri:

         static este folosit pentru declararea metodelor clasa.

Exemplu:

void metoda1() ; //metoda de instanta

static void metoda2(); //metoda de clasa

         abstract este folosit pentru declararea metodelor abstracte. O metoda abstracta este o metoda care nu are implementare si trebuie sa apartina unei clase abstracte.

         final este folosit pentru a specifica faptul ca acea metoda nu mai poate fi supradefinita in subclasele clasei in care ea este definita ca fiind finala. Acest lucru este util daca respectiva metoda are o implementare care nu trebuie schimbata in subclasele ei.

         native este folosit pentru refolosirea unor functii scrise in alt limbaj de programare decat Java (C de exemplu).

         synchronized este folosit in cazul in care se lucreaza cu mai multe fire de executie iar metoda respectiva se ocupa cu partajarea unei resurse comune. Are ca efect construirea unui semafor care nu permite executarea metodei la un moment dat decat unui singur fir de executie.

1.3.3.3                   Tipul returnat de o metoda

Metodele pot sa returneze sau nu o valoare (un obiect) la terminarea lor. Tipul valorii returnate poate fi atat un tip primitiv de date (int, double, etc.) cat si o referinta la un obiect al unei clase. In cazul in care o metoda nu returneaza nimic atunci TipReturnat este void.

Exemplu: void afisareRezultat()

Returnarea valorii de catre o metoda se realizeaza prin intermediul instructiunii return.

Daca o metoda returneaza o valoare de un tip de baza atunci tipul ei trebuie sa coincida cu TipReturnat, in caz contrar se primeste eroare la compilare.

Exemplu: Metoda care calculeaza maximul a doua numere

public int max(int a, int b)

Daca valoarea returnata este o referinta la un obiect al unei clase, atunci clasa obiectului returnat trebuie sa coincida sau sa fie o subclasa a clasei specificate la declararea metodei.

1.3.3.4                   Parametrii unei metode

Dupa cum am vazut, numele clasei este urmat de lista parametrilor (argumentelor), lista care este optionala (o metoda poate sa nu aiba parametrii). Parametrii sunt specificati prin numele si tipul lor, fiind despartiti unul de altul prin virgula.

 NumeMetoda([tip1 argument1], [tip2 argument2]  ) 

Tipul de date al unui argument poate fi orice tip valid al limbajului, atat tip primitiv de date cat si referinta la un obiect.

Exemplu:

 void adaugarePersoana(String nume, int varsta, float salariu)
unde String este tip referinta, int si float sunt tipuri primitive.

In Java o metoda nu poate primi un numar variabil de argumente, ceea ce inseamna ca apelul unei metode trebuie sa se faca cu specificarea exacta a numarului si tipurilor argumentelor.

Nu este permisa gruparea parametrilor dupa tipul lor.

Exemplu:

public int max(int a,b) //este gresit

public int max(int a, int b) //este corect

Numele argumentelor primite trebuie sa difere intre ele si nu trebuie sa coincida cu numele nici uneia din variabilele locale ale metodei. Pot insa, sa coincida cu numele variabilelor membre ale clasei caz in care diferentierea se va face prin intermediul variabile this. Vezi subcapitolul "Obiectul this"

Exemplu:

class Complex

}

Atentie: In Java argumentele sunt trimise doar prin valoare !!!

Asta insemna ca metoda receptioneaza doar valorile variabilelor primite ca parametri. Cand argumentul are tip primitiv de date metoda nu-i poate schimba valoarea decat local (in cadrul metodei); la revenirea din metoda variabila are aceeasi valoare ca la apelul initial al metodei (modificarile facute in cadrul metodei sunt pierdute). Cand argumentul este de tip referinta metoda nu poate schimba referinta obiectului insa poate schimba variabilele membru ale respectivului obiect. Prin urmare, daca dorim ca o metoda sa schimbe starea (valoarea) unui argument primit, atunci el trebuie sa fie neaparat de tip referinta (trebuie sa fie un obiect!).

1.3.4.  Constructorii unei clase

Constructorii unei clase sunt metode speciale care au acelasi nume cu cel al clasei, nu returneaza nici o valoare si sunt folositi pentru initializarea obiectelor acelei clase in momentul instantierii lor. Constructorii controleaza modul in care un obiect este creat si initializat.

class Complex

}

O clasa poate avea unul sau mai multi constructori care trebuie insa sa difere prin lista de parametri primiti. Astfel sunt permise diferite tipuri de initializari ale obiectului la crearea sa, in functie de numarul parametrilor cu care este apelat constructorul.

Exemplu: Clasa Complex are trei constructori: unul fara parametrii definit in liniile 3-5, altul cu doi parametrii definit in liniile 6-8, altul cu un parametru definit in liniile 9-11.

1.             class Complex

6.             Complex(double r, double i )

9.             Complex(double r)

12.         }

Constructorii sunt apelati automat la instantierea unui obiect. In cazul in care dorim sa apelam explicit constructorul unei clase folosim metoda this(argumente), care apeleaza constructorul corespunzator (ca argumente) al clasei respective. Aceasta metoda este folosita atunci cand sunt implementati mai multi constructori pentru o clasa pentru a nu repeta secventele de cod scrise la constructorii cu mai putine argumente.

Exemplu: In clasa Complex a fost definit constructorul cu doi parametrii. Ceilalti doi constructori fac apel la constructorul cu doi parametrii in liniile 4 si 10.

1.             class Complex

6.             Complex(double r, double i )

9.             Complex(double r)

12.         }

Daca intr-o clasa nu este defineste nici un constructor, sistemul ii creeaza automat un constructor implicit care nu primeste nici un argument. El initializeaza variabilele membru de tipuri primitive cu 0 si pe cele de tipuri referinta cu null. Deci prezenta constructorilor in corpul unei clase nu este obligatorie. Daca intr-o clasa a fost definit cel putin un constructor cu parametrii, atunci constructorul implicit (fara parametrii) nu va mai fi creat automat.

Exemplu: In clasa Complex nu a fost definit nici un constructor. In linia 5 se apeleaza constructorul implicit creat automat pentru clasa Complex.

1.             class Complex

4.            

5.             Complex c= new Complex();

Exemplu: In clasa Complex au fost definiti doi constructori: cu un parametru si cu doi parametrii. In linia 11 se apeleaza constructorul fara parametrii. Aceasta linie genereaza o eroare deoarece nu exista constructor fara parametrii - el nu a fost creat implicit.

1.             class Complex

6.             Complex(double r)

9.             }

10.        

11.         Complex c= new Complex();

Constructorii unei clase pot avea urmatorii specificatori de acces:

private: nici o alta clasa nu poate instantia obiecte ale acestei clase. O astfel de clasa poate contine metode publice care sa-si creeze propriile obiecte si sa le returneze altor clase;

public: orice clasa poate crea instante ale clasei respective;

protected: doar subclasele pot crea obiecte de tipul clasei respective.

Daca specificatorul lipseste, doar clasele din acelasi pachet pot crea instante ale clasei respective.

1.3.5.  Obiectul this

Obiectul this este o referinta catre obiectul curent.

Este folosit in trei situatii:

         in cadrul unei metode care are parametrii cu nume identic cu numele atributelor clasei. In aceasta situatie, trebuie facuta o diferenta intre cele doua. Cu this se califica atributele clasei.

Exemplu: Metoda schimba primeste doi parametrii cu acelasi nume cu atributele clasei: re si im.

1.             class Complex

7.             }

         in cadrul constructorilor pentru a apela ceilalti constructori ai clasei.

Exemplu: In liniile 4 si 11 se apeleaza constructorul cu doi parametrii definit in liniile 6-9.

1.             public class Rational

6.             public Rational(long m,long n)

10.         public Rational(long m)

13.         }

         pentru a testa ca obiectul primit ca parametru nu este chiar obiectul curent.

Exemplu: Clasa ContBancar contine metoda transfer in care se transfera suma de bani din contul primit in contul curent - liniile 10, 11. In linia 15 se creeaza un obiect ContBancar. In linia 16 se apeleaza metoda transfer a obiectului c cu parametru c. Asta inseamna ca, suma din contul c va fi transferata tot in contul c. Citind cu atentie codul din liniile 10, 11 observam ca se aduna suma primita (c.suma) la suma actuala (this.suma) - in cazul nostru, contul isi dubleaza suma, dupa care suma contului primit (c.suma) se face zero.

1.             public class ContBancar

6.             public ContBancar(long suma)

9.             public void transfer(ContBancar c)

13.         }

14.        

15.         ContBancar c=new ContBancar(100);

16.         c.transfer(c);

Din punct de vedere logic, nu este corect. Ar trebui ca inaintea inceperii transferului de bani sa se verifice daca nu cumva este vorba despre acelasi cont, caz in care nu ar trebui sa se intample nimic. Metoda transfer ar arata astfel:

1.             public void transfer(ContBancar c)

7.             }

In linia 2, this reprezinta obiectul curent iar c obiectul primit ca parametru.

1.3.6.  Supraincarcarea si supradefinirea metodelor

         supraincarcarea (overloading): in cadrul unei clase pot exista metode cu acelasi nume cu conditia ca ele sa difere prin lista parametrilor - diferenta consta in numarul parametrilor sau in tipul lor. Astfel la apelul metodei cu acel nume se poate face distinctia intre ele si se stabileste in mod unic care dintre ele se executa.

Exemplu: In clasa Maxim sunt definite doua metode max cu doi respectiv cu trei parametrii.

1.                       public class Maxim

5.                       public static int max(int a, int b, int c)

10.                   public static void main(String args[])

17.                   }

.

         supradefinirea (overriding): o subclasa a unei clase poate rescrie o metoda a clasei parinte, prin implementarea unei metode cu acelasi antet ca al superclasei.

1.3.7.  Modificatori de acces pentru membrii unei clase

Sunt cuvinte rezervate ce controleaza accesul celorlalte clase la membrii unei clase. Modificatoriii de acces pentru variabilele si metodele unei clase sunt: public, protected, private si cel implicit. Nivelul lor de acces este dat in tabelul de mai jos:

Modificator

Clasa

Subclasa

Pachet

Altundeva

private

x

protected

x

x

x

public

x

x

x

x

implicit

x

x

Dupa cum se vede in tabelul de mai sus, modificatorii au urmatoarele semnificatii.

private - un membru declarat private este accesibil doar in clasa in care este declarat;

protected - un membru declarat protected este accesibil oricarei clase care apartine aceluiasi pachet ca si clasa in care este declarat membrul; de asemenea, este accesibil si oricarei subclase a clasei respective;

public - un membru declarat public este accesibil oricarei clase indiferent de locul unde se afla ea.

Daca modificatorul unui membru lipseste, se considera implicit un modificator "friendly" care da acces oricarei clase din pachetul respectiv.

Exemple:

 private int re,im;
 protected String secret;
 public float[] elemente;
 long x; 
 private void metodaInterna();
 public void setRe(int re);

Observatie: In cazul in care declaram un membru 'protected' atunci accesul la acel membru din subclasele clasei in care a fost declarata variabila depinde si de pachetul in care se gaseste subclasa: daca sunt in acelasi pachet accesul este permis, daca nu sunt in acelasi pachet accesul nu este permis decat pentru obiecte de tipul subclasei.

1.3.8.  Membrii instanta si membrii clasa

O clasa Java poate contine doua tipuri de variabile si metode :

         instanta: declarate fara modificatorul static, specifice fiecarei instante

         clasa: declarate cu modificatorul static, specifice clasei

Daca o variabila este declarata statica atunci exista doar o copie a variabilei asociata cu clasa respectiva si nu mai multe copii ale ei asociate cu fiecare instanta a clasei.

O variabila clasa exista si poate fi folosita chiar daca clasa nu a fost instantiata spre diferenta de variabilele instanta care exista doar dupa ce a fost creata o instanta a clasei.

Pentru variabilele statice sistemul aloca o singura zona de memorie la care au acces toate instantele clasei respective, ceea ce inseamna ca daca un obiect modifica valoarea unei variabile statice, modificarea va fi vazuta de catre toate celelalte obiecte. Variabilelor statice nu li se aloca dinamic memorie; memoria pentru ele este rezervata inainte ca oricare obiect al clasei sa fie creat. In cazul variabilelor instanta, la fiecare creare a unei instante a clasei sistemul aloca o zona de memorie separata pentru memorarea valorii ei.

Exemplu: Clasa Punct contine doua variabile instanta declarate pe linia 2 si o variabila clasa declarata si initializata pe linia 3. Constructorul clasei Punct initializeaza variabilele instanta si incrementeaza variabila clasa. Cu alte cuvinte, variabila nr_puncte va contoriza cate "puncte" (instante ale clasei Punct) se creeaza. In clasa TestPunct se creeaza trei obiecte de tipul Punct si se afiseaza valoarea variabilei clasa nr_puncte. Trebuie remarcat ca variabila nr_puncte este accesata prin intermediul numelui clasei.

1.             class Punct

8.             }

9.             class TestPunct

16.         }

Intrucat metodele clasa nu depind de starea obiectelor clasei respective, apelul lor se poate face prin:

 NumeClasa.metodaStatica(); 

sau

 NumeClasa obiect = new NumeClasa();
 obiect.metodaStatica(); 

In cazul metodelor instanta apelul nu se poate face decat prin intermediul unui obiect:

 NumeClass.metodaInstanta(),  //ilegal
 NumeClasa obiect = new NumeClasa();
 obiect. metodaDeInstanta(); //legal

Exemplu: In clasa Cerc sunt definite: o metoda instanta in liniile 6-11 care returneaza cercul cu raza cea mai mare si o metoda clasa in liniile 12-18 care returneaza cercul cu raza cea mai mare dintre cele doua cercuri primite ca parametru. In liniile 21, 22 sunt create doua cercuri a si b cu raze diferite. In linia 23 este apelata metoda maimare a obiectului a. In linia 24 este apelata metoda maimare a clasei Cerc.

1.             class Cerc

6.             Cerc maimare(Cerc c)

12.         static Cerc maimare(Cerc a, Cerc b)

18.         }

19.        

20.        

21.         Cerc a=new Cerc(10, 10, 50);

22.         Cerc b=new Cerc(20, 20, 100);

23.         Cerc c = a.maimare(b);

24.         Cerc d = Cerc.maimare(a,b);

Metodele clasa nu pot accesa campuri sau metode instanta.

Metodele instanta pot accesa atat membrii clasa cat si instanta.

Membrii clasa (statici) sunt folositi pentru a pune la dispozitie valori si metode independente de starea obiectelor dintr-o anumita clasa.

Spre deosebire de C++, in Java nu putem avea functii globale definite ca atare, intrucat 'orice este un obiect'. Din acest motiv si metodele care au o functionalitate globala trebuie implementate in cadrul unei clase. Acest lucru se va face prin intermediul metodelor clasa (globale), deoarece acestea nu depind de starea particulara a obiectelor din clasa respectiva. De exemplu, sa consideram functia globala sqrt care extrage radicalul dintr-un numar si care se gaseste in clasa Math. Daca nu ar fi fost functie clasa, apelul ei ar fi trebuit facut astfel:

 Math m = new Math();
 double rad121 = m.sqrt(121);

ceea ce ar fi fost extrem de neplacut pentru programatori. Fiind insa functie statica ea poate fi apelata prin: Math.sqrt(121).

1.3.9.  Argumente in linia de comanda

In sfarsit suntem in masura sa descifram antetul metodei main.

public static void main(String args[])

Metoda main primeste un sir de String-uri ca parametru. Prin intermediul lui o aplicatie Java poate primi oricate argumente din linia de comanda in momentul lansarii ei. Aceste argumente sunt utile pentru a permite utilizatorului sa specifice diverse optiuni legate de functionarea aplicatiei sau sa furnizeze anumite date initiale programului.

Argumentele din linia de comanda sunt introduse la lansarea unei aplicatii, fiind specificate dupa numele aplicatiei si sunt separate prin spatiu.

Formatul general pentru lansarea unei aplicatii care primeste argumente din linia de comanda este:

 java NumeAplicatie [arg1 arg2 . . . argn] 

Evident, o aplicatie poate sa nu primeasca nici un argument sau poate sa ignore argumentele primite din linia de comanda.

In momentul lansarii unei aplicatii interpretorul parcurge linia de comanda cu care a fost lansata aplicatia si, in cazul in care exista argumente, ii transmite aplicatiei sub forma sirului de String-uri.

Numarul argumentelor primite de un program este dat de dimensiunea vectorului args -args.length:

 numarArgumente = args.length ;


Exemplu: Afisarea argumentelor primite din linia de comanda

public class ArgLinCom

}

Un apel de genul:

java ArgLinCom Nu mai vine primavara odata

va produce urmatorul rezultat:

Nu

mai

vine

primavara

odata

Daca o anumita parte din sirul de intrare este cuprinsa intre ghilimelele se interpreteaza ca un singur argument, spatiile fiind ignorate.

Una apel de genul:

java ArgLinCom 'Nu mai vine' primavara odata

va produce urmatorul rezultat:

Nu mai vine

primavara

odata

Daca se doreste ca din linia de comanda sa fie transmise argumente numerice, acestea sunt primite de metoda main sub forma unui vector de String-uri. Ulterior ele trebuie convertite din String-uri in numere. Acest lucru se realizeaza cu metode de tipul parseXXX aflate in clasa XXX corespunzatoare tipului in care vrem sa facem conversia: Integer, Float, Double, etc.

Exemplu:

1.             public class Maxim

5.             public static int max(int a, int b, int c)

10.         public static void main(String args[])

15.         int a=Integer.parseInt(args[0]),

16.         b=Integer.parseInt(args[1]),

17.         c=Integer.parseInt(args[2]),

18.         m;

19.         m=max(a,b);

20.         System.out.println('Maximul dintre '+a+' si '+b+' este: '+m);

21.         m=max(a,b,c);

22.         System.out.println('Maximul dintre '+a+', '+b+' si '+c+' este: '+m);

23.         }

24.         }

In linia 11 se verifica daca au fost transmisi atatia parametrii cati sunt necesari. In liniile 15-17 se convertesc argumentele in intregi.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1858
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved