6. Şi în sfârşit ... Java
6.1 Scurt istoric Java este un limbaj de programare orientat pe obiecte asemănător limbajului C++. El a fost dezvoltat de firma Sun, prima semnalare a apariţiei sale datând din 1991.
Limbajul a fost dezvoltat în cadrul unui proiect denumit Green, obiectivul
acestuia fiind dezvoltarea unui limbaj pentru programarea echipamentelor electrice şi electronice "inteligente" şi comunicarea cu acestea. Punctul de pornire a fost limbajul C++, dar Java aduce acestuia un volum semnificativ de modificări, mai ales în sensul simplificării, creşterii rigurozităţii şi a portabilităţii.
Conducătorul proiectului, Green
James Gosling, este considerat părintele limbajului Java. Noului limbaj i s-a dat la început numele Oak (eng. stejar) dar acesta a fost revendicat de o altă firmă şi realizatorii l-au schimbat în Java, aluzie la sursa băuturii favorite a memrilor echipei cafeaua.
Caracteristicile noului limbaj au intrat însă şi în atenţia şi firmelor preocupate de dezvoltarea Internetului. A realiza aplicaţii având un cod redus, uşor deci de transportat prin reţele şi care pot fi rulate pe diferite tipuri de calculatoare şi de sisteme de operare reprezenta o problemă dificilă. Dar nu şi pentru echipa care a creat Java, care în 1994 a pus la punct o aplicaţie destinată navigării prin Internet (denumită HotJava) care integra suportul necesar executării în pagina de web a unor mici aplicaţii, denumite applet-uri. A mai trebuit un pic de sprijin din partea firmei Netscape, al cărui program de navigare în Internet era deja larg răspândit şi succesul imediat al limbajului Java a fost asigurat.
84
6.2 Tratarea programelor scrise în Java Un program scris în limbajul Java este supus unei compilări în urma căreia se obţine un cod intermediar (cod de octeţi) care este apoi interpretat şi executat de o aplicaţie specializată, care poate fi asimilată unui procesor virtual. Această aplicaţie poartă denumirea de "maşină virtuală java" (eng. Java Virtual Machine, JVM). Codul rezultat în urma compilării poate fi transferat şi apoi executat pe orice calculator pe care există instalat JVM. Site-ul firmei Sun oferă spre descărcare, gratuit, aplicaţia JVM pentru toate sistemele de operare majore.
6.3 Realizarea unei aplicaţii elementare în Java Aplicaţiile Java pot fi realizate în mai multe moduri. Cel mai economic mor este scrierea aplicaţiei într-un editor (Notepad este suficient) urmată de compilare şi execuţie, ambele realizate prin comenzi în fereastra Command. Exemplu:
Fişierul se salvează sub numele Grideala.java. Numele fişierului coincide cu numele clasei conţinute în acesta.
85
compilare
executare
Aplicaţiile scrise în Java conţin una sau mai multe clase. De regulă clasele sunt conţinute în fişiere distincte al căror nume coincide cu numele clasei. Una dintre clase va conţine metoda principală, main(), care defineşte punctul de început a aplicaţiei. Deşi iniţierea în Java folosind un editor simplu, compilatorul javac şi procesorul virtual java poate fi o abordare în învăţarea limbajului, în cele ce urmează aplicaţiile vor fi dezvoltate folosind unul dintre mediile integrate, NetBeans.
6.4 Netbeans şi JDK - instalare şi configurare JDK (Java Development Kit) este un ansamblu de instrumente software destinat dezvoltării de aplicaţii în Java oferit de firma Sun Microsystems. Pachetul poate fi descărcat de pe site-ul firmei (http://java.sun.com/javase/downloads/index.jsp). Site-ul firmei Sun oferă spre descărcare şi versiuni de JRE (Java Runtime Environment, procesorul virtual Java necesar rulării aplicaţiilor) dar, pentru dezvoltarea de aplicaţii cu NetBeans trebuie descărcat şi instalat JDK. De altfel în kitul conţinând JDK există şi JRE. Mediul integrat de dezvoltare NetBeans poate fi descărcat de la adresa http://www.netbeans.info/downloads/index.php. după instalarea JDK.
Mediul face apel de altfel la instrumentele de dezvoltare de
aplicaţii integrate în JDK. 86
El se instalează în mod obligatoriu
6.5 Realizarea unei aplicaţii simple în NetBeans Aplicaţia deja realizată poate fi uşor refăcută folosind NetBeans. Înainte de a realiza însă noua aplicaţie este bine să creaţi pe disc un director care să conţină toate proiectele pe care le ceţi realiza.
La crearea unui nou proiect, NetBeans va crea
automat un director în care va plasa componentele acestuia. Paşi necesari realizării unui proiect sunt următorii:
1.
După pornirea mediului se selectează File / New project:
2. În fereastra New Project se selectează categoria (General) şi tipul proiectului (Java Application)
87
În noua ferestră se indică numele proiectului (Greutate), directorul în care va fi creat (D:\ProiecteJava) şi se deselectează caseta de validare Create Main Class deoarece clasa principală va fi creată ulterior. Rezultatul va fi crearea componentelor proiectului Greutate.
3. În meniul contextual afişat la selectarea proiectului Greutate (clic cu butonul drept) se selectează New / Java Class:
În fereastra care se afişează se defineşte numele clasei - tot Greutate deoarece va fi clasa principală a proiectului (va conţine main()) şi se indică numele pachetului (Package, echivalentul în Java a spaţiului de nume din C# introdus prin directiva using) care va conţine clasa. Mediul NetBeans permite păstrarea claselor aplicaţiei într-un pachet implicit, DefaultPackage, dar este bine ca într-un proiect clasele să fie dispuse într-un pachet creat în acest scop şi nu în cel implicit.
Odată introdus numele
pachetului, NetBeans va crea un director purtând numele acestuia. 88
Rezultat:
Clasa creată nu conţine deocamdată decât un constructor.
4. Se adaugă clasei metoda main():
89
Metoda main() trebuie în continuare completată:
5. Se salvează şi se execută aplicaţia: Save All
90
Run Main Project (F6)
În JavaBeans consola este fereastra Output. În această fereastră vor fi scrise atât mesajele mediului de programare generate în timpul procesării fişierelor aplicaţiei (compilare, execuţie) cât şi şirurile de caractere afişate prin apelul metodelor System.out.print() sau System.out.println().
Observaţie: Proiectele realizate cu NetBeans vor fi afişate sub forma unui arbore în fereastra Projects. Butonul
realizează construirea executabilului şi executarea
proiectului principal. Pentru a impune proiectul principal se selectează File / Set Main Project sau se afişează meniul contextual aferent proiectului (clic cu butonul drept pe numele proiectului) şi se selectează opţiunea Set Main Project.
91
6.6 Scurtă prezentare a limbajului Java Fiind derivat din C++, limbajul Java nu pune probleme dificile celor care cunosc acest limbaj.
De aceea prezentarea elementelor fundamentale ale limbajului va fi
realizată foarte succint.
Comentarii Programele Java conţin explicaţii sub forma unor comentarii.
Acestea vor
asigura în timp înţelegerea diferitelor metode şi rolul funcţional al variabilelor folosite. Exemplu de aplicaţie scrisă folosind comentarii: class Greutate { /* Clasa Greutate permite calculul greutatii ideale. Formula folosita determina greutatea pentru barbati, pentru femei rezultatul trebuie inmultit cu 0.9. */ public static void main ( String[] args ) { int h, v; // h - inaltimea in cm si v - varsta in ani double g; // greutatea in kg h = 178; v = 36; g = 50 + 0.75 * (h-150) + 0.25 * (v - 20); System.out.println("Greutatea ideala (barbat) = " + g + " kg"); System.out.println("Greutatea ideala (femeie) = " + 0.9*g + " kg"); } }
// Sfarsit main
// Sfarsit clasa Greutate
Într-un program scris în Java pot fi folosite două tipuri de comentarii: •
comentarii "în linie", introduse prin //.
încheie la sfârşitul liniei curente
92
Un astfel de comentariu se
•
comentarii pe unul sau mai multe rânduri consecutive. Zona care
conţine comentariul este delimitată prin /*
(comentariu) */.
De regulă se folosesc comentariile în linie, cel de-al doilea tip fiind folosit frecvent în timpul depanării programelor mari şi complexe, pentru a suprima din program anumite zone. Comentariile care încep cu /** sunt prelucrate de aplicaţia javadoc pentru realizarea automată a unei pagini web conţinând comentariile programatorului. Această facilitate este folosită pentru documentarea rapidă a programelor mari, compuse din mai multe clase.
6.6.1 Variabile În Java numele unei variabile, metode sau clase poate fi orice combinaţie de litere şi cifre, începând cu o literă. Caracterele '_' (underscore) şi '$' sunt considerate litere şi pot intra în construcţia numelor. Nu pot fi folosite ca nume cuvintele rezervate folosite la definirea limbajului.
abstract
double
int
strictfp
boolean
else
interface
super
break
extends
long
switch
byte
final
native
synchronized
case
finally
new
this
catch
float
package
throw
char
for
private
throws
class
goto
protected
transient
const
if
public
try
continue
implements
return
void
default
import
short
volatile
do
instanceof
static
while
93
true
false
null
6.6.2 Tipuri de date elementare În Java, ca şi în alte limbaje evoluate, sunt definite 8 tipuri de date elementare (primitive):
Cuvânt cheie pt. declarare
Descriere
Mărime/Reprezentare internă
(numere întregi) byte
Întreg reprezentat pe un octet 8-biţi, repr. in compl. faţă de 2
short
Întreg scurt
16-biţi, repr. in compl. faţă de 2
int
Intreg
32-biţi, repr. in compl. faţă de 2
long
Întreg lung
64-biţi, repr. in compl. faţă de 2 (numere reale)
float
Simplă precizie
32-biţi, IEEE 754
double
Dublă precizie
64-biţi IEEE 754 (alte tipuri)
char
Un caracter
16-biţi, repr. Unicode
boolean
O valoare logică
true sau false
Spre deosebire de alte limbaje, în Java informaţiile din tabelul precedent sunt valabile indiferent de calculatorul pe care se execută programul. Observaţii asupra tipului char: În Java un caracter se reprezintă încadrat între apostroafe. Astfel 'C' sau '&' sunt caractere. Unele caractere nu au simbol grafic. Cele mai uzuale se pot totuşi introduce folosind o succesiune de două caractere (secvenţă escape) astfel: '\n' (LF), '\a' (bell), '\b'
94
(backspace), '\f' (pagină nouă, formfeed), '\r' (retur car, carriage return), '\t' (tab orizontal), '\v' (tab vertical). Un exemplu în acest sens poate fi scris pornind de la succesiunea de apeluri de metode care realizează afişarea pe ecran a rezultatelor programului scris mai sus: System.out.println("Gr. (barbat) = " + g + " kg"); System.out.println("Gr. (femeie) = " + 0.9*g + " kg");
System.out.println() asigură trecerea la linie nouă după afişarea şirului de caractere introdus ca şi argument. Dacă însă folosim un singur apel, acelaşi rezultat se obţine folosind secvenţa \n: System.out.println("Gr. (barbat) = " + g + " kg\nGr. (femeie) = " + 0.9*g + " kg");
6.6.3 Şiruri Pentru a utiliza un şir, în Java trebuie declarat şi apoi realizată alocarea memoriei necesare. Exemple fundamentale: int [] a;
//
Se poate scrie si int a[];
a = new int[7]; int [] b = {1, 3, 4, 6, 10}; Pentru şirul a se va rezerva în memorie o succesiune de 7 locaţii. Deoarece elementele şirului a sunt de tip int, fiecare locaţie va avea lungimea de 4 octeţi. Şirul b a fost declarat şi iniţializat în acelaşi timp. Pentru elementele şirului b se vor rezerva 5 locaţii de memorie consecutive. Pentru referirea elementelor şirurilor se folosesc indici. Astfel, după declararea şirului a se va putea scrie: a[0] = 12; a[2] = 21; a[3] = a[0] + a[2];
Şirurile pot avea două sau chiar mai multe dimensiuni. Exemplu: int [ ] [ ] c;
95
c = new int [3] [4]; c[0] [2] = 17; System.out.println("c(0,2) ="+c[0] [2]);
Lungimea unui şir, indiferent de conţinutul acestuia, poate fi obţinută folosind proprietatea .length. Exemplu: for (i=0; i
6.6.4 Clasa String În Java şirurile de caractere sunt obiecte aparţinând clasei String. Declararea unui şir de caractere poate fi realizată fie scriind: String unu="Thomas ";
fie ca şi în cazul declarării şi iniţializării obiectelor: String doi; doi = new String("Jerry");
Un şir de char (declarat char [ ]) poate fi transformat într-un obiect aparţinând clasei String. Exemplu: char data[] = {'a', 'b', 'c'}; String str = new String(data);
Unirea mai multor obiecte de tip String anterior definite se realizează folosind operatorul '+', astfel: String trei; trei=unu+" & " + doi;
// rezultat "Tom & Jerry"
Se pot defini desigur şiruri de şiruri.
Declaraţia String [ ] args care apare
sistematic în lista de parametri ai metodei main() este un bun exemplu.
96
6.6.5 Literali În timpul scrierii unui program, programatorul foloseşte frecvent literali. Literalii sunt valori aparţinând tipurilor primitive prezentate.
Compilatorul analizează aceste
valori, le stabileşte tipul, le converteşte şi le memorează în locaţii din memorie. De exemplu, în clasa Greutate apărea atribuirea: h = 178; Compilatorul va asocia literalului "178" tipul int., va face conversia în binar corespunzătoare şi va memora rezultatul într-o zonă din memorie având o lungime de 4 octeţi. La fel, în expresia greutăţii: g = 50.0+0.75*(h-150)+0.25*(v-20); compilatorul va considera că 50.0, 0.75 şi 0.25 sunt double (numere reale în dublă precizie) iar 150 şi 20 sunt int (numere întregi). Exemple fundamentale: Literal
Tipul de dată
178
int
8864L
long
37.266
double
37.266D
double
87.363F
float
26.77e3
double
'c'
char
true
boolean
false
boolean
97
6.7 Operatorii limbajului Java În definirea unui limbaj, stabilirea operatorilor care pot fi folosiţi la scrierea expresiilor şi a regulilor lor de utilizare reprezintă o etapă importantă. Limbajele de nivel înalt folosesc un mare număr de operatori şi chiar permit extinderea setului de operatori pentru a putea scrie expresii în care intervin variabile aparţinând tipurilor structurate (obiecte). Operatorii matematici din Java + - * / % (modulo) x % y furnizează restul împărţirii întregi a lui x la y. Exemplu de utilizare a operatorului '%': if((an % 4 == 0 && an % 100 !=0) || an % 400 == 0) System.out.println(an + " este bisect."); Operatorul % nu se aplică tipurilor float şi double. Operatorul "/" poate provoca trunchiere în cazul operanzilor întregi. Evaluarea expresiilor aritmetice se efectuează de la stânga la dreapta respectând ordinea de evaluare normală. Operatorii de comparare şi logici Operatorii de comparare (relaţionali) din Java sunt : rel="nofollow"> >= < <= == != Operatorii de comparare au o prioritate inferioară celor aritmetici : i < lim + 1 se evaluează ca şi
i < (lim + 1)
O expresiile în care intervine o succesiune de operatori logici && (şi) sau o succesiune de operatori || (sau) sunt evaluate de la stânga la dreapta şi evaluarea expresiei încetează când se ştie deja valoarea de adevăr a rezultatului. && e mai prioritar ca şi || iar ambele sunt mai puţin prioritare ca şi operatorii de comparaţie.
98
Operatorul ! (negaţie) if (!corect) . . .
identic cu
if (corect == false) . . .
Conversiile de tip Când într-o expresie intervin operanzi de tipuri diferite, operanzii corespunzând unui tip mai restrictiv se convertesc automat spre tipul mai general astfel încât nu se produce pierdere de informaţie. Dacă rezultatul unei expresii este float sau double şi este atribuit unei variabile de tip întreg, compilatorul va sesiza posibila pierdere de informaţie şi va semnala o eroare. Operatorii de conversie de tip (transtipaj sau cast) (nume-tip) expresie expresie este convertită în tipul specificat : x = Math.sqrt((double)n) alfa = (float)a / j ; Operatorii de incrementare şi de decrementare ++ şi
--
În funcţie de poziţia operatorului faţă de variabila incrementată, se realizează pre şi post incrementare (decrementare) int n = 5 ;
x = n++ ; atribuie 5 lui x
x = ++n ; atribuie 6 lui x
Operatorii şi expresiile de atribuire Expresia : i = i + 3;
99
în care variabila din stânga egalului se repetă în dreapta acestuia se mai poate scrie astfel : i += 3 ; += este în acest caz un operator de atribuire. În general în Java, exp1 op= exp2 ;
echivalează cu
exp1 = exp1 op (exp2) ; unde op este + - * / %. Exemplu fundamental: x *= y + 1 ; echivalează cu : x = x * (y + 1) ; şi nu cu x=x*y+1; Expresiile condiţionale Pentru a calcula expresia z = max(a, b) ; se poate scrie
if (a > b) max = a ; else max = b ; Limbajul Java oferă şi o altă cale : max = (a > b) ? a : b ;
100
6.8 Instrucţiunile limbajului Java
Instrucţiunea de decidere - if Ansamblul de instrucţiuni cuprinse între acolade formează o instrucţiune compusă sau un bloc de instrucţiuni. Instrucţiunile din interiorul unui bloc de instrucţiuni sunt executate în ordinea în care sunt scrise.
Variante de scriere a instrucţiunii if if ( expLogica ) instrucţiune;
if (expLogica ) { mai multe instrucţiuni }
if (expLogica ) instrucţiune; else instrucţiune;
if (expLogica ) { mai multe instrucţiuni } else { mai multe instrucţiuni }
if (expLogica ) instrucţiune; else { mai multe instrucţiuni }
if (expLogica ) { mai multe instrucţiuni } else instrucţiune;
Indentarea (scrierea decalată) instrucţiunilor sau a blocurilor de instrucţiuni din if nu este obligatorie dar are mare importanţă în înţelegerea şi depanarea programului.
Instrucţiunea while Instrucţiunea while permite realizarea unei structuri repetitive (ciclu) condiţionate anterior. Corpul ciclului poate fi executat o dată, de mai multe ori sau de loc.
101
Exemplu fundamental: int contor = 1; while ( contor <= 3 ) { System.out.println("Contor = "+contor); contor = contor + 1; // sau mai bine contor++ } System.out.println("La revedere!");
Sintaxa instrucţiunii while este: while ( condiţie ) instrucţiune
Condiţia este o expresie logică.
Sintaxa instrucţiunii while while ( condiţie )
instrucţiune;
while ( condiţie ) { }
una sau m. m.instrucţiuni
Instrucţiunea do
Pentru programarea unui ciclu poate fi folosită întotdeauna instrucţiunea while. Deoarece while începe prin executarea unui test, în cazul în care variabila testată nu poate primi valori decât în interiorul ciclului, programatorul trebuie să-i dea la început o valoare convenabilă pentru a determina intrarea în ciclu. Exacutarea instrucţiunilor din corpul ciclului va corecta automat valoarea iniţială. Pentru astfel de cazuri există însă şi o cale mai simplă, respectiv folosirea instrucţiunii do. Exemplu:
102
g = 9.81; t = 0; do { d = (g * t * t ) / 2; System.out.println( t + " " + d); t = t + 1; } while (d <= 500);
Instrucţiunea for Instrucţiunea for este preferată ori de câte ori trebuie să realizăm un ciclu care foloseşte un contor. Ea poate fi însă folosită însă în toate cazurile în care trebuie să realizăm un ciclu, şi reprezintă o modalitate compactă şi elegantă de scriere a acestora. Dacă înaintea unui ciclu trebuie realizate mai multe iniţializări, acestea pot scrise în for una după alta, despărţite prin virgule: class Suma { public static void main ( String[] args ) { int [] a = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int i, sum; for (i=0,sum = 0; i
Oricare dintre cele trei părţi ale instrucţiunii for pot lipsi.
Lipsa condiţiei de
reluare este echivalentă cu a scrie o condiţie care este întotdeauna adevărată. Ieşirea dintr-un astfel de ciclu se poate face folosind instrucţiunea break. Exemplu: for ( ; ; ) { .. break; .. }
103
Executarea instrucţiunii break provoacă o ieşire imediată din ciclul for. Ea poate fi folosită şi pentru a ieşi din ciclurile while sau do.
Instrucţiunea switch Instrucţiunile de ciclare prezentate, while, do şi for sunt folosite pentru realizarea blocurilor de instrucţiuni a căror execuţie începe cu prima linie şi este controlată de către programator. Instrucţiunea switch este folosită tot pentru a construi un bloc de instrucţiuni dar punctul de unde începe execuţia depinde de valoarea unei expresii având valori întregi. Sintaxa instrucţiunii este: switch (expresie) { case constanta_1 : instrucţiuni case constanta_2 : instrucţiuni ... default : instrucţiuni; } Fiecare dintre punctele de unde poate începe execuţia blocului este etichetat printr-o constantă având valoare întreagă. Dacă expresia de testat corespunde uneia dintre constante, execuţia blocului începe din punctul indicat de aceasta. Cazul default este facultativ. Exemplu : switch (t) { case 's' : rez = Math.sin(Math.PI * x / 180.); System.out.println("rezultatul este : "+rez); break; case 'c' :
104
rez = Math.cos(Math.PI * x / 180.); System.out.println("rezultatul este : "+rez); break; case 't' : rez = Math.sin(Math.PI * x / 180.)/Math.cos(3.14159 * x / 180.); System.out.println("rezultatul este : "+rez); break; default: System.out.println("Caracter incorect!"); }
Ca şi în cazul ciclurilor, instrucţiunea break provoacă o ieşire imediată din blocul realizat folosind switch.
105