Tehnici avansate de programare (Java)
February 15, 2017 | Author: Oglinda DeVest | Category: N/A
Short Description
Download Tehnici avansate de programare (Java)...
Description
CURS I 1. Introducere in Java 1.1. Introducere Limbajul Java a fost lansat public pentru prima dată în noiembrie 1995 de firma Sun Microsystems. Era vorba de un limbaj de programare care putea rula într-o pagină WWW, făcându-i un nume printre imagini, text, audio şi omniprezentele semne “ în construcţie”. Java este un limbaj de programare adecvat pentru proiectarea de software dedicat lucrului în Internet, modelat după limbajul de programare C++. Este deci un limbaj de programare orientat obiect, care foloseşte o metodologie ce devine din ce în ce mai folositoare în lumea proiectării de software. În plus, este un limbaj independent de platformă (crossplatform), ceea ce înseamnă că programele pot fi proiectate să ruleze în acelaşi fel pe Microsoft Windows, Apple Macintosh şi majoritatea versiunilor de UNIX. Java se extinde şi dincolo de calculatoarele de birou, putând fi executat pe dispozitive cum ar fi televizoare , ceasuri de mână sau telefoane celulare, JavaStation, staţia de reţea dedicată a firmei Sun, foloseşte ca sistem de operare JavaOS şi este optimizată pentru acest limbaj. Java se aseamănă mai mult cu limbajele de programare populare, cum ar fi C, C++, Visual Basic sau Delphi, decât cu limbajele de descriere a paginilor, cum este HTML, sau cu limbaje pentru scripturi, cum este JavaScript . Ceea ce a făcut atât de popular acest limbj este în special faptul că facilitează utilizarea graficii interactive şi a altor efecte speciale într-o pagină WWW. Ca orice limbaj de programare, Java permite scrierea de programe. Anumite programe Java, denumite applets, sunt executate în cadrul unei pagini Web, cu o capacitate asemănătoare oricărui program tradiţional. În plus, atunci când rulaţi un applet Java, serverul aflat la distanţă îl transmite către browser prin Internet. Primul browser care a acceptat appleturile Java a fost HotJava, în prezent aproape toate browserele acceptă appleturile. De exemplu, Netscape Navigator acceptă appleturile de la versiunea 2.0. Appleturile sunt înglobate într-o pagină Web într-un mod asemănător unei imagini. Spre deosebire de imagini, appleturile pot fi interactive – preiau intrările utilizatorului, răspund la ele şi prezintă un conţinut dinamic, la schimbare . Appleturile sunt încarcate din WWW ca pagini HTML, imagini sau alte elemente ale unui site Web. Pe un browser, appletul va începe să ruleze imediat ce se termină de încărcat . Appleturile sunt scrise în limbajul Java, compilate într-o formă ce poate rula ca program şi plasate pe serverul Web. Majoritatea serverelor pot “livra” fişiere Java fără nici o altă modificare în configuraţia lor. Java este un limbaj de programare tânăr , cu posibilităţi de perfecţionare atât în privinţa limbajului cât şi în privinţa instrumentelor utilizate pentru dezvoltare. Pentru o foarte succintă caracterizare a limbajului, ni se pare potrivit să reproducem descrierea făcută de firma Sun, în “The Java Language: A White Paper”: “Java: un limbaj simplu, orientat obiect, distribuit, interpretabil, robust, sigur, independent de arhitectură, portabil, de înaltă performanţă, cu facilităţi multithreading şi dinamic.”
1
Java este un limbaj simplu Nu este foarte clar, în general, ce înseamnă “simplu”. În cazul de faţă, un cunoscător al limbajului C, eventual al lui C++, poate să înveţe Java foarte uşor. Vis a vis de limbajele C şi C++, Java aduce o serie de simplificări. Iată câteva dintre cele mai importante. Nu există instrucţiunea goto, în schimb instrucţiunile break şi continue sunt extinse, ele putând fi folosite cu etichete spre a părăsi/reitera nu numai cel mai interior ciclu. Java nu admite în textul sursă facilităţi de preprocesor (linii ce încep cu #) şi nu are fişiere header (linii #include). Construcţiile struct şi union sunt eliminate. De asemenea, din facilităţile obiectuale ale lui C++ au fost eliminate două facilităţi relativ controversate: moştenirea multiplă şi supraîncărcarea operatorilor. Poate că cea mai importantă simplificare este aceea că Java nu utilizează pointeri şi implicit nu utilizează aritmetica de pointeri. Programatorii C / C++ ştiu că aceasta este o sursă importantă de erori. Toate obiectele Java sunt alocate dinamic, transparent faţă de programator. De asemenea, programatorul nu trebuie să se ocupe de eliberarea memoriei, aceasta făcându-se automat, prin intermediul unui mecanism de “garbage collection” (mecanismul de colectare şi eliberare a zonelor de memorie nefolosite). Java este orientat pe obiecte Programarea orientată obiect – Object Oriented Programming sau OOP – este o modalitate de a modela un program drept un set de obiecte aflate în interacţiune. Pentru unii reprezintă chiar o modalitate de a organiza programele ; astfel, orice limbaj poate fi folosit pentru a crea programe orientate obiect . Java este un limbaj de programare orientat pe obiect, ceea ce înseamnă că puteţi utiliza Java pentru a dezvolta programele voaste cu date şi metode (funcţii) care operează asupra datelor. În Java , o clasă este o colecţie de date şi metode care descriu un obiect cu care programul operează. Concepeţi un obiect ca pe un “lucru”, cum ar fi o imagine grafică, o casetă de dialog sau un fişier. Appleturile Java pot organiza clasele în ordine ierarhică, ceea ce înseamnă că puteţi construi noi clase pornind de la clasele existente, optimizând sau extinzând caracteristicile clasei existente. Cu excepţia câtorva tipuri simple, cum ar fi numerele, caracterele şi tipurile booleene, orice altceva este obiect. Java deţine un cuprinzător set de clase pe care le puteţi utiliza în programele voastre. De fapt, un applet Java este el însuşi o clasă Java. Java este un limbaj distribuit Java este proiectat să suporte aplicaţii în reţea; suportând diferite nivele de conectivitate în reţea prin intermediul pachetului java.net. De exemplu, clasa URL permite aplicaţiilor Java să deschidă şi să acceseze obiecte indepărtate în Internet. Cu Java, este la fel de uşor să se deschidă un fişier indepărtat ca şi unul local. Java suportă de asemenea atât conectivitate fiabilă (TCP) cu clasa Socket cât şi conectivitate nefiabilă (UDP) prin clasele Datagram*.
2
Java este un limbaj interpretabil Compilatorul Java generează, pentru fiecare entitate compilată, un cod echivalent, într-o formă care se pretează prelucrării prin tehnica interpretării. Ca şi reprezentare internă, codul generat este format dintr-un şir de octeţi. Limbajul interpretativ este unul UNIVERSAL, NU un cod nativ al unei anumite maşini. Pentru a executa un program Java are nevoie de un interpretor care să prelucreze octeţii generaţi de compilator. Forma de generare a codului de octeţi este independentă (neutră) faţă de o anumită maşină. De aceea, codul poate fi executat pe orice maşină care dispune de un interpretor Java adică o maşină virtuală, numită JVM (Java Virtual Machine). Pentru fixarea terminologiei, codul generat de compilator îl vom numi cod JVM.
Java este un limbaj robust Atunci când se spune despre un cod că este robust , se face referire la fiabilitatea sa. Deşi Java nu a eliminat codul nesigur, a reuşit să facă mai accesibilă scrierea unui cod de înaltă calitate. Pentru început, Java elimină multe dintre problemele de memorie care sunt obişnuite în limbaje precum C şi C++. Java nu acceptă accesul direct la pointeri de memorie. Ca urmare, un applet nu poate altera memoria calculatorului. De asemenea Java efectuează verificări în timpul execuţiei pentru a se asigura că toate referirile la tablouri şi şiruri de caractere se află între limitele fiecărui element. În alte limbaje de programare, multe dintre erorile logice(bugs) apar din cauză că programele nu eliberează memoria pe care ar trebui să o elibereze sau eliberează aceeaşi memorie de mai multe ori. Java, pe de altă parte, efectuează o “curăţenie” automată, evitând necesitatea ca programul să elibereze memoria neutilizată. Apoi, Java este mult mai puternic orientat pe tipuri decât C++ şi solicită declaraţii de metodă explicite, ceea ce reduce posibilitatea erorilor de nepotrivire de tip. În sfârşit, Java instituie o metodă de detectare a erorilor cunoscută ca tratarea excepţiilor (exception handling). Atunci când apare o eroare de program, java semnalează o excepţie, ceea ce permite programului să treacă de eroare şi avertizează utilizatorul că există ceva care provoacă eşuarea unei anumite operaţii. Java este un limbaj sigur Se poate întâlni un virus în Internet, dacă se descarcă şi rulează un program. Din păcate, în cazul appleturilor Java, serverul aflat la distanţă descarcă appletul către un browser al sistemului vostru, care rulează apoi appletul. La prima vedere, această descărcare a appleturilor Java este modalitatea ideală de creare a viruşilor. Din fericire, proiectanţii limbajului Java au avut în vedere lucrul în reţea. De aceea, Java are încorporate mai multe mijloace de securiate, care reduc capacitatea creării unui virus prin Java. În primul rând, appleturile Java nu pot citi sau scrie fişiere locale de pe discul calculatoarelor voastre. În acest fel, un applet nu poate să stocheze virusul pe discul calculatorului sau să-l ataşeze unui fişier. Pur si simplu, appletul nu poate efectua operaţii de intrare sau de ieşire pe disc. În al doilea rând, appleturile Java sunt “oarbe” în raport
3
cu configurarea memoriei calculatorului. Mai precis, appleturile Java nu au pointeri la memorie, astfel că programatorii nu pot utiliza această tradiţională “uşă de serviciu” către calculatorul vostru. În al treilea rând, Java nu poate altera memoria din afara propriului său spaţiu de memorie. Înglobând aceste precauţii în însuşi limbajul Java, proiectanţii săi au reuşit să impiedice în mare măsură utilizarea sa la crearea şi transmiterea viruşilor. Java este independent de platformă Interpretor Java (Pentium) Bytecode Java (independent de platforma)
Cod Java _______ ____ ______ _______ _______
_______ ____ ______ _______ _______
_______ ____ ______ _______ _______
Interpretor Java (PowerPC) _______ ____ ______ _______ _______
Compilator Java
Interpretor Java (SPARC) _______ ____ ______ _______ _______
Independenţa de platformă – posibilitatea ca un acelaşi program să ruleze pe diferite platforme sau SO – este unul dintre cele mai semnificative avantaje pe care Java le are asupra altor limbaje de programare . Atunci când scrieţi şi compilaţi un appplet Java, veţi obţine în final un fişier independent de platformă numit cod de octeţi (bytecode) spre deosebire de majoriatea limbajelor la care prin compilare rezultă un fişier în cod maşină – instrucţiuni specifice procesorului pe care îl foloseşte calculatorul vostru. Programele Java îşi dobândesc această independenţă folosind o maşină virtuală – un fel de calculator într-un alt calculator. Maşina virtuală preia programele Java compilate şi le converteşte instrucţiunile în comenzi inteligibile pentru sistemul de operare. Acelaşi program compilat care există într-un format bytecode, poate rula pe orice platformă şi sistem de operare care posedă o maşină virtuală Java. Maşina virtuală mai este cunoscută şi ca interpretor Java sau executor (runtime) Java. Java este independent de platformă la nivel sursă. Sursa, denumită şi cod sursă, reprezintă un set de instrucţiuni de programare pe care un programator le introduce cu ajutorul unui editor de texte, atunci când creează un program. Codul sursă este compilat în bytecode, aşa încât poate fi rulat pe o maşină virtuală Java. Bytecode-ul este asemănător codului maşină produs de alte limbaje, însă nu este specific nici unui procesor. Aceasta mai introduce un nivel între sursă şi codul maşină, aşa cum se poate vedea în figura 1. Această maşină virtuală se poate găsi în mai multe locuri. Pentru appleturi, maşina virtuală este fie înglobată într-un browser care suportă Java, fie instalată separat, pentru a fi folosită de browser. Aplicaţiile Java, pe de altă parte, pot rula doar într-un sistem unde a fost instalată maşina virtuală Java corespunzătoare.
4
Apare aici intrebarea : ce impact are asupra performanţei faptul că între sursa programului şi codul maşină compilat se interpune bytecode-ul . Răspunsul este că programele Java se execută mai lent decât limbajele compilate dependente de platformă, cum ar fi C, iar această diferenţă de viteză este principalul dezavantaj al Java. Pentru majoritatea programelor simple Java, viteza s-ar putea să nu reprezinte o problemă. Dacă doriţi să scrieţi programe ce necesită o viteză mai mare de execuţie decât poate oferi maşina virtulă, există câteva soluţii disponibile : - folosiţi în programul Java apeluri către codul maşină specific sistemului, ceea ce va face ca programul rezultat să fie dependent de platformă - folosiţi compilatoare rapide (just-in-time), care convertesc bytecode-ul Java în cod specific maşinii Java este un limbaj portabil Neutralitatea faţă de arhitectură este numai unul dintre aspectele portabilităţii. Un altul este acela ca limbajul să nu permită “aspecte dependente de implementare” (vezi spre exemplu reprezentarea diferită a int pe la diverse implementări C). În acest scop, Java specifică lungimea în octeţi a fiecărui tip de date ca şi o mărime aritmetică obişnuită. Mediul Java este portabil pe noile sisteme de operare, deoarece compilatorul Java este scris tot în Java, în timp ce executabilul (run time system) este scris în ANSI C, cu respectarea specificaţiilor POSIX. Java este un limbaj de înaltă performanţă Robusteţea limbajului este asigurată de o serie de mecanisme de înaltă performanţă, cum ar fi verificarea timpurie a programelor pentru posibile probleme, verificarea dinamică târzie (runtime), şi forţarea programatorului să elimine situaţiile care sunt presupuse că ar putea genera probleme la rulare. Unul dintre avantajele limbajelor puternic tipizate (cum ar fi C++) este că asigură un puternic suport pentru verificarea programelor în timpul compilării în ideea de a elimina un număr cât mai mare de erori, din păcate limbajul C++ moşteneşte o serie de probleme la verificarea în timpul compilării tocmai din C, şi acesta doar pentru a păstra compatibilitatea în jos. Deoarece Java nu are ce compatibilitate în jos să menţină, nu este nevoit să suporte consecinţele unor implementări sau specificaţii vechi proaste sau incomplet făcute. Un exemplu, declaraţiile, pe când în C++, se permit declaraţii implicite ale variabilelor, funcţiilor sau procedurilor (tocmai moştenite din C), Java este foarte sever în declararea exactă a lor. Chiar şi linkeditorul mai repetă aceleaşi verificări pentru a fi sigur că nu apar probleme de incompatibilităţi între tipuri de date folosite. Java este un limbaj cu facilităţi multithreading Într-o aplicaţie de reţea bazată pe GUI (de exemplu utilizarea unui browser Web) sunt uşor de imaginat medii multitasking: procesorul se ocupă “simultan” de controlul animaţiei, calcule, gestiunea memoriei etc. Java oferă acest gen de servicii. Astfel,
5
pachetul java.lang oferă clasa Thread, care suportă creare, oprire, execuţie, control şi sincronizare thread. Sincronizarea se bazează pe conceptul de monitor. Este cunoscut faptul că operarea cu multithreading dă multă bătaie de cap programatorilor C şi C++. Programatorii trebuie să-şi implementeze mecanisme proprii de blocare a unor secţiuni critice şi de partajare a unor resurse critice. Primitivele furnizate de Java reduc esenţial acest efort. Java este dinamic Bibliotecile de clase în Java pot fi reutilizate cu foarte mare uşurinţă. Cunoscuta problemă a fragilităţii superclasei este rezolvată mai bine decât în C++. Acolo, dacă o superclasă este modificată, trebuie recompilate toate subclasele acesteia pentru că obiectele au o altă structură în memorie. În Java această problemă este rezolvată prin legarea târzie a variabilelor, doar la execuţie. Regăsirea variabilelor se face prin nume şi nu printr-un deplasament fix. Dacă superclasa nu a şters o parte dintre vechile variabile şi metode, ea va putea fi refolosită fără să fie necesară recompilarea subclaselor acesteia. Se elimină astfel necesitatea actualizării aplicaţiilor, generată de apariţia unei noi versiuni de bibliotecă aşa cum se întâmplă, de exemplu, cu MFC-ul Microsoft (şi toate celelalte ierarhii C++).
1.2. Instalarea pachetului Java Development Kit (JDK) sub Windows Kitul de dezvoltare Java (JDK) este o colecţie de software de la firma Sun care cuprinde tot ce este nevoie pentru crearea aplicaţiilor standalone şi appleturilor Java . Astfel , JDK conţine compilatorul Java , depanatorul şi un vizualizator de appleturi cu ajutorul căruia appleturile pot rula în afara unui browser , precum şi documentaţie şi exemple de appleturi . Pachetul JDK poate fi transferat , pentru diferite platforme , de pe situl Web al firmei Sun de la adresa http://java.sun.com . Înainte de a instala JDK pe sistemul dumneavoastră , trebuie să vă asiguraţi că nu sunt instalate alte instrumente de dezvoltare Java . Dacă există mai multe instrumente de dezvoltare Java , acest lucru va duce , probabil ,, la probleme de configurare , atunci când veţi încerca să folosiţi JDK . Pentru a instala JDK sub Windows , executaţi dublu clic pe fişierul care conţine arhiva de instalare sau folosiţi comanda Start|Run din bara de programe a Windows , pentru a găsi şi a executa fişierul . După ce veţi vedea o casetă de dialog care vă întreabă dacă doriţi să instalaţi JDK , va fi afişat asistentul JDK Setup Wizard . Puteţi folosi această fereastră pentru a configura modul în care JDK se instalează pe sistemul vostru . Parametrii predefiniţi ai acestui asistent ar trebui să fie buni pentru majoritatea utilizatorilor . JDK este instalat într-un nou folder , care primeşte un nume bazat pe versiunea pe care aţi transferat-o (cum ar fi \jdk1.6.0_07) ; dacă doriţi să selectaţi un alt director din sistem , folosiţi butonul Browse . 1.3. Testarea instalării
6
Utilizatorii Windows pot testa instalarea JDK folosind comanda MS-DOS Prompt . Aceasta va avea ca rezultat afişarea unei ferestre unde se pot tasta comenzi MS-DOS . Se introduce urmatoarea comandă la prompt-ul de comandă pentru a testa dacă sistemul vostru găseşte instalată versiunea corectă de JDK : java -version Dacă folosiţi JDK 1.6.0_07 ar trebui să obtineţi ca răspuns următorul mesaj : java version “1.6.0_07” Dacă obtineţi ca răspuns un alt număr de versiune sau eroarea “Bad command or file name” , înseamnă că sistemul vostru nu poate găsi versiunea corectă a fişierului java.exe . fişierul care rulează programele Java . Acest lucru trebuie corectat înainte de a începe scrierea programelor Java . 1.4. Setarea variabilelor PATH şi CLASSPATH Utilizatorii Windows trebuie să-şi seteze variabilele Java . Variabila PATH trebuie să conţină calea spre directorul BIN al pachetului JDK . De obicei această cale este C:\Program Files\Java\jdk1.6.0_07\bin pentru versiunea 1.6.0_07. Variabila CLASSPATH trebuie să conţină calea spre biblioteci sau spre clasele folosite în programe . Pachetul JDK oferă o bibliotecă tools.jar care se găseşte în directorul LIB . În cazul în care variabila CLASSPATH nu există ea trebuie creată . Setarea acestor variabile diferă în funcţie de versiunea de Windows folosită . Pentru Windows Millenium se poate obţine acces la aceste variabile prin : Start → Programs → Accessories → SystemTools → System Information . Se deschide astfel fereastra de Help and Support şi din meniul Tools se alege System Configuration Utility , iar la Environment se editează variabilele PATH şi CLASSPATH şi li se modifică valorile . Pentru Windows XP, Vista la proprietăţile calculatorului există Advanced → Environment Variabiles . 1.5. Primele aplicaţii Java Aşa cum se obişnuieşte la prima prezentare a unui limbaj, vom prezenta cel mai simplu program Java posibil: afişarea unui şir de caractere. Specificul Java oferă însă două tipuri de programe: aplicaţii de sine stătătoare, numite în terminologia Java standalone; programe activabile prin intermediul navigatoarelor Web, numite appleturi. 1.5.1.Programul standalone Salut 1.5.1.1. Sursa programului Fişierul sursă poartă numele Salut.java şi este prezentat în programul1. public class Salut{ public static void main(String a[]) { System.out.println("Salut"); }//Salut.main
7
}//Salut Programul 1 Textul sursă Salut.java Mai întâi câteva precizări, care reprezintă de fapt şi primele reguli Java. Unele dintre amănunte vor fi explicate pe larg mai târziu. Un program Java constă din definirea şi instanţierea unei clase. Numele textului sursă este format din numele clasei urmat de sufixul .java. Unele programe pot conţine în acelaşi text sursă mai multe clase, dar atunci numai una dintre ele va fi vizibilă în exterior, celelalte fiind numai de uz intern. Un program standalone trebuie să conţină metoda statică main. Ea are ca parametru un tablou având ca şi elemente şiruri de caractere. Fiecare element al tabloului conţine un argument transmis în linia de comandă ce lansează programul în execuţie. Tipărirea este executată de către metoda println a obiectului out din clasa System. 1.5.1.2.Compilarea şi rularea programului Compilatorul Java poartă numele de javac. Lansarea compilării programului se face cu comanda: javac Salut.java Compilatorul JDK nu afişează nici un mesaj dacă programul se compilează cu succes . Dacă programul s-a compilat fără erori , în directorul care conţine fişierul Salut.java va apărea încă un fişier (Rezultatul compilării) cu numele Salut.class, care conţine codul JVM echivalent. Interpretorul standard Java poartă numele java. El preia codul JVM din Salut.class şi-l execută (interpretativ). Execuţia interpretativă se lansează prin comanda: java Salut Ca efect, pe ecran se va afişa, pe linie nouă: Salut 1.5.2. Appletul SalutAp 1.5.2.1. Sursa appletului Exemplul din secţiunea precedentă, scris ca un applet, este prezentat în programul 2. import java.applet.*; import java.awt.*; public class SalutAp extends Applet { public void paint(Graphics g) { g.drawString("Salut",10,50); }//SalutAp.paint }//SalutAp Programul 2 Textul sursă al appletului SalutAp.java
8
Mai întâi se declară folosirea de metode ale pachetelor applet şi awt. Apoi se indică faptul că clasa SalutAp extinde (este o subclasă) clasa Applet. Scrierea textului se face prin intermediul metodei paint. Aceasta realizează rescrierea metodei paint din java.awt.Component, având rolul de a "picta" un obiect grafic g. Concret, este vorba de scrierea unui string începând de la pozitia (x= 10 pixeli spre dreapta, y = 50 pixeli în jos). Compilarea sursei se face folosind aceeaşi comandă de compilare: javac SalutAp.java care generează codul de octeţi echivalent sursei în fişierul SalutAp.class. Pentru lansarea în execuţie a acestui applet este nevoie de un navigator Web, cum ar fi de exemplu Netscape, Mozilla, Konqueror, InternetExplorer. Pachetul Java oferă pentru testarea appleturilor, interpretorul appletviewer care este, de fapt, un navigator Web specializat. În textul sursă HTML transmis navigatorului Web trebuie inserată sursa din programul 3. Programul 3. Textul sursă SalutAp.html Numele fişierului .java trebuie să coincidă cu numele clasei, însă numele fişierului HTML poate fi diferit (eu l-am luat acelaşi din comoditate). Prin acest text, care este un tag HTML, se cere navigatorului să-şi încarce codul JVM din fişierul SalutAp.class şi să-l execute (interpretativ). Dacă se doreşte utilizarea interpretorului standard Java appletviewer, se va lansa comanda: appletviewer SalutAp.html 1.5.3.Un program ce poate rula alternativ standalone sau applet Pare cel puţin interesant să vedem un program care să poată rula, după preferinţă, ori ca aplicaţie standalone ori ca applet. Unul dintre cele mai simple programe de acest tip este programul urmator : import java.awt.*; import java.applet.*; import java.awt.event.*; public class PrimCompus extends Applet { public static void main(String a[]) { WindowListener l=new WindowAdapter() { public void windowClosing(WindowEvent e){System.exit(0);} }; PrimCompus oPrimCompus = new PrimCompus(); 9
Frame oFrame = new Frame("Fereastra standalone"); oFrame.addWindowListener(l); oFrame.setSize(250,350); oFrame.add("Center", oPrimCompus); oFrame.show(); oPrimCompus.init(); }//PrimCompus.main public void init() { }//PrimCompus.init public void paint(Graphics g) { g.drawString("Un sir in fereastra",50,60); }//PrimCompus.paint }//PrimCompus Sursa PrimCompus.java Clasa PrimCompus extinde clasa Applet spre a se putea comporta ca şi un applet. De asemenea, în cadrul ei se defineşte metoda main, care este invocata la lansarea ca şi aplicaţie standalone. Să urmărim mai întâi comportarea ca şi applet. In momentul lansării dintr-un navigator, acesta (navigatorul) caută metoda init pe care o lansează în execuţie. In exemplul nostru metoda init este vidă. In continuare (după cum am arătat şi la exemplul SalutAp), dacă în cadrul clasei este definită metoda paint, atunci se lansează în execuţie aceasta. In cazul nostru va afişa un string în fereastră. Pentru lansarea din navigator, este suficient ca documentul html să aibă conţinutul : Fereastra applet Sursa PrimCompus.html Spre a se deosebi de aplicaţia standalone, am precizat şi titlul ferestrei. Execuţia programului este:
10
Pentru ca programul să poată fi rulat, cu (aproape) acelaşi efect, în cadrul metodei main trebuie executate câteva acţiuni, de altfel specifice interfeţelor grafice de tip standalone. Mai întâi am definit şi construit obiectul oPrimCompus de tipul clasei. Apoi am definit un obiect oFrame de tip Frame (tipul clasic de fereastră din pachetul awt). Am fixat titlul acestei ferestre şi dimensiunile ei (în pixeli). Am adăugat în poziţia centrală obiectului oFrame obiectul oPrimCompus şi am cerut ferestrei să devină vizibilă. In sfârşit, am lansat metoda init a obiectului oPrimCompus, după care comportarea va fi ca şi la applet: va căuta metoda paint şi va afişa stringul în fereastră. 1.5.3. Scrierea programelor folosind mediul NetBeans 6.1 Mediu NetBeans 6.1. poate fi descarcat gratuit de pe situl Web al firmei de la adresa si apoi instalat in mod normal ca si majoritatea aplicatiilor pe calculatorul personal. Vom realiza in continuare rescrierea programelor folosind mediul NetBeans6.1. 1.5.3.1.Programul standalone Salut 1.5.3.1.1. Sursa programului Se lanseaza aplicatia NetBeans 6.1. Din meniul pop-up File se alege New Project. La primul pas la categorie se alege Java, iar la proiect Java Application. In pasul al doilea se da un nume la proiect (ex: lab1a) si o locatie (ex: E:\My Documents\goldis\anul 20082009\teh avns\sapt1), iar la numele clasei se pune „lab1a.Salut”. Si astfel se finalizeaza crearea proiectului.
11
Dupa creare se deschide automat fisierul Salut.java care contine in prima faza urmatoarele: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package lab1a; /** * * @author user */ public class Salut { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here } } Se modifica fisierul astfel incat sa realizam afisarea mesajului de salut: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package lab1a; /** * * @author user */ public class Salut { /** * @param args the command line arguments */ public static void main(String[] args) { System.out.println("Salut"); } }
12
1.5.3.1.2.Compilarea şi rularea programului Compilarea se poate realiza din meniul Run->Run File->Debug ”Salut.java”, iar rularea Run->Run File-> Run ”Salut.java”. Ca efect, in fereastra output se va afişa: init: deps-jar: compile-single: run-single: Salut BUILD SUCCESSFUL (total time: 0 seconds) 1.5.3.2. Appletul SalutAp 1.5.3.2.1. Sursa appletului Se lanseaza aplicatia NetBeans 6.1. Din meniul pop-up File se alege New Project. La primul pas la categorie se alege Java, iar la proiect Java Class Library. In pasul al doilea se da un nume la proiect (ex: lab1b) si o locatie (ex: E:\My Documents\goldis\anul 20082009\teh avns\sapt1). Si astfel se finalizeaza crearea proiectului. Dupa creare in partea stanga apare proiectul lab1b. Se da click dreapta pe lab1b si se alege New->Other. In primul pas la categorie se alege Java, iar la tipul fisierului se alege Applet. In pasul al doilea se da un nume la clasa (ex: SalutAp) si se termina. Dupa finalizare se deschide automat fisierul SalutAp.java cu urmatorul continut: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.applet.Applet; /** * * @author user */ public class SalutAp extends Applet { /** * Initialization method that will be called after the applet is loaded * into the browser. */ public void init() { // TODO start asynchronous download of heavy resources }
13
// TODO overwrite start(), stop() and destroy() methods } Se modifica continutul astfel: /* * To change this template, choose Tools | Templates * and open the template in the editor. */ import java.applet.Applet; import java.awt.Graphics; /** * * @author user */ public class SalutAp extends Applet { /** * Initialization method that will be called after the applet is loaded * into the browser. */ public void init() { // TODO start asynchronous download of heavy resources } public void paint(Graphics g){ g.drawString("Salut", 10, 50); } } 1.5.3.2.2.Compilarea şi rularea programului Compilarea se poate realiza din meniul Run->Run File->Debug ”SalutAp.java”, iar rularea Run->Run File-> Run ”SalutAp.java”. Ca efect, in fereastra output se va afişa: init: deps-jar: Compiling 1 source file to E:\My Documents\goldis\anul 2008-2009\teh avns\sapt 1\lab1b\build\classes compile-single: si totodata se deschide se fereastra appletviewer astfel :
14
15
CURS 2 2.Prezentarea Java 2.1. Structura lexicala a limbajului Java 2.1.1 Setul de caractere Limbajului Java lucreaza in mod nativ folosind setul de caractere Unicode. Acesta este un standard international care inlocuieste vechiul set de caractere ASCII si care foloseste pentru reprezentarea caracterelor 2 octeti, ceea ce înseamna ca se pot reprezenta 65536 de semne, spre deosebire de ASCII, unde era posibila reprezentarea a doar 256 de caractere. Primele 256 caractere Unicode corespund celor ASCII, referirea la celelalte facandu-se prin \uxxxx, unde xxxx reprezinta codul caracterului. O alta caracteristica a setului de caractere Unicode este faptul ca întreg intervalul de reprezentare a simbolurilor este divizat în subintervale numite blocuri, cateva exemple de blocuri fiind: Basic Latin, Greek, Arabic, Gothic, Currency, Mathematical, Arrows, Musical, etc. Mai jos sunt oferite cateva exemple de caractere Unicode. • \u0030 - \u0039 : cifre ISO-Latin 0 - 9 • \u0660 - \u0669 : cifre arabic-indic 0 - 9 • \u03B1 - \u03C9 : simboluri grecesti _ − ! • \u2200 - \u22FF : simboluri matematice • \u4e00 - \u9fff : litere din alfabetul Han (Chinez, Japonez, Coreean) Mai multe informatii legate de reprezentarea Unicode pot fi obtinute la adresa ”http://www.unicode.org”. 2.1.2 Cuvinte cheie Cuvintele rezervate in Java sunt, cu cateva exceptii, cele din C++ si au fost enumerate în tabelul de mai jos. Acestea nu pot fi folosite ca nume de clase, interfete, variabile sau metode. true, false, null nu sunt cuvinte cheie, dar nu pot fi nici ele folosite ca nume în aplicatii. Cuvintele marcate prin * sunt rezervate, dar nu sunt folosite. Java utilizează următoarele cuvinte cheie: abstract catch default final if interface private static this void
boolean char do finally implements long protected strictfp throw volatile
Break Class Double Float Import Native Public Super Throws While
byte const* else for instanceof new return switch transient
case continue extends goto* int package short synchronized try
Începand cu versiunea 1.5, mai exista si cuvantul cheie enum.
1
2.1.3 Identificatori Sunt secvente nelimitate de litere şi cifre Unicode, începand cu o litera. Identificatorii nu au voie sa fie identici cu cuvintele rezervate. 2.1.4 Literali Literalii pot fi de urmatoarele tipuri: • Întregi Sunt acceptate 3 baze de numeratie : baza 10, baza 16 (încep cu caracterele 0x) şi baza 8 (încep cu cifra 0) şi pot fi de doua tipuri: – normali - se reprezinta pe 4 octeti (32 biti) – lungi - se reprezinta pe 8 octeti (64 biti) şi se termina cu caracterul L (sau l). • Flotanti Pentru ca un literal sa fie considerat flotant el trebuie sa aiba cel putin o zecimala dupa virgula, sa fie în notatie exponentiala sau sa aiba sufixul F sau f pentru valorile normale reprezentate pe 32 biti, respectiv D sau d pentru valorile duble - reprezentate pe 64 biti. Exemple: 1.0, 2e2, 3f, 4D. • Logici Sunt reprezentati de true - valoarea logica de adevar, respectiv false - valoarea logica de fals. Observatie: Spre deosebire de C++, literalii întregi 1 si 0 nu mai au semnificatia de adevarat, respectiv fals. • Caracter Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode. Reprezentarea se face fie folosind o litera, fie o secventa escape scrisa între apostrofuri. Secventele escape permit specificarea caracterelor care nu au reprezentare grafica si reprezentarea unor caractere speciale precum backslash, apostrof, etc. Secventele escape predefinite în Java sunt: – ’\b’ : Backspace (BS) – ’\t’ : Tab orizontal (HT) – ’\n’ : Linie noua (LF) – ’\f’ : Pagina noua (FF) – ’\r’ : Început de rand (CR) – ’\"’ : Ghilimele – ’\’’ : Apostrof – ’\\’ : Backslash • Siruri de caractere Un literal sir de caractere este format din zero sau mai multe caractere între ghilimele. Caracterele care formeaza sirul pot fi caractere grafice sau secvente escape. Daca sirul este prea lung el poate fi scris ca o concatenare de subsiruri de dimensiune mai mica, concatenarea sirurilor realizandu-se cu operatorul +, ca în exemplul: "Ana " + " are " + " mere ". Sirul vid este "". Dupa cum vom vedea, orice sir este de fapt o instanta a clasei String, definita în pachetul java.lang.
2
2.1.5 Separatori Un separator este un caracter care indica sfarsitul unei unitati lexicale si începutul alteia. În Java separatorii sunt urmatorii: ( ) [ ] ; , . . Instructiunile unui program se separa cu punct si virgula. 2.1.6 Operatori Operatorii Java sunt, cu mici deosebiri, cei din C++: • atribuirea: = • operatori matematici: +, -, *, /, %, ++, -- . Este permisa notatia prescurtata de forma lval op= rval: x += 2 n-= 3 Exista operatori pentru autoincrementare si autodecrementare (post şi pre): x++, ++x, n--, --n Evaluarea expresiilor logice se face prin metoda scurtcircuitului: evaluarea se opreste în momentul în care valoarea de adevar a expresiei este sigur determinata. • operatori logici: &&(and), ||(or), !(not) • operatori relationali: > (shift la dreapta fara semn) • operatorul if-else: expresie-logica ? val-true : val-false • operatorul , (virgula) folosit pentru evaluarea secventiala a operatiilor: int x=0, y=1, z=2; • operatorul + pentru concatenarea sirurilor: String s1="Ana"; String s2="mere"; int x=10; System.out.println(s1 + " are " + x + " " + s2); • operatori pentru conversii (cast) : (tip-de-data) int a = (int)’a’; char c = (char)96; int i = 200; long l = (long)i; //widening conversion long l2 = (long)200; int i2 = (int)l2; //narrowing conversion • operatorul instanceof : Acesta întoarce true dacă obiectul din stânga lui este o instanţiere a clasei specificate în dreapta şi false în caz contrar. Totusi faţă de C, operatorii Java sunt puţin diferiţi. Astfel, au fost eliminaţi operatorii * (indirectare) & (adresa), sizeof, ->. Perechea de paranteze [ şi ] precum şi . (punct) nu sunt operatori. Operatorul +, după cum am mai arătat, se mai foloseşte si la concatenare de stringuri. S-a introdus operatorul instanceOf.. Operatorul >> efectuează deplasarea spre dreapta a configuraţiei unui întreg cu propagarea bitului de semn în poziţiile eliberate.
3
S-a introdus operatorul >>>, care deplasează spre dreapta cu completarea biţi zero în poziţiile eliberate. Reamintim că în Java toţi întregii sunt reprezentaţi cu semn. Operatorii & şi | au ca operanzi întregi şi dau ca rezultat întreg. În acelaşi timp, operatorii && şi || au ca operanzi booleeni şi dau ca rezultat un boolean. 2.1.7 Comentarii În Java exista trei feluri de comentarii: • Comentarii pe mai multe linii, închise între /* si */. • Comentarii pe mai multe linii care tin de documentatie, închise între /** si */. Textul dintre cele doua secvente este automat mutat în documentatia aplicatiei de catre generatorul automat de documentatie javadoc. • Comentarii pe o singura linie, care incep cu //. Observatii: 1. Nu putem scrie comentarii în interiorul altor comentarii. 2. Nu putem introduce comentarii în interiorul literalilor caracter sau sir de caractere. 3. Secventele /* si */ pot sa apara pe o linie dupa secventa // dar îsi pierd semnificatia. La fel se întampla cu secventa // în comentarii care incep cu /* sau */. 2.2. Tipuri de date în Java 2.2.1. Tipuri de date primitive Unicode: codificarea şi evitarea caracterelor. Java este unul dintre puţinele limbaje de programare care “încalcă” un principiu care părea statuat de facto: caracterele Java şi stringurile sunt codificate în codul Unicode pe 16 biţi. Asta face ca setul de caractere să fie potrivit şi pentru alte caractere, neexistente în alfabetul englez. Setul Unicode este efectiv un supraset al lui ASCII, deci textele ASCII au aceeaşi reprezentare, dar fiecare octet ASCII este completat cu câte un octet semnificativ cu valoarea 0 (neinterpretat de maşinile ce văd doar ASCII). Studenţii care doresc să cunoască întregul set de caractere Unicode, pot consulta http://unicode.org. Specificarea caracterelor ASCII tipăribile se face ca şi în C. Mecanismul de evitare a caracterelor din C se păstrează şi se mai introduce un mod suplimentar de specificare, astfel: \uxxxx \xxx \n \r \t \f \b \” \’ \\
unde xxxx sunt patru cifre hexa; unde xxx sunt trei cifre octale. sunt cele cunoscute din C.
Tipul char se reprezintă pe doi octeţi în Unicode şi respectă convenţiile de conversie la întregi din C. Stringurile se scriu ca şi în C (între ghilimele). Spre deosebire de C, în Java nu există continuare (linie terminată cu \ în C sau C++) pentru stringurile lungi. În schimb, operatorul + Java este extins şi pentru concatenarea de stringuri. Deci şirurile lungi se scriu folosindu-se operatorul + de concatenare. Există tipul de date String.
4
Tipul Boolean este nou introdus în Java (nu este în C). În schimb dispare convenţia C cu 0 având valoarea false şi diferit de 0 având valoarea true. Un tip Boolean nu este un întreg şi nici nu poate fi convertit la acesta. Tipurile întregi. La tipurile întregi, împărţirea cu 0 activează excepţia numită ArithmeticException. Tipurile flotante se pot specifica plasând la sfârşitul scrierii numărului litera f sau F pentru simplă precizie, respectiv cu d sau D pentru dublă precizie. Pentru aceste tipuri de date există constantele predefinite: POSITIVE_INFINITY, NEGATIVE_INFINITY, NaN (Not a Number). La tipurile flotante depăşirile nu se semnalează, ci rezultatul poate fi unul dintre constantele de mai sus. Există, de asemenea, zero negativ şi zero pozitiv. Tabelul următor descrie tipurile de date primitive. Tip Boolean Char Byte Short Int Long Float Double
Conţinut true sau false caracter Unicode întreg cu semn întreg cu semn întreg cu semn întreg cu semn standard IEEE simplă precizie standard IEEE dublă precizie
Valoare implicită false \u0000 0 0 0 0 0.0 0.0
Lungime 1 bit 16 biţi 8 biţi 16 biţi 32 biţi 64 biţi 32 biţi 64 biţi
2.2.2. Tipul referinţă obiect Tipurile de date neprimitive sunt obiecte şi tablouri. Ele sunt numite în Java “tipuri referinţă”, deoarece sunt manevrate prin adresă: compilatorul pune adresa unui obiect sau tablou într-o variabilă şi aşa este transmis către metode. Prin contrast, tipurile primitive sunt manevrate “prin valoare”. Într-o manieră simplificată, un obiect este similar unei variabile de tip structură din C. Din punct de vedere semantic, obiectele Java coincid cu obiectele C++. În secţiunea următoare vom detalia partea sintactică privitoare la obiecte şi clase. Acum tratăm doar principalele operaţii posibile asupra obiectelor Java. În limbajele C şi C++, obiectele “referinţă” sunt tratate prin operatorii * & ->. Java nu conţine aceşti operatori!. Deoarece obiectele sunt transmise prin referinţă, este posibil ca două variabile diferite să se refere la acelaşi obiect. De exemplu: Button p, q; p = new Button(); q = p; p.setLabel(“Ok”); String s = q.getLabel(); Aici, s va avea valoarea “Ok”.
int i = 3; int j = i; i = 2; Aici, i este 2 şi j este 3 (deci nu e valabil acelaşi lucru la datele primitive!).
Copierea obiectelor şi “compararea” lor. Din cauza referinţei, atribuirea între obiecte nu face copiere. De exemplu,
5
Button a = new Button(“Ok”); Button b = new Button(“Cancel”); a = b; Aici, a şi b punctează ambele la butonul Cancel, iar butonul Ok este pierdut. Pentru a se face o atribuire veritabilă, trebuie executată o operaţie de copiere a componentelor de la sursă la destinaţie. Majoritatea tipurilor de date standard au definită o metodă clone(), care execută efectiv copierea, componentă cu componentă. O astfel de atribuire funcţionează ca în exemplul următor, în care variabila c se va referi la un duplicat al obiectului b: Vector b = new Vector; c = b.clone(); Pentru copierea de tablouri, se foloseşte metoda: System.arraycopy(sursa,inceput,destinatie,inceput,lungime). Obiectele nu pot fi comparate nici măcar cu egalitate. Utilizatorul îşi poate defini proceduri proprii de comparare. Unele clase au, în acest scop, o metodă numită equals(). Din raţiuni de portabilitate, de independenţă de platformă şi de siguranţă, nu există pointeri! Deci, nu se pune problema referirii, dereferirii, conversiei referinţelor la tablouri în întreg etc. Constanta null indică inexistenţa unui obiect sau a unui tablou. Garbage collection. Obiectele Java îşi ocupă memoria necesară în mod dinamic, în faza de execuţie. Alocarea de memorie este făcută automat, deci lipsesc apelurile similare lui malloc. De asemenea, nu se face eliberarea explicită a spaţiului ocupat, deci nu există apeluri similare lui free din C şi C++. Distrugerea obiectelor se face automat, printr-un mecanism clasic de garbage collection . Eliberarea spaţiului ocupat de un obiect se face, fără ştirea utilizatorului, după ce obiectul nu mai este vizibil şi nici în viaţă. 2.2.3. Tipul referinţă tablou Principiile enunţate la tipul referinţă obiect sunt valabile şi la tipul referinţă tablou. Astfel: tablourile sunt manevrate prin referinţă; tablourile sunt create dinamic, prin new; după ce nu se mai folosesc, sunt eliberate prin mecanismul garbage collection. Crearea unui tablou, se poate face în două moduri: 1) specificarea unei dimensiuni maxime, ca mai jos: byte octet_buffer[ ] = new byte[1024]; Button butoane[ ] = new Button[10];
6
2)
prin iniţializator static:
int tabel[ ] = {1,2,4,8,16,32,64,128}; Un tablou multidimensional se implementează ca şi un tablou de tablouri. Este posibil, eventual, ca ultimii indici să nu aibă limitele precizate: byte T2[ ][ ] = new byte[256][16]; int T3[ ][ ][ ] = new int[10][ ] [ ]; String multi[ ][ ][ ] = new String[5][3][ ]; Tablourile multidimensionale se pot iniţializa şi static, la fel ca şi în C: String S[][] = { { “…” , ”…” , ”…” }, { “…” , “…” , “…” } } De regulă, tablourile multidimensionale nu sunt neapărat rectangulare. Iată, de exemplu, construcţia câtorva tablouri triunghiulare şi nu numai: int T[][] = { {1, 2}, {3, 4, 5}, {6, 7, 8, 9}}; short triunghi[ ][ ] = new short[10][ ]; for (int i=0; i < triunghi.length; i++) { triunghi[i] = new short[i+1]; for (int j=0; j= 18) System.out.println(“Esti major”); else System.out.println(“Esti minor”);
Expresia if execută instrucţiuni diferite în funcţie de rezultatul unei singure testări booleene. Diferenţa dintre instrucţiunile condiţionale if din Java şi cele din C şi C++ este aceea că în Java testul trebuie să returneze o variabilă booleană (true sau false). În C/C++, testul returneaza un întreg . Folosind if, în codul care se execută după test puteţi include o singură instrucţiune. Totuşi, în Java un bloc poate fi folosit oriunde poate fi folosită o instrucţiune simplă. Dacă doriţi să faceţi mai multe lucruri ca rezultat al unei instrucţiuni if, puteţi încadra instrucţiunile corespunzătoare între acolade. Priviţi acest extras de cod : if (atitudine==”furios”) { System.out.println(“Monstrul este furios”); System.out.println(“V-ati scris testamentul?”); } else { System.out.println(“Monstrul este in toane bune”); if (flamand) System.out.println(“Totusi este inca flamand”); else System.out.println(“Pleaca.”); }
Acest exemplu foloseşte testul (atitudine==”furios”) pentru a determina dacă să se afişeze că monstrul este furios sau liniştit . Dacă este liniştit , testul (flamand) este folosit pentru a determina dacă monstrul nu este cumva flămând – presupunând că un monstru flămând trebuie evitat chiar dacă este liniştit. Condiţionalul if (flamand)este o altă modalitate de a spune if(flamand==true) . Pentru testele booleene de acest tip, eliminarea ultimei părţi a expresiei reprezintă o prescurtare destul de des folosită. 2.6.1.2. Operatorul condiţional Altă alternativă este folosirea într-o instrucţiune condiţionată , în locul cuvintelor cheie if şi else , a operatorului condiţional, denumit uneori şi operator ternar. Operatorul condiţional este denumit operator ternar deoarece are trei termeni. Operatorul condiţional este o expresie, ceea ce înseamnă că întoarce o valoare, spre deosebire de mai generalul if, care are ca rezultat doar executarea unei instrucţiuni sau a
2
unui bloc. Operatorul condiţional este mai util pentru instrucţiuni condiţionale scurte sau simple, care arată cam aşa : Test ? rezultat_adevarat : rezultat_fals;
Test este o expresie care întoarce true sau false, la fel ca testul din instrucţiunea if. Dacă testul este adevărat (true), operatorul condiţional întoarce valoarea rezultat_adevarat. Dacă testul este fals (false), operatorul condiţional întoarce valoarea rezultat_fals. De exemplu, următorul condiţional testează valorile scorulMeu şi scorulTau, întorcând cea mai mare dintre cel două valori, care este atribuită variabilei celMaiBunScor : int celMaiBunScor = scorulMeu>scorulTau ? scorulMeu : scorulTau;
Folosirea operatorului condiţional este echivalentul următorului cod if…else : int celMaiBunScor ; if(scorulMeu>scorulTau) CelMaiBunScor=scorulMeu; else CelMaiBunScor=scorulTau;
Operatorul condiţional are o precedenţă foarte scăzută – este, de obicei, evaluat după toate subexpresiile sale. Singurii operatori care au o precedenţă mai mică sunt cei de atribuire. 2.6.1.3. Instrucţiunea switch O operaţie des întâlnită în programarea în orice limbaj este compararea unei variabile cu o anumită valoare , apoi cu o altă valoare , în caz că nu se potriveşte cu prima valoare şi aşa mai departe . Folosirea instrucţiunilor if în acest caz este o imbricare , deoarece fiecare instrucţiune else contine o altă instrucţiune if , până când se fac toate testele posibile . Un mecanism prescurtat pentru aceste instrucţiuni if imbricate , care poate fi folosit în unele limbaje de programare , este gruparea testelor şi acţiunilor într-o singură instrucţiune. În Java , puteţi grupa acţiunile folosind instrucţiunea switch , care se comportă la fel ca în C . Un exemplu de folosire a instrucţiunii switch este : switch(nota) { case 10 : System.out.println(“Foarte bine – nota 10!”); break; case 8 : System.out.println(“Bine – nota 8!”); break; case 5 : System.out.println(“Ati primit nota 5!”); break; default : System.out.println(“4 – incercati sa invatati!”); }
3
Instrucţiunea switch este bazată pe un test ; în exemplul anterior se testează variabila nota . Variabila testată , care poate fi de orice tip primitiv (byte, char, short sau int) , este comparată pe rând cu fiecare dintre valorile case . Dacă se găseşte o potrivire , se execută instrucţiunea sau instrucţiunile specificate după test . Dacă nu se găseşte nici o potrivire , se execută instrucţiunea sau instrucţiunile default (predefinite) . Instrucţiunea default este opţională ; dacă este omisă şi nu se găseşte nici o potrivire în nici o instrucţiune case , instrucţiunea condiţională switch se încheie fără a executa nimic . Implementarea Java a instrucţiunii switch este limitată – testele şi valorile pot fi doar tipuri primitive simple care pot fi convertite în int . Într-o asemenea instrucţiune nu se pot folosi tipuri primitive de dimensiuni mari , cum ar fi large sau float , şiruri sau alte obiecte şi nici nu se pot testa alte relaţii în afară de cea de egalitate . Aceste restricţii limitează folosirea switch la cazurile mai simple . În schimb , instrucţiunile if imbricate pot fi folosite pentru orice tip de testare . Există două lucruri la care trebuie să fiţi atenţi : Primul este că după fiecare instrucţiune case puteţi include o singură instrucţiune sau mai multe . Spre deosebire de if , nu trebuie să încadraţi instrucţiunile între acolade . Al doilea lucru de reţinut sunt instrucţiunile break conţinute de fiecare secţiune case . Dacă nu ar exista instrucţiunea break , chiar şi după găsirea unei potriviri într-o secţiune case s-ar executa mai departe instrucţiunile până s-ar întâlni o instrucţiune break sau până la sfârşitul instrucţiunii switch . În unele cazuri , s-ar putea să fie exact ce doriţi . Totuşi în majoritatea cazurilor trebuie să includeţi instrucţiuni break pentru a vă asigura că va fi executat doar codul corespunzător . Instrucţiunea break întrerupe execuţia în punctul curent şi face un salt la codul aflat dincolo de următoarea acoladă închisă (}) . Avantajul nefolosirii break într-o instrucţiune switch apare atunci când se doreşte executarea aceloraşi instrucţiuni pentru mai multe valori . 2.6.2. Instrucţiuni repetitive Ciclurile for , while şi do..while sunt identice cu cele din C şi C++ , cu excepţia faptului că testul pentru while şi do…while trebuie să folosească o condiţie booleană . 2.6.2.1. Cicluri for Ciclurile for repetă o instrucţiune de un număr specificat de ori ,până în momentul când se întâlneşte o condiţie . Chiar dacă sunt folosite de obicei pentru simple iteraţii , în care o instrucţiune este repetată de un anumit număr de ori , ciclurile for pot fi folosite pentru aproape orice tip de operaţii repetitive . Ciclul for are în Java sintaxa : for (initializare; test; incrementare) { Instructiune; }
Începutul ciclului for conţine trei părţi :
4
initializare este o expresie care iniţializează pornirea ciclului . Dacă folosiţi o variabilă index a ciclului , această expresie o poate declara şi iniţializa , de exemplu , int i=0.Variabilele pe care le declaraţi în această parte a ciclului for sunt locale ciclului în sine ; ele îşi încetează existenţa după terminarea execuţiei ciclului . În această secţiune puteţi iniţializa mai multe variabile , separând fiecare expresie printr-o virgulă . Instrucţiunea int i=0,int j=10 din această secţiune , declară variabilele i şi j , care vor fi ambele locale ciclului. test este testul care se face după fiecare parcurgere a ciclului . Testul trebuie să fie o expresie booleană sau o funcţie care returnează o valoare booleană , cum ar fi i
View more...
Comments