Sunteți pe pagina 1din 10

Programare Java Curs - 1

INSTRUCTIUNI SI EXPRESII Toate activitatile ce se realizeaza intr-un program Java pot fi rezumate la o serie de instructiuni. O instructiune (statement) este determina o actiune. o comanda simpla, scrisa intr-un limbaj de programare si care

Instructiunile sunt actiuni elementare ale unui program Java. Mai jos putem vedem mai multe exemple de instructiuni Java simple: int varsta=30; import java.awt.dnd; System.out.println(Text ); Jucator.scor=45000; Unele instructiuni produc o valoare, ca in cazul in care se aduna doua numere. Aceste instructiuni se numesc expresii. O expresie este o instructiune care are ca rezultat producerea unei valori. Valoarea poate fi pastrata pentru o folosire ulterioara in program, poate fi folosita imediat intr-o alta instructiune sau poate fi ignorata. Valoarea produsa de o instructiune este numita valoare de retur. Unele expresii produc o valoare de retur numerica, cum ar fi cazul cand se aduna doua numere; altele produc valori booleene adevarat sau fals sau pot produce chiar un obiect Java. Chiar daca majoritatea programelor Java contin o singura instructiune pe fiecare linie aceasta este doar o optiune de formatare, care nu stabileste unde incepe si unde se termina o instructiune ci are scopul principal de a mari lizibilitatea programului. De fapt, fiecare instructiune Java se termina cu ; . Intr-o singura linie se pot introduce astfel mai multe instructiuni fara a determina probleme: j.culoare=galben; j.alegere=false; Instructiunile sunt grupate in Java folosind acoladele { si }. Un grup de instructiuni organizate intre acolade se numeste bloc.

VARIABILE SI TIPURI DE DATE

Variabilele reprezinta un loc unde poate fi pastrata informatia intr-un program aflat in executie. Valoarea poate fi modificata oricand in cadrul programului. Pentru a crea o variabila trebuie sa ii dati un nume si sa stabiliti ce tip de informatie va stoca. De asemenea, in momentul crearii puteti sa atribuiti variabilei o valoare initiala. Exista trei tipuri de variabile in Java: variabile de instanta, variabile de clasa si variabile locale. Variabilele de instanta sunt folosite pentru a defini atributele unui obiect. Variabilele de clasa definesc atributele unei intregi clase de obiecte si se aplica tuturor instantelor acesteia. Variabilele locale sunt folosite in interiorul definitiilor metodelor sau al blocurilor de instructiuni din cadrul unei metode. Ele pot fi folosite doar atunci cand metoda sau blocul este executat de interpretorul Java, dupa care isi inceteaza existenta.

Cu toate ca aceste trei tipuri de variabile sunt create asemanator, variabilele de clasa si de instanta sunt folosite intr-un alt mod decat variabilele locale. In continuare vom trata variabilele locale celelalte doua tipuri vor fi detaliate mai tarziu. OBS: Spre deosebire de alte limbaje Java nu are variabile globale (utilizabile in orice parte a unui program). Variabilele de clasa si de instanta sunt folosite pentru a comunica informatii despre un obiect sau altul si pot inlocui nevoia de variabile globale. Inainte de a folosi o variabila in Java trebuie mai intai sa o declaram prin indicarea numelui si a tipului de informatie pe care il va stoca. Formatul declaratiei este prezentat in continuare, specificandu-se intai tipul de informatie si apoi numele: int maxim; String numeutilizator; boolean stareTerminare; Variabilele locale pot fi declarate in orice loc in interiorul unei metode, la fel ca oricare alta instructiune Java insa trebuie declarate inainte de a fi folosite. In mod normal declararea variabilelor urmeaza imediat dupa instructiunea care defineste metoda. Public static void main(String argumente[]) { int total; String titlu; Boolean activare; } Daca vrem sa cream mai multe variabile de acelasi tip le putem declara pe toate in aceeasi instructiune, separate de , : String strada, oras, tara; Variabilelor li se poate atribui o valoare atunci cand sunt create prin atribuire: int codposta=7000; String nume=Alex; boolean alegere=true; int varsta=50, inaltime=170; Dupa cum se poate vedea avem si posibilitatea de a atribui valori mai multor variabile de acelasi tip. Variabilelor locale trebuie sa li se atribuie valori inainte de a fi folosite in program, altfel acestea nu se vor compila. Definitiile variabilelor de instanta si de clasa primesc o valoare initiala in functie de tipul informatiei pe care o stocheaza: variabilele numerice: 0 caracterele: \0 variabilele booleene: false obiectele: null

