Documente Academic
Documente Profesional
Documente Cultură
Laboratorul 1
Introducere – Utilitare şi mediul de execuţie
1. Regulament de disciplină
Prezenţa la orele de laborator este obligatorie.
Studenţii sunt obligaţi să respecte orarul laboratorului, grupele/semigrupele din care fac
parte.
Recuperarea orelor de laborator se face în conformitate cu regulamentul universităţii.
În urma activităţilor de laborator, fiecare student va fi evaluat. Nota minimă de trecere
este 5. Studenţii cu situaţia neîncheiată sau cu nota sub 5 nu vor putea susţine examenul de
disciplină.
2. Obiectivele laboratorului
prezentarea obligaţiilor ce revin studenţilor pentru a putea susţine examenul de disciplină;
prezentarea uneltelor necesare pentru orele de laborator ale disciplinei Sisteme de Timp
Real;
scurtă recapitulare ale unor noţiuni fundamentale ale limbajului de programare Java.
În prima parte a laboratorului se vor dezvolta aplicaţii Java folosind Java 2 SE 1.6
(J2SE). Pentru a putea scrie prima aplicaţie Java, primul pas este descărcarea şi instalarea
kitului de dezvoltare Java. Paşii ce trebuiesc urmaţi sunt următorii:
După descărcarea JDK-ului (Java Development Kit), instalarea se realizează prin simpla
execuţie a fişierului executabil.
Teoretic după instalarea J2SE pot fi construite, compilate şi rulate aplicaţii Java fără a
mai fi nevoie de alte unelte suplimentare. Pentru aceasta trebuiesc realizaţi următorii paşi:
PAS 1. Editare fişier sursă şi salvarea acestuia cu extensia .java (folosind Notepad, de
exemplu).
1
Introducere – Utilitare şi mediul de execuţie
Dezvoltarea de aplicaţii complexe Java, care de obicei conţin mai multe fişiere sursă,
poate deveni foarte dificilă în condiţiile utilizării unui editor de text simplu. Este recomandat
ca programatorul să îşi aleagă şi să îşi instaleze pe lângă platforma J2SE, o aplicaţie care să îl
ajute în dezvoltarea aplicaţiilor. O astfel de aplicaţie poartă numele de IDE (Integrated
Development Environment). În prezent, există pe piaţă o mare varietate de medii de dezvoltare
dintre care programatorul poate să aleagă. Câteva exemple sunt:
- Borland Jbuilder www.borland.com/jbuilder;
- Java CodeGuide www.omnicore.com ;
- JCreator www.jcreator.com;
- NetBeand www.netbeans.org;
- Eclipse www.eclipse.org;
- IntelliJ IDEA www.jetbrains.com;
- etc.
Observaţie:
Instalarea unor unelte suplimentare, necesare dezvoltării aplicaţiilor Java de timp-real,
va fi prezentată în cadrul Laboratorului 8.
2
Laboratorul 1
În urma compilării unui program Java rezultă un set de fişiere speciale numite cod de
octeţi (eng. byte code). Aceste fişiere nu sunt executabile pe nici un sistem de operare. Pentru
a putea fi rulate este nevoie de o Maşină Virtuală Java care va interpreta codul de octeţi şi va
executa instrucţiuni specifice sistemului de operare pe care rulează. In acest fel se asigură
independenţa faţă de platformă şi portabilitatea aplicaţiilor Java.
- Runtime Data Area – zona în care sunt memorate componente necesare pe parcursul
rulării unui program. În această zonă sunt stocate clasele încărcate, obiectele
construite, informaţii despre apelul metodelor, parametrii variabilelor, valorile
returnate de metode, date despre firele de execuţie etc.
3
Introducere – Utilitare şi mediul de execuţie
Observaţie:
Deşi mecanismul GC asigură eliberarea memoriei de obiectele care nu mai sunt
referite, există pericolul ca un program prost gândit şi implementat să aibă probleme de
alocare a memoriei şi să se ajungă la situaţia de depăşire a memoriei, fapt care duce la
întreruperea programului. Acest lucru se poate întâmpla deoarece GC şterge din zona Heap
doar acele obiectele care nu sunt referite de către nici o variabilă.
Deşi nu se poate şti în avans exact momentul în care un obiect este eliberat din
memorie, obiectele care urmează să fie şterse sunt anunţate prin apelarea metodei finalize().
Metoda finalize() se regăseşte în cadrul oricărui obiect Java (fiind moştenită din cadrul clasei
de bază Object) şi este apelată de către GC în momentul în care obiectul urmează să fie şters.
În Secvenţa de cod 1 este prezentat un program care demonstrează faptul că la
eliberarea fiecărui obiect din memorie este apelată metoda finalize() a acestuia.
Observaţie:
Intrarea în acţiune a GC şi eliberarea memoriei de obiecte (deci implicit apelarea
metodei finalize() ) nu este garantată de către Maşina Virtuală Java. Ca urmare a acestui fapt,
toate operaţiile de eliberarea de resurse care trebuiesc realizate în cadrul unei aplicaţii (de
exemplu închiderea unor conexiuni de reţea, unor fişiere, închiderea unor conexiuni la baze de
date etc.) trebuie să fie realizate de către programator în mod manual prin construirea unor
metode care sunt apelate în mod explicit la momentul potrivit.
4
Laboratorul 1
Secvenţa de cod 1
public class GarbageCollectorTest {
static int removedObjects;
Car(String name) {
this.name = name;
}
5.4.3. Identificatorii
Sunt secvenţe nelimitate de litere şi cifre Unicode, începând cu o literă. Identificatorii
nu au voie să fie identici cu alte cuvinte rezervate.
5
Introducere – Utilitare şi mediul de execuţie
- Literali flotanţi:
Pentru ca un literal să fie considerat flotant el trebuie să aibă cel puţin o zecimală după
virgulă, să fie în notaţie exponenţială sau să aibă sufixul F sau f pentru valorile normale
(reprezentate pe 32 biţi), respectiv D sau d pentru valorile duble (reprezentate pe 64 biţi).
- Literali logici:
o true : valoarea booleană de adevăr;
o false : valoarea booleană de fals.
Spre deosebire de C++, literalii întregi 1 şi 0 nu au rolul de adevărat şi fals.
- Literali caracter:
Un literal de tip caracter este utilizat pentru a exprima caracterele codului Unicode.
Reprezentarea se face fie folosind o literă, fie o secvenţă escape scrisă între apostrofuri.
Secvenţele escape permit reprezentarea caracterelor care nu au reprezentare grafică şi
reprezentarea unor caractere speciale precum “backslash“, caracterul apostrof etc. Secvenţe
escape predefinite în Java sunt prezentate în Tabelul 1.
5.4.5. Separatori
Un separator este un caracter care indică sfârşitul unei unităţi lexicale şi începutul
alteia. În Java separatorii sunt următorii: ( ) { } [ ] ; , . Instrucţiunile unui program se separă
cu punct şi virgulă.
6
Laboratorul 1
5.4.6. Operatori
atribuirea: =
operatori matematici: +, -, *, /, %
Exemplu:
x++, ++x, n--, --n.
Observaţie:
Evaluarea expresiilor logice se face prin metoda scurtcircuitului, evaluarea se opreşte în
momentul în care valoarea de adevăr a expresiei este sigur determinată.
5.4.7. Comentarii
În Java există trei feluri de comentarii:
comentarii pe mai multe linii, închise între /* şi */.
comentarii pe mai multe linii care ţin de documentaţie, închise între /** şi */. Textul
dintre cele două secvenţe este automat mutat în documentaţia aplicaţiei de către
generatorul automat de documentaţie javadoc.
comentarii pe o singură linie care încep cu //.
Observaţii:
1. nu putem să scriem comentarii în interiorul altor comentarii.
2. nu putem introduce comentarii în interiorul literalilor caracter sau şir de caractere.
3. secvenţele /* şi */ pot să apară pe o linie după secvenţa // dar îşi pierd semnificaţia; la
fel se întâmplă cu secvenţa // în comentarii care încep cu /* sau /**.
7
Introducere – Utilitare şi mediul de execuţie
clase (obiecte). În principiu acest lucru este adevărat, însă, pentru uşurinţa programării, mai
există şi tipurile primitive de date, care sunt cele uzuale :
aritmetice
o întregi: byte (1 octet), short (2), int (4), long (8)
o reale: float (4 octeţi), double (8)
caracter : char (2 octeţi)
logic : boolean (true şi false)
5.6. Variabile
Variabilele pot avea ca tip fie un tip primitiv de dată, fie o referinţă la un obiect.
Convenţia de notare a variabilelor în Java este dată de următoarele criterii:
1. variabilele finale (constantele) se scriu cu majuscule;
2. variabilele normale se scriu astfel: prima literă este mică; dacă numele variabilei este
format din mai mulţi atomi lexicali, atunci primele litere ale celorlalţi atomi se scriu cu
majuscule, de exemplu:
final double PI = 3.14;
int valoare = 100;
long numarElemente = 12345678L;
String bauturaMeaPreferata = "apa";
Observaţie:
Variabilele declarate într-un for pentru controlul ciclului, rămân locale corpului
ciclului.
Spre deosebire de C++ nu este permisă ascunderea unei variabile:
int x = 12;
{
int x = 96; // ilegal
}
8
Laboratorul 1
9
Introducere – Utilitare şi mediul de execuţie
Secvenţa de cod 2
int i = 0;
eticheta: while (i < 10) {
System.out.println("i=" + i);
int j = 0;
while (j < 10) {
j++;
if (j == 5)
continue eticheta;
if (j == 7)
break eticheta;
System.out.println("j=" + j);
}
i++;
}
5.8. Vectori
Declararea vectorului se face astfel:
Tip[ ] numeVector; sau
Tip numeVector[ ];
Exemplu:
int[ ] intregi;
String adrese[ ];
Exemplu:
int v[] = new int[10]; // se alocă spaţiu pentru 10 întregi
String[] adrese = new String[100];
După declararea unui vector, acesta poate fi iniţializat, adică elementele sale pot primi
nişte valori iniţiale, evident dacă este cazul pentru aşa ceva. In acest caz instanţierea lipseşte,
alocarea memoriei făcându-se automat în funcţie de numărul de elemente cu care se
iniţializează vectorul.
Exemplu:
String culori[ ] = {"Rosu", "Galben", "Verde"};
int [ ]factorial = {1, 1, 2, 6, 24, 120};
Primul indice al unui vector este 0, deci poziţiile unui vector cu n elemente vor fi
cuprinse între 0 şi n-1.
Nu sunt permise construcţii de genul Tip numeVector[dimensiune], alocarea memoriei
făcându-se doar prin intermediul operatorului new.
În Java tablourile multidimensionale sunt de fapt vectori de vectori.
Exemplu:
int m[][]; // declararea unei matrici
m = new int[5][10]; // cu 5 linii, 10 coloane
int l[] = m[1]; // m[1] este un vector cu 10 elemente
Exemplu:
int []a = new int[5];
int la = a.length; //are valoarea 5
int m[][] = new int[5][10];
int lm = m[0].length; //are valoarea 10
Copierea unui vector într-un alt vector se face cu ajutorul metodei System.arraycopy():
Exemplu:
int x[] = {1, 2, 3, 4};
int y[] = new int[4];
System.arraycopy(x,0,y,0,x.length);
11
Introducere – Utilitare şi mediul de execuţie
6. Verificarea cunoştinţelor
1. Se dau două numere complexe: 2+5i şi 4-i. Să se realizeze o aplicaţie care calculează suma
respectiv produsul celor două numere, să se verifice rezultatul.
12
Capitolul 1