Primele programe Java |
Un program simplu |
// fisier PrimulProgram.java import java.io.*; public class
PrimulProgram |
Programul prezentat nu face altceva decat sa afiseze o secventa de caractere pe ecran, dar poate servi la evidentierea unor elemente de baza care apar in orice program Java.
In primul rand trebuie spus ca programele Java sunt constituite ca seturi de clase. In particular, programul prezentat mai sus este constituit dintr-o singura clasa.
Pentru descrierea unei clase se foloseste o constructie sintactica de forma:
class nume_clasa
Aproape orice program, indiferent ca este scris intr-un limbaj procedural sau obiectual, are o radacina sau un punct de plecare. Astfel, in programele Pascal avem ceea ce se numeste program principal, iar in C avem functia main.
In programele Java vom avea o clasa radacina care se caracterizeaza prin faptul ca include o functie al carei antet este:
public static void main(String[ ] arg)
Elementele desemnate prin cuvintele public si static vor fi lamurite putin mai tarziu. Deocamdata le folosim asa cum le vedem. Numele clasei radacina este un identificator dat de programator.
Parametrul functiei main
este de tip tablou de elemente String (tablou
de siruri de caractere). Prin intermediul acestui parametru putem referi si
utiliza in program eventualele argumente specificate la lansarea in executie a programului.
In ceea ce
priveste clauza import plasata chiar la inceput, ea se refera la
faptul ca programul utilizeaza operatii ale unor clase aflate in pachetul numit
java.io. Despre pachete si importarea claselor
vom discuta mai detaliat in paragraful dedicat documentatiei API.
Actiunile executate de programul de mai sus presupun 2 operatii de afisare: print si println. Observam modul putin mai ciudat de apel al acestor operatii. Prefixul System.out care insoteste numele celor 2 operatii reprezinta numele unui obiect: este vorba despre un obiect predefinit care se utilizeaza atunci cand destinatia unei operatii de scriere este ecranul monitorului.
Asa dupa cum vom vedea si in modulele urmatoare, deoarece metodele sunt incluse in obiecte, apelul presupune precizarea numelui obiectului "posesor". Exista si situatii in care apelul unei metode presupune precizarea numelui clasei in loc de numele unui obiect: este vorba despre metodele statice, despre care vom invata in saptamana urmatoare. Cu alte cuvinte, in Java, apelul unei operatii se realizeaza folosind una din notatiile:
nume_obiect.nume_metoda(parametri_actuali)
sau
nume_clasa.nume_metoda(parametri_actuali)
Metodele print/println
pot primi ca parametru un sir de caractere dat fie sub
forma de
Metodele print/println
mai pot primi ca parametru si valori ale tipurilor primitive sau obiecte, dar
acestea sunt convertite tot la tipul String inainte de afisare.
Despre
tipul String vom vorbi in detaliu putin mai tarziu. Deocamdata stim
despre el ca modeleaza lucrul cu siruri de caractere.
Diferenta dintre print
si println este aceea ca println
realizeaza, dupa afisarea textului dat ca parametru, un salt la linie noua. Se
precizeaza ca println poate fi apelata si fara parametri, caz in
care executa doar un salt la linie noua:
System.out.println(
Cum ajung de la sursa la executie |
Pana acum am fost obisnuiti
ca programele pe care le scriam sa parcurga pana la
executie clasicul traseu: editare -> compilare -> linkeditare ->
executie. Prin compilare se obtinea cod masina chiar pentru masina pe care se
executa compilarea.
In cazul programelor Java traseul
amintit este in esenta acelasi, dar produsele obtinute
sunt diferite, iar faza de linkeditare practic dispare din punct de vedere al
utilizatorului.
Vom descrie in continuare care sunt pasii pe care trebuie sa-i parcurgem pentru a ajunge sa executam un program scris in Java. Pentru aceasta ne vom referi la exemplul dat in paragraful anterior si consideram ca utilizam ca mediu de dezvoltare produsul SDK.
Atentie: editoarele de genul MSWord sau WordPad NU sunt editoare de text ASCII simplu, deci NU le vom folosi pentru editare de programe sursa !!!
Sursa se salveaza intr-un fisier care va
avea OBLIGATORIU extensia .java. si
numele clasei public. In exemplu: PrimulProgram.java.
javac nume_fisier_sursa.java
de exemplu:
javac PrimulProgram.java
Atentie: prezenta extensiei .java in comanda de compilare este OBLIGATORIE.
In urma compilarii vor rezulta un
numar de fisiere egal cu numarul claselor continute de sursa. Fiecare dintre
fisierele rezultate are extensia .class si numele identic cu
numele clasei careia ii corespunde.
Prin urmare, pentru exemplul
nostru va rezulta un fisier cu numele PrimulProgram.class.
Un fisier .class contine
cod masina virtual numit si Java Byte Code.
Codul virtual este codul masina al unui calculator imaginar.
Pentru a putea fi
executat pe o masina reala, este necesar un interpreter
(sau executiv) care sa execute fiecare instructiune a codului virtual in
termenii operatiilor masina ai calculatorului real.
Avantajul utilizarii codului virtual este urmatorul: dupa compilare, programul in cod virtual
obtinut poate fi transportat pe orice masina pentru care exista interpreterul
corespunzator, iar scrierea unui interpreter este mult mai usoara decat a unui
compilator intreg.
In concluzie, dupa compilare,
urmatorul pas in prelucrarea unui program Java este
executia prin intermediul interpreterului.
java nume_clasa_radacina
Argumentul dat interpreterului Java la lansarea in executie este de fapt numele unui fisier .class, si anume acela corespunzator clasei radacina (adica cea care contine metoda main).
Pentru exemplul nostru comanda de executie va fi deci:
java PrimulProgram
Recomandare: pentru a putea lucra mai comod la dezvoltarea unui program Java, se recomanda deschiderea pe ecran a 2 ferestre de lucru: una pentru editarea sursei si celalta pentru compilarea si executia programului.
Am
afirmat in paragraful anterior ca parametrul metodei main din
clasa radacina serveste la accesarea eventualelor argumente date in linia de
comanda la lansarea in executie a programului. Pentru a ilustra acest aspect, vom considera un program care
afiseaza o formula de salut, urmata de numele si prenumele utilizatorului, date
ca argumente:
// fisier Salutare.java import java.io.*; public class Salutare |
Dupa ce compilam acest program, il putem lansa in executie de exemplu cu comanda:
java Salutare mai Popescule
Observatii:
De aceea, daca dorim sa fim mai rigurosi, e bine sa prevedem secvente de
verificare in program, prin care sa testam daca utilizatorul a furnizat numarul
necesar de parametri:
// fisier Salutare1.java import java.io.*; class Salutare1 |
Expresia arg.length utilizata in secventa de
mai sus ne da numarul de elemente ale tabloului arg.
Posibilitatea de a folosi aceasta expresie (despre care vom afla mai multe in
capitolul despre tablouri) explica de ce metoda main
nu are nevoie de un al 2-lea parametru, omolog al lui _argc din
programele C.
Ceea ce
trebuie sa retinem de aici este faptul ca, spre deosebire de functiile printf
din C, care acceptau un numar variabil de parametri, functiile print/println
din Java accepta UN SINGUR parametru. Ca urmare, atunci cand dorim sa scriem printr-o singura instructiune mai multe valori
trebuie sa le concatenam, spre a forma un singur sir.
In scrierea programelor Java se tine seama de recomandarile de la Code Conventions for the JavaTM Programming Language https://java.sun.com/docs/codeconv/index.html, cele mai importante fiind urmatoarele:
Ce este Java API |
Intr-un program Java vom lucra in principiu cu 2 tipuri de clase:
Pentru a putea scrie un program Java este foarte important sa avem acces la o
documentatie a API, ca sa stim la ce si cum sa folosim clasele respective. In
mod normal, mediul de dezvoltare trebuie sa includa
documentatia API. De obicei ea apare sub forma de colectie de pagini web.
Documentatii API se gasesc in numar mare si pe Internet. Pe situl Sun: API Documentation.
Clasele predefinite sunt grupate in asa-numite pachete. Un pachet
contine clasele care rezolva o anumita problema. De exemplu,
pachetul java.io contine clase care se ocupa de operatiile de
intrare/iesire.
Numele
pachetelor sunt formate din 2 sau mai multe cuvinte separate intre ele prin
caracterul "." (punct). Pentru a putea folosi o clasa
predefinita ar trebui sa-i specificam numele complet, adica:
nume_pachet.nume_clasa
Intrucat acest lucru ar fi incomod, avem la dispozitie clauza import prin care putem specifica faptul ca dorim sa utilizam clase dintr-un anumit pachet. Clauza import poate avea una din urmatoarele forme:
import nume_pachet.nume_clasa;
daca dorim sa utilizam doar o anumita clasa din pachet, sau:
import nume_pachet.*;
daca dorim sa utilizam toate clasele din pachetul respectiv. Aceasta din urma forma este cel mai des utilizata, fiind mai comoda (daca am utiliza prima forma, pentru fiecare clasa predefinita necesara in program ar trebui sa avem cate o clauza import separata).
In biblioteca Java exista un pachet special, numit java.lang care grupeaza clase fundamentale, fara de care practic nu am putea scrie vreo aplicatie. Pentru a folosi clasele din acest pachet NU avem nevoie de clauza import, ea fiind subinteleasa implicit. Clasa String este un exemplu de clasa aflata in pachetul java.lang.
Trebuie sa spunem ca o documentatie API ne da informatii despre: pachetele din biblioteca, clasele din fiecare pachet si componenta fiecarei clase.
Alte informatii |
Tema |
1. Rulati exemplele din modul. Vizitati resursele propuse la Alte informatii.
Pentru neclaritati si comentarii sau probleme in "punerea in functiune" a mediului Java, intrati in conferinta Software Consulting.
2. Folosind exemplele din acest material, incercati sa scrieti programe Java care sa realizeze: afisarea numelui vostru, a varstei si a adresei. O prima varianta de program va presupune ca aceste informatii sa fie date direct in instructiunea de afisare, apoi incercati sa scrieti variante in care informatiile se dau ca argumente in linia de comanda, la lansarea in executie.
Observatie: daca un argument din linia de comanda trebuie sa contina si spatii (de exemplu in cazul adresei), argumentul respectiv se va incadra intre ghilimele ("). In caz contrar, el va fi interpretat ca fiind mai multe argumente.
Programele din acest material, impreuna cu cele scrise de voi se vor compila si executa folosind mediul de dezvoltare SDK. In pagina Desfasurare vi se indica legaturi spre site-urile de unde se poate descarca acest mediu.
|