Numele variabilelor in Java trebuie sa inceapa cu o litera, cu underscore (_) sau cu $ ele nu pot incepe cu o cifra. Dupa primul caracter numele variabilelor pot contine orice combinatie de cifre si litere. Trebuie sa retinem ca Java tine cont de litere mari si mici. Din aceasta cauza un program poate avea doua variabile diferite: una numita X si alta x sau una alb si alta ALB. In practica s-a impus o regula de denumire a variabilelor Java : numele sunt formate din cuvinte sugestive iar in cazul in care sunt necesare mai multe cuvinte primul caracter al numelui este mic iar inceputul fiecarui cuvant este scris cu majuscula , ca in exemplele de mai jos:

Button incarcaFisier; int codZona; boolean definesteScorMaxim;

TIPURI DE VARIABILE Dupa cum am vazut declaratia de variabila contine in afara numelui si tipul informatiei stocate. Acest tip poate fi: un tip de date de baza numele unei clase sau interfete un tablou

In continuare prezentam tipurile de date de baza ale limbajului. Exista opt tipuri de baza pentru stocarea intregilor, numerelor in virgula mobila, caracterelor si valorilor booleene. Aceste tipuri mai sunt cunoscute si ca tipuri primitive deoarece fac parte integranta din limbajul Java si nu sunt obiecte, lucru care le face mai eficient de folosit. Aceste tipuri de date au aceeasi dimensiune si caracteristici indiferent de sistemul de operare si de platforma folosita spre deosebire de alte tipuri de date din alte limbaje de programare. Pentru stocare intregilor avem patru tipuri de date: - byte - short - int - long - pe 8 biti - valori intre -128 si 127 - pe 16 biti - valori intre -32768 si 32767 - pe 32 biti - valori intre -2147483648 si 2147483647 - pe 64 biti - valori intre -9223372036854775808 si 9223372036854775807

Toate aceste tipuri sunt cu semn ceea ce inseamna ca pot stoca numere pozitive sau negative. Tipul folosit pentru o variabila depinde de domeniul de valori de care este nevoie. Un alt tip de numar ce poate fi stocat este cel reprezentat in virgula mobila; pentru acestea exista tipurile float si double. Numerele in virgula mobila sunt numerele care au o parte zecimala. Tipul float este suficient in majoritatea cazurilor, pastrand numere intre 1,4E-45 si 3,4E38. Daca totusi este necesar se poate folosi tipul real double ce poate stoca numere intre 4,9E-324 si 1,7E308. Tipul char este folosit pentru caracterele individuale, cum ar fi litere, cifre, semne de punctuatie si alte simboluri. Ultimul dintre cele opt tipuri de baza este boolean. Spre deosebire de alte limbaje valorile pentru variabilele de acest tip nu sunt 1 si 0 ci true si false. Toate tipurile de variabile prezentate folosesc litere mici si asa trebuie folosite in cadrul programelor. Exista clase care au aceleasi nume cu acestea, dar incep cu litera mare de exemplu Boolean sau Char. Aceste clase au alt rol in programarea Java astfel incat trebuie folosite diferit de tipurile de baza.

TIPURI DE CLASE

In afara celor opt tipuri de baza o variabila poate fi de tip clasa: String numeDeFamilie=Popescu; Culoare par; Atunci cand o variabila are drept tip o clasa inseamna ca variabila refera un obiect al clasei respective sau al uneia dintre subclasele sale. Referirea la o superclasa ca tip de variabila este folositoare atunci cand variabila poate fi una dintre mai multe subclase diferite. Declararea unei variabile de tip Object inseamna ca poate stoca orice obiect.

OBS: Java nu are un echivalent al instructiunii typedef din C. Pentru a declara noi tipuri in Java se declara o noua clasa iar variabilele pot folosi aceasta clasa drept tip. Dupa ce o variabila a fost declarata i se poate da o valoare folosind operatorul de atribuire, = : idCod=8546; imbracatRapid=false;

COMENTARII

