Sunteți pe pagina 1din 8

TEHNOLOGII JAVA

PENTRU DEZVOLTAREA APLICAIILOR


LUCRARE DE LABORATOR 7

Variabile shadow. Suprascrierea metodelor in Java


Ascunderea si ncapsularea datelor.
I.

SCOPUL LUCRRII

Lucrarea de fa are rolul de a prezenta i familiariza studentul cu noiuni ale


limbajului Java referitoare la: variabile shadow, suprascrierea metodelor, ascunderea i
ncapsularea datelor.
La sfritul acestei lucrri, studentul va avea posibilitatea s scrie programe Java n
care s foloseasc noiunile nvate.

II.

NOIUNI TEORETICE

1. Variabile shadow
Vezi Curs 7, seciunea 4.6.

Consideram urmtorul exemplu:


public class Televizor
{
int diagonala;
public String nume;
static public int an_fabricatie;
public boolean merge;
public Televizor(String num,int an,int diag,boolean stare)
{
nume=num;
an_fabricatie=an;
diagonala=diag;
merge=stare;
}
static int getAnFabricatie()
{
return an_fabricatie;
}
public void afisare()
{
System.out.println("Nume: "+nume);
if(merge)
System.out.println("Televizorul este in stare buna de
functionare\n");

else
System.out.println("Televizorul nu este in stare buna
de functionare \n");
}
public static void main(String args[ ]) {
System.out.println("Anul fabricatiei este: "
+Televizor.getAnFabricatie());
Televizor t1=new Televizor("Panasonic", 2002, 51, true);
t1.afisare();
}
}
public class TelevizorColor extends Televizor
{
int diagonala;
public TelevizorColor(String num, int an, int diag,
boolean stare)
{
nume=num;
an_fabricatie=an;
diagonala=diag;
merge=stare;
}
... //cititi observatiile de mai jos si accesati variabila
//diagonala in cadrul acestei clase
}

Observaii:
Observm declaraia n clasa TelevizorColor a unei variabile cu numele
diagonala, care umbrete variabila cu acelai nume declarat n clasa Televizor.
Dac accesm numele diagonala sau sinonimul this.diagonala n cadrul clasei
TelevizorColor vom accesa variabila diagonala declarat n TelevizorColor.
Altfel, putem sa distribuim (cast) pe this clasei corespunztoare apoi s accesm
variabila shadow: ((Televizor this) .diagonala.
Aceast tehnic este util atunci cnd n cadrul unei clase se dorete s se
acceseze o variabil shadow dintr-o clas care nu este superclasa acesteia.

2. Suprascrierea metodelor in Java


Vezi Curs 7, seciunea 4.7.

Considerm urmtorul exemplu:


public class Televizor
{
int diagonala=51;
int an_fabricatie=2001;

int getAnFabricatie()
{
return an_fabricatie;
}
int getDiagonala()
{
return diagonala;
}
}
public class TelevizorColor extends Televizor
{
int diagonala=52;
int an_fabricatie=2000;
int getAnFabricatie()
{
return an_fabricatie+1;
}
int getDiagonala()
{
return diagonala-1;
}
}
...//realizati afisarea
//descrise mai sus

anumitor

informatii

folosind

metodele

Observaii:
Am declarat n clasa TelevizorColor metodele getAnFabricatie() i
getDiagonala() avnd acelai nume, tip i aceleai argumente cu metodele din cadrul
superclasei Televizor.
Cnd aceste metode sunt invocate pentru un obiect al clasei TelevizorColor este
apelat metoda din cadrul ei i nu cea a superclasei Televizor.
Trebuie reinut faptul c suprascrierea metodelor nu este acelai lucru cu
suprancrcarea metodelor (n cazul suprancrcrii metodelor este vorba de mai multe
metode cu acelai nume dar cu liste de argumente diferite).
De asemenea, trebuie tiut faptul c suprascrierea metodelor nu reprezint, la
nivelul metodelor, acelai lucru ca i variabilele shadow (vezi cursul 7, sectiunea 4.7).

3. Ascunderea si incapsularea datelor


Vezi Curs 7, seciunea 4.8.

Java ofer diveri modificatori utilizai n controlul scopului metodelor i


variabilelor (cmpurilor): private, protected, public, final, static.
Implicit metodele/variabilele au scopul package, sunt non-statice (aparin fiecrei
instane), i non-finale(pot fi suprascrise n clasele derivate). Tendina este s folosim
modificatorii implicii.
Programarea obiectual ns, indic "ascunderea" metodelor/cmpurilor i
expunerea doar a celor strict necesare. Constantele ar trebui marcate static final. De

asemenea metodele/cmpurile dac se poate ar trebui declarate final, i chiar private.


Dac se poate chiar i static (metodele statice sunt mai rapide).
Cnd discutm despre drepturile de acces la membrii unei clase trebuie s
abordm acest subiect din 2 perspective:
A. Interiorul clasei sau, mai concret, metodele clasei. n cadrul metodelor unei
clase exist acces nerestrictiv la toi membrii, date sau funcii. De exemplu, n metodele
clasei Punct se face referire la cmpurile x i y. n mod asemntor s-ar fi putut referi
(apela) i metodele. De exemplu, am fi putut defini funcia move pe baza funciei init
astfel:
class Punct{
//. . .
public void move(int dx, int dy) {
init(x+dx, y+dy);
}
//. . .
}
Se observ c n interiorul clasei nu se folosete notaia cu punct pentru a referi
membrii, acetia fiind pur i simplu accesai prin numele lor. Cnd o metod face referire
la ali membri ai clasei, de fapt sunt accesai membrii corespunztori ai obiectului
receptor, indiferent care ar fi el. De exemplu, cand se apeleaz metoda init a obiectului
referit de p1, are loc iniializarea membrilor x i y ai acelui obiect. n legatur cu accesul
din interiorul unei clase, trebuie spus c absena restriciilor se aplic i dac este vorba
despre membrii altui obiect din aceeai clas, dar diferit de cel receptor. De exemplu,
dac n clasa Punct am avea cte o metod de calcul al distanei pe verical/orizontal
dintre 2 puncte, unul fiind obiectul receptor, iar cellalt un obiect dat ca parametru,
atunci am putea scrie:
class Punct{
//. . .
public int
return
}
public int
return
}
//. . .
}

distV(Punct p) {
y - p.y;
distH(Punct p) {
x - p.x;

Se observ c din interiorul metodelor distV / distH putem accesa liber membrii
privai ai obiectului p dat ca parametru. La fel ar sta lucrurile i daca p ar fi o variabil
local a unei metode din clasa Punct.
B. Exteriorul sau clienii clasei. Clienii unei clase pot accesa doar acei membri
care au ca modificator de acces cuvntul public. Membrii declarai cu modificatorul
private NU sunt vizibili n afar, sunt ascuni. Dac am ncerca s folosim n metoda
main din exemplul nostru o referin de genul:
p1.x

compilatorul ar raporta o eroare. O observaie important pe care o putem desprinde din


exemplul clasei Punct este aceea c structura unei clase, sau modul ei de reprezentare,
care este dat de variabilele membru, de regul se ascunde fa de clieni. Dac este
necesar ca acetia s poat consulta valorile datelor membru, se va opta pentru definirea
unor metode de genul getValoare, iar nu pentru declararea datelor respective ca fiind
publice.
ntr-o clas Java putem declara membri care s nu fie precedai de nici unul dintre
modificatorii public sau private. n acest caz, membrii respectivi se spune c sunt
accesibili la nivel de pachet ("package").
S considerm urmtorul exemplu: un program pentru Pentagon ce controleaz
toate rachetele nucleare adpostite n silozuri de pe teritoriul S.U.A. n acest caz,
programul ar putea folosi obiecte de tip silo (vezi clasa silo de mai jos).
Din motive de securitate, pentru a lansa o rachet programul trebuie s specifice o
parol. Dac parola este corect, variabila lanseaza_rachete primete valoarea 1, iar
rachetele vor fi lansate. Dac parola nu este corect, variabila rmne 0 iar rachetele nu
vor fi lansate. Dac toi membrii clasei ar fi declarai public, atunci orice clas Java care
utilizeaz obiecte silo va putea folosi urmtoarea instruciune pentru a lansa rachete
ignornd funcia de acces prin parol (void lansare_rachete(char *Parola)):
wyoming_silo.lanseaza_rachete=1;

(unde wyoming_silo este un obiect de tipul silo)


Cnd se folosesc obiecte, accesul la majoritatea variabilelor membru trebuie limitat
la funciile membru. Astfel, singura modalitate ca programul s aib acces la variabila
membru lanseaza_rachete este prin folosirea unei funcii membru (n cazul nostru
lansare_rachete(char *Parola)), adic programul este forat s joace dup regulile
impuse de creatorul su. Pentru a restriciona accesul la membrii clasei, se poate folosi
cuvntul cheie private.
class silo
{
private String locatia;
private int tip_racheta;
private int lanseaza_rachete; // daca este 0 nu se lanseaza,
// daca este 1 se lanseaza
private String parola;
public silo(int tipRacheta, String loc)
{
tip_racheta=tipRacheta;
locatia=loc;
lanseaza_rachete=0;
parola="hillary";
}
public void lansare_rachete(String Parola)
{
if (parola.compareTo(Parola)==0)
lanseaza_rachete=1;
else lanseaza_rachete=0;
}

public void mesaj()


{
if (lanseaza_rachete==1)
{
System.out.println("parola corecta; rachetele s-au lansat");
System.out.println("tip rachete="+tip_racheta+" -destinatie="+locatia+" \n");
}
else
System.out.println("parola incorecta; rachetele nu s-au
lansat \n");
}
}
public class siloTest
{
public static void main(String args[ ])
{
silo s=new silo(1,"Moscova");
s.lansare_rachete("ana");
s.mesaj();
s.lansare_rachete("hillary");
s.mesaj();
}
}

S considerm i alte cteva exemple utile.


package pac1;
public class produs
{
private String denumire;
protected int cantitate;
public int cod;
public produs(String den,int cant,int cod)
{
denumire=den;
cantitate=cant;
this.cod=cod;
}
public void afis( )
{
System.out.println("denumire="+denumire+"
cantitate="+cantitate+" cod="+cod+" \n");
}
}

Fiierul produs.java se va salva n subdirectorul pac1 din:


c:\JBulider7\jdk1.3.1\bin\pac1

package pac2;
import pac1.produs;
public class TestProdus
{
public static void main(String args[ ])
{
produs p=new produs("Poiana",23,287);
p.afis( );
p.cod=112; // ok; "cod" este "public"
p.afis();
//
p.cantitate+=10; eroare - "cantitate" este "protected"
//
p.denumire="Laura"; eroare - "denumire" este "private"
}
}

Fiierul TestProdus.java se va salva n subdirectorul pac2 din:


c:\JBulider7\jdk1.3.1\bin\pac2
Pentru lansarea n execuie se va utiliza comanda: java pac2.TestProdus
package pac;
class produs
{
private String denumire;
protected int cantitate;
public int cod;
public produs(String den,int cant,int cod)
{
denumire=den;
cantitate=cant;
this.cod=cod;
}
public void afis()
{
System.out.println("denumire="+denumire+"
cantitate="+cantitate+" cod="+cod+" \n");
}
}

Fiierul produs.java se va salva n subdirectorul pac din:


c:\JBulider7\jdk1.3.1\bin\pac
package pac;
public class TestProdus
{
public static void main(String args[])
{
produs p=new produs("Poiana",23,287);
p.afis();
p.cod=112; // ok; "cod" este "public"
p.cantitate+=10;// ok - "cantitate" este "protected"
p.afis();
//
p.denumire="Laura"; eroare - "denumire" este "private"
}
}

Fiierul TestProdus.java se va salva n subdirectorul pac din:


c:\JBulider7\jdk1.3.1\bin\pac
Pentru lansarea n execuie se va utiliza comanda: java pac.TestProdus

III.

MODUL DE LUCRU

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. Fiierul trebuie salvat la urmtoarea locaie:
c:\JBulider7\jdk1.3.1\bin
3. Compilarea mini-aplicaiei Java se va face din linia de comand. Se poate proceda
astfel. Se deschide o fereastr MS-Dos: Start ->Run, se tiprete command n csua
de text i se apas butonul OK. Printr-o schimbare de directoare i subdirectoare se
trece la locaia: c:\JBulider7\jdk1.3.1\bin. Sau, se lanseaz WindowsCommander.
Se trece la locaia c:\JBulider7\jdk1.3.1\bin. Se deschide o fereastr MS-Dos:
Commander ->Run Dos.
4. Pentru compilare, se tiprete la prompter javac nume_fiier_surs.java i se apas
Enter. De ex., dac fiierul se numete Test.java, se va scrie javac Test.java. n cazul
n care programul conine erori acestea vor fi semnalate i afiate n fereastra
MS-Dos, dup care va apare iar prompter-ul. Dac programul nu conine erori i
compilarea se face cu succes, atunci va apare numai prompter-ul.
5. Pentru rularea aplicaiei Java, se lanseaz interpretorul Java. Se tiprete la prompter
urmtoarea comand java nume_clas_care_conine_main i se apas Enter. De
ex., dac clasa din program care conine metoda main( ) se numete Test, se va scrie
java Test.

IV.

TEM

1. Se vor parcurge toate exemplele prezentate n platforma de laborator testndu-se


practic, explicnd rezultatele obinute.
2. Integrai clasele Televizor i TelevizorColor ntr-un program Java funcional, n
care s se defineasc cte dou instane pentru fiecare din clasele de mai sus i s se
foloseasc metodele definite pentru a afia proprietile instanelor.
Explicai la fiecare caz n parte rezultatele obinute.