laborator7 -Java

download laborator7 -Java

of 8

Transcript of laborator7 -Java

  • 7/25/2019 laborator7 -Java

    1/8

    TEHNOLOGII JAVA

    PENTRU DEZVOLTAREA APLICAIILORLUCRARE DE LABORATOR 7

    Variabile shadow. Suprascrierea metodelor in JavaAscunderea si ncapsularea datelor.

    I. SCOPUL LUCRRII

    Lucrarea de fa are rolul de a prezenta i familiariza studentul cu noiuni alelimbajului Java referitoare la: variabile shadow, suprascrierea metodelor, ascunderea incapsularea datelor.

    La sfritul acestei lucrri, studentul va avea posibilitatea sscrie programe Java n

    care sfoloseascnoiunile 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 defunctionare\n");

    1

  • 7/25/2019 laborator7 -Java

    2/8

    else

    System.out.println("Televizorul nu este in stare bunade 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//diagonalain cadrul acestei clase

    }

    Observaii:Observm declaraia n clasa TelevizorColor a unei variabile cu numele

    diagonala, care umbrete variabila cu acelai nume declaratn clasa Televizor.

    Dacaccesm numele diagonala sau sinonimul this.diagonala n cadrul claseiTelevizorColorvom accesa variabila diagonaladeclaratn TelevizorColor.

    Altfel, putem sa distribuim (cast) pe thisclasei corespunztoare apoi saccesmvariabila shadow: ((Televizor this) .diagonala.

    Aceast tehnic este util atunci cnd n cadrul unei clase se dorete s seacceseze o variabilshadow dintr-o clascare 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;

    2

  • 7/25/2019 laborator7 -Java

    3/8

    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 anumitor informatii folosind metodele

    //descrise mai sus

    Observaii:

    Am declarat n clasa TelevizorColor metodele getAnFabricatie() igetDiagonala() avnd acelai nume, tip i aceleai argumente cu metodele din cadrulsuperclasei Televizor.

    Cnd aceste metode sunt invocate pentru un obiect al clasei TelevizorColoresteapelatmetoda din cadrul ei i nu cea a superclasei Televizor.

    Trebuie reinut faptul c suprascrierea metodelor nu este acelai lucru cusuprancrcarea metodelor (n cazul suprancrcrii metodelor este vorba de mai multemetode cu acelai nume dar cu liste de argumente diferite).

    De asemenea, trebuie tiut faptul c suprascrierea metodelor nu reprezint, lanivelul 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 ivariabilelor (cmpurilor):private, protected, public, final, static.

    Implicit metodele/variabilele au scopulpackage, sunt non-statice (aparin fiecreiinstane), i non-finale(pot fi suprascrise n clasele derivate). Tendina este s folosimmodificatorii implicii.

    Programarea obiectual ns, indic "ascunderea" metodelor/cmpurilor i

    expunerea doar a celor strict necesare. Constantele ar trebui marcate static final. De

    3

  • 7/25/2019 laborator7 -Java

    4/8

    asemenea metodele/cmpurile dac se poate ar trebui declarate final, i chiar private.Dacse poate chiar i static (metodele statice sunt mai rapide).

    Cnd discutm despre drepturile de acces la membrii unei clase trebuie sabordm acest subiect din 2 perspective:

    A.Interiorul claseisau, mai concret, metodele clasei. n cadrul metodelor uneiclase existacces nerestrictiv la toi membrii, date sau funcii. De exemplu, n metodeleclasei Punctse 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 movepe baza funciei initastfel:

    class Punct{//. . .

    public void move(int dx, int dy) {init(x+dx, y+dy);

    }

    //. . .}

    Se observcn interiorul clasei nu se folosete notaia cu punct pentru a referimembrii, acetia fiind pur i simplu accesai prin numele lor. Cnd o metodface referirela ali membri ai clasei, de fapt sunt accesai membrii corespunztori ai obiectuluireceptor, indiferent care ar fi el. De exemplu, cand se apeleazmetoda inita obiectuluireferit de p1, are loc iniializarea membrilor x i y ai acelui obiect. n legaturcu accesuldin interiorul unei clase, trebuie spus cabsena restriciilor se aplici daceste vorbadespre membrii altui obiect din aceeai clas, dar diferit de cel receptor. De exemplu,dacn clasa Punct am avea cte o metodde calcul al distanei pe verical/orizontaldintre 2 puncte, unul fiind obiectul receptor, iar cellalt un obiect dat ca parametru,atunci am putea scrie:

    class Punct{//. . .

    public int distV(Punct p) {return y - p.y;

    }public int distH(Punct p) {

    return x - p.x;}//. . .

    }

    Se observcdin interiorul metodelor distV / distHputem accesa liber membriiprivai ai obiectului pdat ca parametru. La fel ar sta lucrurile i daca par fi o variabillocala unei metode din clasa Punct.

    B.Exteriorul sau clienii clasei. Clienii unei clase pot accesa doar acei membricare 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 metodamaindin exemplul nostru o referinde genul:

    p1.x

    4

  • 7/25/2019 laborator7 -Java

    5/8

    compilatorul ar raporta o eroare. O observaie importantpe care o putem desprinde dinexemplul clasei Puncteste aceea cstructura unei clase, sau modul ei de reprezentare,care este dat de variabilele membru, de regul se ascunde fa de clieni. Dac estenecesar ca acetia spoatconsulta valorile datelor membru, se va opta pentru definirea

    unor metode de genul getValoare, iar nu pentru declararea datelor respective ca fiindpublice.

    ntr-o clasJava putem declara membri care snu fie precedai de nici unul dintremodificatorii public sau private. n acest caz, membrii respectivi se spune c suntaccesibili la nivel de pachet ("package").

    S considerm urmtorul exemplu: un program pentru Pentagon ce controleaztoate rachetele nucleare adpostite n silozuri de pe teritoriul S.U.A. n acest caz,

    programul ar putea folosi obiecte de tip silo (vezi clasa silode mai jos).Din motive de securitate, pentru a lansa o rachetprogramul trebuie sspecifice o

    parol. Dac parola este corect, variabila lanseaza_rachete primete valoarea 1, iar

    rachetele vor fi lansate. Dacparola nu este corect, variabila rmne 0 iar rachetele nuvor fi lansate. Dactoi membrii clasei ar fi declaraipublic, atunci orice clasJava careutilizeaz obiecte silo va putea folosi urmtoarea instruciune pentru a lansa racheteignornd funcia de acces prin parol(void lansare_rachete(char *Parola)):

    wyoming_silo.lanseaza_rachete=1;(unde wyoming_siloeste un obiect de tipul silo)

    Cnd se folosesc obiecte, accesul la majoritatea variabilelor membru trebuie limitatla funciile membru. Astfel, singura modalitate ca programul s aibacces la variabilamembru lanseaza_rachete este prin folosirea unei funcii membru (n cazul nostrulansare_rachete(char *Parola)), adic programul este forat s joace dup regulileimpuse de creatorul su. Pentru a restriciona accesul la membrii clasei, se poate folosicuvntul cheieprivate.

    class silo{private String locatia;

    private int tip_racheta;private int lanseaza_rachete; // daca este 0 nu se lanseaza,

    // daca este 1 se lanseazaprivate 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;}

    5

  • 7/25/2019 laborator7 -Java

    6/8

    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();

    }}

    Sconsiderm 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.javase va salva n subdirectorul pac1 din:c:\JBulider7\jdk1.3.1\bin\pac1

    6

  • 7/25/2019 laborator7 -Java

    7/8

    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.javase 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.javase 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"}

    }

    7

  • 7/25/2019 laborator7 -Java

    8/8

    Fiierul TestProdus.javase va salva n subdirectorul pac din:c:\JBulider7\jdk1.3.1\bin\pacPentru lansarea n execuie se va utiliza comanda:java pac.TestProdus

    III. MODUL DE LUCRU

    1. Se editeazcodul sursal programului Java folosind un editor de text disponibil(deex., 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 procedaastfel. Se deschide o fereastrMS-Dos: Start ->Run, se tiprete commandn csuade text i se apasbutonul OK. Printr-o schimbare de directoare i subdirectoare se

    trece la locaia: c:\JBulider7\jdk1.3.1\bin. Sau, se lanseazWindowsCommander.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 prompterjavac nume_fiier_surs.javai se apasEnter. De ex., dacfiierul se numete Test.java, se va scriejavac Test.java. n cazuln care programul conine erori acestea vor fi semnalate i afiate n fereastraMS-Dos, dup care va apare iar prompter-ul. Dac programul nu conine erori icompilarea se face cu succes, atunci va apare numai prompter-ul.

    5. Pentru rularea aplicaiei Java, se lanseazinterpretorul Java. Se tiprete la prompterurmtoarea comandjava nume_clas_care_conine_main i se apas Enter. Deex., dacclasa din program care conine metodamain( )se numete Test, se va scrie

    java Test.

    IV. TEM

    1. Se vor parcurge toate exemplele prezentate n platforma de laborator testndu-sepractic, explicnd rezultatele obinute.

    2. Integrai clasele Televizor i TelevizorColor ntr-un program Java funcional, ncare sse defineasccte douinstane pentru fiecare din clasele de mai sus i ssefoloseascmetodele definite pentru a afia proprietile instanelor.

    Explicai la fiecare caz n parte rezultatele obinute.

    8