Una dintre metodele cele mai importante de crestere a lizibilitatii unui program este folosirea comentariilor. Comentariile reprezinta informatii introduse intr-un program doar in ajutorul persoanelor care incearca sa-si dea seama ce anume se intampla in program. Compilatorul Java ignora total comentariile atunci cand pregateste versiunea executabila a fisierului sursa Java. Exista trei tipuri diferite de comentarii pe care le putem utiliza in programele Java. Prima modalitate de a introduce comentarii in program este de a il prefixa cu doua simboluri slash // . Orice incepe dupa aceste semne si pana la sfarsitul liniei este considerat comentariu: int oreCredit=3; // defineste orele de credit pentru curs Daca dorim sa introducem un comentariu care ocupa mai mult de un rand trebuie sa incepem cu combinatia /* si sa incheiem cu combinatia */ . Ultimul tip de comentariu este proiectat pentru a fi interpretabil si de catre calculator. Daca incepem comentariul cu /** si il incheiem cu */ atunci comentariul este interpretat ca reprezentand documentatia originala referitoare la functionarea clasei si a metodelor sale publice. Acest tip de comentariu poate fi citit de utilitare ca JAVADOC din pachetul JDK. Acest utilitar foloseste aceste comentarii pentru a crea un set de pagini web care documenteaza programul, ierarhia sa de clase si metodele.

LITERALE

Literalele sunt numerele, textul si alte informatii care reprezinta direct o valoare. Mai explicit, literalele reprezinta un termen apartinand programarii, care inseamna de fapt ca ceea ce tastam este ceea ce vom obtine. Java are mai multe literale pentru intregi. Numarul 4 de exemplu este un literal pentru tipul int. El poate fi atribuit de asemenea variabilelor byte sau short deoarece el este suficient de mic si pentru aceste doua tipuri. Un literal intreg mai mare decat poate stoca o variabila int este considerat automat ca avand tipul long. Putem indica faptul ca un literal este un intreg de tip long prin adaugarea sufixului L (sau l). De exemplu urmatoarea instructiune stocheaza valoarea 4 intr-un intreg de tip long: long totalPagini=4L; Pentru a reprezenta o valoare negativa putem folosi literalul impreuna cu semnul minus ( ). In Java putem folosi si literali in sistem octal sau hexazecimal. Pentru a folosi un literal intreg in octal trebuie sa il prefixam cu cifra 0; numarul octal 777 trebuie astfel scris ca 0777. Intregii hexazecimali se folosesc prefixati cu 0x ca de exemplu 0xFF.

Literalele in virgula mobila folosesc caracterul punct pentru punctul zecimal. Toate literalele in virgula mobila sunt automat considerate de tip double. Pentru a specifica tipul float adaugam F (sau f) ca mai jos: float valoarePi=3.1415F; Putem folosi si exponenti in literalele de virgula mobila folosind litera E (sau e) urmata de exponent: double x=12e22; doube y=19E-70; Literalele caracter sunt exprimate printr-un singur caracter incadrat de ghilimele simple: a, # sau 3. Unele caractere literale reprezinta caractere care nu sunt tiparibile sau accesibile pe tastatura. Mai jos vom vedea coduri speciale care pot reprezenta aceste caractere speciale: \n = new line (linie noua) \t = tab \b = backspace \r = revenire la capat de rand (carriage return) \f = formfeed (salt la pagina noua) \\ = semnul \ \ = ghilimele simple \ = ghilimele duble \_ = octal \x_ = hexazecimal \u_ = caracter unicode (standard pe 16 biti spre deosebire de ASCII standard care presupune doar 128 de caractere)

In cazul ultimelor trei coduri se va inlocui in practica semnul _ cu un numar sau o cifra hexazecimala. Ultimele literale pe care le putem folosi intr-un program Java sunt sirurile de caractere. Un sir (string) in Java este un obiect si nu un tip de date primar. Sirurile nu sunt pastrate in tablouri (ca in C de exemplu). Deaorece sirurile sunt obiecte Java avem si metode care pot fi folosite pentru combinarea si modificarea sirurilor precum si pentru a determina daca doua siruri au aceeasi valoare. Literalele sir constau dintr-o serie de caractere incadrate intre ghilimele duble: String autor=Ion Popescu; String parola=password; Sirurile pot contine si caractere speciale prezentate anterior: String exemplu=Text intre ghilimele \CITAT\; System.out.println(Primul rand \n Al doilea rand); String titlu=Invatati singuri Java\u2122; In ultima instructiune, secventa \u2122 produce simbolul Unicode).
TM

(pe sistemele configurate sa suporte

Atunci cand se foloseste un literal sir Java stocheaza valoarea sa ca obiect String. Nu trebuie sa cream explicit un nou obiect ca in cazul celorlalte obiecte cu care vom lucra deci este la fel de usor de lucrat cu acest tip ca si cu tipurile primare. Sirurile sunt diferite in ceea ce priveste acest aspect nici unul dintre tipurile primare nu sunt pastrate ca obiecte atunci cand sunt folosite.

EXPRESII SI OPERATORI .

O expresie reprezinta o instructiune care produce o valoare. Cele mai folosite expresii sunt cele matematice ca in continuare: int x=3; int y=4; int z=x*y; Ultima instructiune dintre cele de mai sus este o expresie. Operatorul de multiplicare * este folosit pentru inmultirea dintre x si y iar rezultatul produs de expresie va fi pastrat intr-o variabila z de tip intreg. Valoarea produsa de o expresie este numita si valoare de retur. Aceasta valoare poate fi atribuita unei variabile si folosita in diferite feluri in programele noastre. Operatorii reprezinta simboluri speciale folosite in functii matematice, in unele tipuri de instructiuni de atribuire sau in comparatii logice.

OPERATII ARITMETICE

In Java exista cinci operatori folositi pentru operatiile aritmetice de baza: + * / % Adunare Scadere Inmultire Impartire Modulo

Fiecare operator de mai sus foloseste cate doi operanzi cate unul de fiecare parte a operatorului. Operatorul de scadere poate fi folosit si pentru a nega un singur operator. Un lucru care merita atentie sporita in ceea ce priveste operatorul de impartire este tipul operanzilor folositi. Daca stocam rezultatul unei impartiri intr-un intreg acesta va fi rotunjit la un numar intreg pentru ca tipul int nu poate lucra cu valori in virgula mobila. De exemplu expresia 21 / 5 are rezultatul 4 daca acesta este stocat intr-un int. Impartirea modulo ( % ) produce ca rezultat restul impartirii. In expresia 21 / 5 rezultatul pe care il vom obtine va fi 1. In general majoritatea operatiilor aritmetice cu intregi produc un rezultat de tip int indiferent de tipul initial al operanzilor. Daca lucram cu alte tipuri numere in virgula mobila sau intregi long trebuie sa ne asiguram ca operanzii au acelasi tip cu cel la care vrem sa ajungem. Mai jos avem prezentat un exemplu care integreaza folosirea tuturor operatorilor aritmetici:

class Amoeba { public static void main (String argumente[]) { int x=6; short y=4; float a=.12f; System.out.println("ati inceput cu " + x + " amoebe"); System.out.println("\tDoua s-au casatorit si partenerii lor s-au mutat la ele."); x=x+2; System.out.println("Aveti acum " + x); System.out.println("\tSe declanseaza mitoza, care dubleaza numarul de amoebe."); x=x*2; System.out.println("Avem acum " + x); System.out.println("\tIncepe o lupta. " + y + " amoebe pleaca."); x=x-y;

System.out.println("Avem acum " + x); System.out.println("\tAtac al paramecilor ! Am pierdut o treime din colonie."); x=x-(x/3); System.out.println("Am ramas cu " + x + " amoebe"); System.out.println("Costul intretinerii zilnice per amoeba: " + a); System.out.println("Costul total al intretinerii zilnice: " + (a*x)); } }

Comentand pe scurt aceasta aplicatie Java extrem de simpla observam ca in liile 3- 5 se creaza trei variabile ce primesc in acelasi timp si valori initiale; variabilele x si y sunt declarate de tipul int iar variabila a este declarata numar in virgula mobila float deoarece tipul predefinit in Java pentru numere in virgula mobila este double trebuie sa adaugam sufixul f la sfarsitul literalului pentru a indica (si forta) tipul float. In cadrul programului apare in mai multe instructiuni sintagma System.out.println ; Aceasta metoda este folosita in aplicatii pentru a afisa siruri si in general informatii pe dispozitivul standard de iesire in cele mai multe cazuri ecranul. System.out.println() preia un singur argument (intre paranteze): un sir. Pentru a prezenta mai mult de o variabila sau un literal ca argument pentru println() se poate folosi operatorul +, pentru a concatena aceste elemente intr-un singur sir.

ATRIBUIREA UNEI VALORI

Atribuirea este o expresie, ea producand un rezultat. In practica atribuirea poate apare intr-un sir de instructiuni: x=y=z=10; Rezultatul acestei instructiuni este initializarea celor trei variabile cu valoarea 10. Partea din dreapta a unei expresii de atribuire este intotdeauna calculata inainte de a avea loc atribuirea propriu-zisa. Acest lucru face posibila folosirea unei expresii de felul urmator: int x=5; x=x+2; Logic se calculeaza intai x+2, rezultatul fiind 7 si apoi aceasta valoare este atribuita variabilei x. Atribuirea este operatia cea mai des intalnita in programare si in consecinta au aparut mai multi operatori speciali pentru diferite cazuri de atribuire. Mai jos vom vedea operatorii de atribuire speciali precum si echivalentele functionale ale acestora:

X+=Y X-=Y X*=Y X/=Y

X=X+Y X=X-Y X=X*Y X=X/Y

Acesti operatori de atribuire sunt echivalenti perfect cu instructiunile pe care le inlocuiesc dar trebuie avuta mare atentie la utilizarea lor; in cazul folosirii acestor operatori in cadrul unor expresii mai complexe exista cazuri in care acesti operatori nu mai sunt echivalenti. Ca exemplu putem lua situatia urmatoare: X=20; Y=5; X=X/Y+5; si X/=Y+5; Rezultatele celor doua instructiuni vor fi diferite: in primul caz rezultatul va fi 9 iar in cel de-al doilea 2.

INCREMENTAREA SI DECREMENTAREA

O alta operatie uzuala in programare este adaugarea sau scaderea unei unitati dintr-o variabila intreaga. Exista operatori speciali pentru aceste expresii operatori numiti de incrementare si decrementare. Incrementarea unei variabile inseamna a adauga 1 la valoarea sa iar decrementarea unei variabile inseamna a scadea 1 din valoarea sa. Operatorul de incrementare este ++ iar cel pentru decrementare este . Acesti operatori sunt plasati imediat inainte sau dupa numele unei variabile : int X=7; X=X++; In exemplul de mai sus variabila X este incrementata de la 7 la 8. In cazul in care operatorii de incrementare sau decrementare sunt plasati inaintea variabilei atunci ei se numesc operatori prefix iar in cazul in care apar dupa variabila se numesc operatori sufix. Intr-o expresie simpla, de exemplu variabila--, folosirea unui operator prefix sau sufix nu schimba rezultatul. Atunci cand operatiunile de incrementare sau decrementare fac parte dintr-o expresie mai complexa optiunea intre prefix si sufix devine importanta. Sa comentam putin exemplul de mai jos: int x,y,z; x=42; y=x++; z=++x; Aceste doua expresii produc rezultate diferite din cauza diferentelor intre operatorii sufix si prefix. Atunci cand folosim operatori sufix, ca in y=x++, variabila y primeste valoarea lui x inainte ca aceasta sa creasca cu 1 astfel incat y va fi egal cu 42; la folosirea operatorilor prefix, ca in z=++x, variabila x este mai intai incrementata si apoi valoarea sa este atribuita lui y, astfel incat z va avea valoarea 44. Ca si incazul operatorilor speciali de atribuire trebuie avuta mare grija in cazul folosirii operatorilor de incrementare si decrementare in cazul unor expresii mai complexe existand posibilitatea introducerii unei erori destul de greu de depistat in cadrul programului.

OPERATORI PENTRU COMPARATII

Java poseda mai multi operatori folositi pentru a face comparatii intre variabile, intre variabile si literale sau intre alte tipuri de informatie dintr-un program Java. Acesti operatori sunt folositi in expresii care intorc valori booleene true si false, in functie de valoarea de adevar a comparatiei. In cele ce urmeaza prezentam operatorii de comparatie utilizati in Java: Operator == != < > <= >= Semnificatie egal diferit mai mic decat mai mare decat mai mic sau egal cu mai mare sau egal cu Exemplu x==3 x!=3 x<3 x>3 x<=3 x>=3

In continuare avem un exemplu practic de folosire a unei comparatii: boolean tanar; int varsta=41; tanar=varsta<35; Expresia varsta<35 produce rezultatul true sau false (in cazul nostru false) in functie de valoarea variabilei varsta. In final valoarea variabilei tanar va fi astfel false.

OPERATORI LOGICI

Expresiile care produc valori booleene (cum ar fi comparatiile) pot fi combinate pentru a forma expresii mai complexe. Acest lucru poate fi realizat folosind operatorii logici. Acesti operatori pot fi folositi pentru combinatii logice AND (si), OR (sau), XOR (sau exclusiv) si NOT (negare). Pentru combinatiile AND se folosesc operatorii logici & si &&. Atunci cand doua expresii booleene sunt conectate prin operatorii & sau && expresia combinata returneaza valoarea true doar daca ambele expresii booleene au valoarea true. Diferenta intre & si && consta in modul in care Java evalueaza expresia combinata. Daca se foloseste & atunci se evalueaza ambele expresii indiferent de valoarea lor. Daca se foloseste && si expresia din stanga operatorului are valoarea de adevar false atunci expresia din dreapta operatorului nu mai este evaluata deoarece rezultatul final va fi oricum false. Pentru combinatiile OR se folosesc operatorii | sau ||. Aceasta combinatie de expresii intoarce valoarea true daca cel putin una dintre expresiile booleene este adevarata. In cazul folosirii operatorului ||, daca prima expresie booleena are valoarea true atunci a doua nici nu se mai evalueaza, rezultatul final fiind oricum true. Combinatia XOR foloseste un singur simbol: ^ . Acesta are ca rezultat o valoare true numai daca ambele expresii booleene pe care le combina au valori diferite. In cazul in care ambele expresii au valoarea true sau ambele false atunci rezultatul va fi false. Combinatia NOT foloseste operatorul logic ! , urmat de o singura expresie. Acesta schimba valoarea unei expresii booleene in acelasi fel in care simbolul schimba semnul pozitiv sau negativ al unui numar.

PRECEDENTA OPERATORILOR

Atunci cand intr-o expresie se folosesc mai multi operatori Java are stabilita o anumita ordine in care ii evalueaza. In majoritatea cazurilor aceasta precedenta determina valoarea finala a expresiei. In general, ordinea operatiilor este urmatoarea: operatii de incrementare si decrementare operatii aritmetice comparatii operatii logice expresii de atribuire

Daca doua operatii au aceeasi precedenta, cea aflata mai in stanga expresiei va fi calculata prima. In tabelul de mai jos avem prezentata precedenta operatorilor:

. [] ()

Parantezele rotunde se folosesc pentru a grupa expresii; punctul se foloseste pentru a accesa

++ -- ! instanceof

new (tip) expresie

* / % + << >> >>> < > >= <= == != & ^ | && || ?: = += -= *= /= %=

metodele si variabilele din cadrul obiectelor si claselor; parantezele drepte sunt folosite pentru tablouri. Instanceof intoarce valoarea true sau false daca obiectul este sau nu o instanta a clasei numite sau a unei subclase a acesteia Operatorul new este folosit pentru crearea de noi instante ale claselor; in acest caz se foloseste pentru transformarea unei valori intr-un alt tip Inmultire, impartire, modulo Adunare, scadere Deplasarea pe biti la stanga si la dreapta Comparatii Teste de egalitate AND XOR OR AND optimizat (logic) OR optimizat (logic) Operatorul conditional Atribuiri

In cazul in care nu suntem siguri de precedenta diferitiolor operatori cea mai buna solutie este folosirea parantezelor pentru a impune precedenta dorita.

ARITMETICA SIRURILOR Operatorul + este folosit nu doar pentru calcule matematice ci si pentru a concatena siruri . Operatorul + concateneaza siruri, alte obiecte si variabile pentru a forma un singur sir. Pentru a adauga ceva la sfarsitul unui sir se poate folosi si operatorul += , ca in exemplul urmator: numeleMeu += Jr.; Instructiunea anterioara este bineinteles echivalenta cu: numeleMeu=numeleMeu + Jr.;