0% au considerat acest document util (0 voturi)
232 vizualizări

Antrenament Java

Documentul prezintă introducerea în programarea Java, inclusiv compilarea și interpretarea codului Java, crearea unei aplicații Hello World, obiectele și clasele din Java, metodele toString(), equals() și hashCode(). De asemenea, oferă sugestii și antrenament pentru examen.

Încărcat de

Cezara Cocoi
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
232 vizualizări

Antrenament Java

Documentul prezintă introducerea în programarea Java, inclusiv compilarea și interpretarea codului Java, crearea unei aplicații Hello World, obiectele și clasele din Java, metodele toString(), equals() și hashCode(). De asemenea, oferă sugestii și antrenament pentru examen.

Încărcat de

Cezara Cocoi
Drepturi de autor
© © All Rights Reserved
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 27

LABORATOR 1-Introducere n Java

Limbajul Java - compilat i interpretat


Compilare: Un compilator traduce codul scris ntr-un limbaj de programare n alt limbaj de programare (de obicei, se
genereaz cod main din cod surs).
Interpretare: Un interpretor execut codul surs pas cu pas, neavnd loc neaprat o traducere prealabil.
Limbajul Java - Compilare i interpretare: Codul scris n Java (fiiere .java) este compilat i transformat n bytecode
(fiiere .class). Acest bytecode este interpretat i executat de maina virtual Java.
Bytecode-ul generat de ctre compilatorul Java este independent de platform. Maina virtual este cea care depinde de
platforma pe care ruleaz. De aici rezult i portabilitatea aplicaiilor scrise n limbajul Java - este necesar doar instalarea
mainii virtuale care tie s interpreteze i s execute bytecode-ul pe platforma dorit.

Crearea unei aplicaii de tip Hello World
nainte de a scrie prima voastr aplicaie n Java, trebuie s inei cont de urmtoarele aspecte:
1. Orice clas public trebuie scris n fiierul su propriu, care i poart numele. Nu este permis declararea mai
multor clase publice n acelai fiier.
2. Execuia programului pornete de la o metod "main" care trebuie s aib urmtoarea signatur:
public static void main(String args[]);
3. Argumentele primite n linia de comand sunt preluate n parametrul args, ncepnd cu poziia 0, nu 1, precum n
C/C++.
Astfel, am putea crea urmtoarea clas HelloWorld n fiierul "HelloWorld.java":
// HelloWorld.java
// ---------------

public class HelloWorld {
public static void main(String args[]) {
if(args.length > 0)
System.out.println("Hello, " + args[0] + "!");
else
System.out.println("Hello, world!");
}
}

Compilare n linia de comand
javac HelloWorld.java
Fiierul va fi transformat n "HelloWorld.class".

Execuie n linia de comand
java HelloWorld
java HelloWorld Vasile
Bytecode-ul din fiierul "HelloWorld.class" va fi interpretat i executat de ctre maina virtual. Rezultatele celor dou
execuii vor fi "Hello, world!", respectiv "Hello, Vasile!".

Tips & Tricks - Laboratorul 1
1. Folosii cu ncredere documentaia pentru a gsi clasele de care avei nevoie i ce metode pun la dispoziie
acestea.
2. Inspectai clasa System. Observai cmpurile statice err, in i out. Scrierea n err i n out se face folosind
metodele puse la dispoziie de clasa PrintStream (uzual, print() i println()).
3. Pentru a gsi o modalitate de a transforma un ir de caractere n ntreg, inspectai metodele statice ale clasei
Integer.
4. O idee pentru numrarea zecimalelor v-ar putea veni dac aruncai o privire asupra metodei toString() din clasa
Double. Soluii ceva mai frumoase ar fi cele care folosesc DecimalFormat sau BigDecimal.
5. Atunci cnd facei operaii cu iruri de caractere (de cele mai multe ori, concatenarea), pentru fiecare astfel de
operaie se creeaz un obiect nou i se realoc memorie. Din acest motiv, instanele clasei String intr n categoria
de obiecte "immutable". Pentru ca operaiile s se realizeze asupra aceleiai instane, folosii clasa StringBuilder.
6. Exist o metod cu acelai nume att n clasa String, ct i n clasa StringBuilder, care v permite s accesai
caracterul de la o anumit poziie.
7. Pentru colecii, una din clasele pe care le putei folosi este ArrayList. Pentru sortarea unei liste, gsii o metod
folositoare n clasa Collections.

Antrenament examen
1. Care dintre urmtoarele atribuiri sunt greite din punct de vedere sintactic (vor provoca eroare la compilare) ?
a. byte a = 128;
b. short b = 128 * 129;
c. long c = 0xC;
d. double d = (float) 10E2;
Compilatorul i d seama c 128 este prea mare pentru a fi reinut ntr-un byte. Dar nu face calculul efectiv 128 *
129 pentru verifica dac poate fi reinut ntr-un short.

2. Care dintre urmtoarele instruciuni de import sunt greite din punct de vedere sintactic ?
a. import java.lang.Object;
b. import java.*;
c. import package java.awt;
d. import static java.sql.Types.*;

3. Este corect secvena de mai jos? Dac da, care va fi rezultatul afiat? Motivai rspunsul.
String s1 = Integer.parseInt(1);
String s2 = Integer.parseInt(2);
System.out.println((s1+s2) == new String("12"));

Secvena este greit i va produce eroare la compilare deoarece metoda parseInt() trebuie s primeasc un String
i returneaz un int - invers fa de cum este scris.

4. Declarai i instaniai o matrice M, cu trei linii i dou coloane, cu elementele M(i, j)=10*i+j, ntr-o singur
instruciune, fr a folosi structuri repetitive.
int M[][] = {{0, 1}, {10, 11}, {20, 21}};
sau
int M[][] = new int[][] {{0, 1}, {10, 11}, {20, 21}};

5. Care dintre urmtoarele variante nu este corect?
a. Float a[] = new Float[10];
b. Byte b[10] = new Byte[];
c. Integer c[] = {10, 20};
d. String d[] = {'x', 'y', 'z'};


6. Ce va afia secvena de mai jos?
int a,b;
for (a = 10, b = 1; a-- > ++b ; ) ;
System.out.println((a--) + "," + (++b));
a. 4,5
b. 5,6
c. 5,7
d. 6,7

7. Care dintre urmtoarele variante nu este corect?
a. char []a = {"1", "2"};
b. double b[4] = new double[];
c. int c[][] = {{1, 2}, {3, 4}};

8. Ce va afia la execuie programul alturat?
public class Asignare {
public static void main(String args[]) {
int a = 3;
int b = (a = 2) * a;
int c = b * (b = 5);
System.out.println("a = " + a + ", b = " + b + ", c = " + c);
}
}
a = 2, b = 5, c = 20

9. Ce se poate spune despre subprogramul Java alturat?
int i = 1, suma = 0;
for ( ; ; ) {
suma += i++;
if (i > 5) break;
}
System.out.print(suma);
a. Eroare la compilare: lipsesc prile componente ale lui for
b. Subprogramul se compileaz i la execuie afieaz 0
c. Subprogramul se compileaz i la execuie afieaz 10
d. Subprogramul se compileaz i la execuie afieaz 15

10. Care vor fi valorile variabilelor a, b i c dup execuia secvenei de mai jos?
int a = 0, b = 1, c = (++a >= b-- ? a ++ : ++b);
a. a=2, b=1, c=1
b. a=1, b=0, c=1
c. a=2, b=1, c=0
d. a=2, b=0, c=1

LABORATOR 2: Obiecte i clase

Formatarea codului
ncepnd cu acest laborator, trebuie s respectai conveniile de scriere a codului pentru limbajul Java. Altfel,
nerespectarea lor va atrage o penalizare de 0.5 la punctajul temei.
Code conventions are important to programmers for a number of reasons:
80% of the lifetime cost of a piece of software goes to maintenance.
Hardly any software is maintained for its whole life by the original author.
Code conventions improve the readability of the software, allowing engineers to understand new code more
quickly and thoroughly.
If you ship your source code as a product, you need to make sure it is as well packaged and clean as any other
product you create.

Generare javadoc
ncepnd cu acest laborator, trebuie s documentai codul scris pentru cel puin una dintre problemele aferente fiecrui
laborator. Nerespectarea acestei cerine va atrage o penalizare de 0.5 la punctajul temei.
n acest scop, trebuie s adugai comentarii de forma /** */ deasupra claselor, metodelor, cmpurilor. Consultai regulile
de scriere a acestor comentarii. Utilitarul javadoc le va putea interpreta i transforma n fiiere .html cu aceeai form ca i
documentaia limbajului Java.
Generarea documentaiei cu utilitarul javadoc:
NetBeans: Click dreapta proiect -> Generate Javadoc
Eclipse: Project -> Generate Javadoc
IntelliJ IDEA: Tools -> Generate JavaDoc

Metodele toString(), equals(), hashCode()
Rdcina ierarhiei de clase din limbajul Java este clasa Object. Printre metodele acestei clase se numr i toString(),
equals(), hashCode(). Printre cerinele laboratorului se numr i suprascrierea acestor metode n clasele create de voi.
Consultai documentaia pentru a nelege scopul lor.
Descrierea metodelor:
toString()
equals()
hashCode()
n Java, operatorul "==" poate fi folosit corect doar la compararea tipurilor primitive. Atunci cnd este folosit pentru
obiecte, el realizeaz doar compararea referinelor, nu a coninutului obiectului! Compararea corect a dou obiecte se
face doar cu ajutorul metodei equals().
Analizai i discutai output-ul urmtoarei secvene de cod:
String s1 = "abcd";
String s2 = "abcd";

String abc = "abc";
String s3 = abc + "d";

System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));

int int1 = 10;
int int2 = 10;

System.out.println(int1 == int2);

Integer i1 = new Integer(10);
Integer i2 = new Integer(10);

System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
Vezi i Save Memory by Using String Intern in Java.

Tips & Tricks - Laborator 2
1. n limbajul Java nu exist posibilitatea de a suprancrca operatori. Creai metode proprii pentru realizarea
operaiilor cerute.
2. Folosii ct mai mult facilitatea de generare de cod pe care o pune la dispoziie IDE-ul folosit, n special pentru
constructori, getter-i i setter-i, toString(), equals() i hashCode().
3. Consultai cteva sugestii pentru reprezentarea matricilor rare. O implementare frumoas i eficient va primi
bonus generos :)
4. Gndii-v la abloane de proiectare i algoritmi pentru grafuri care v-ar putea uura munca la cea de-a doua
problem. Putei primi bonus i pentru folosirea acestora.

Antrenament examen
1. Care afirmaii legate de metoda hashCode() a clasei Object sunt false?
a. Trebuie s returneze un numr ntreg;
b. Trebuie s returneze numere diferite pentru obiecte diferite;
c. Nu poate fi supradefinit;
d. Nu poate fi suprancrcat.

2. Care afirmaii legate de metoda equals() a clasei Object sunt false?
a. Trebuie obligatoriu corelat cu metoda hashCode();
b. Trebuie obligatoriu supradefinit;
c. Metoda accept orice obiect ca argument;
d. Metoda poate fi aplicat pentru tablouri cu valori primitive.

3. Ce se va ntmpla la ncercarea de a compila fiierul Test.java, descris mai jos?
class A extends Object {}

class B extends A {
private class C extends B {}
}
1. Nu va fi compilat deoarece... (completai)
2. Va fi compilat i vor fi create unitile de compilare... (completai)
A.class, B.class, B$C.class

4. Ce se va ntmpla la ncercarea de a compila fiierul Test.java, descris mai jos?
public class A { static int A = 1; }

class B extends A {
B() { A = 2; }
}
Eroare la compilare. V las pe voi s descoperii de ce :)

5. Explicai pe scurt cum poate fi implementat ablonul de proiectare Immutable Object i dai un exemplu din API-
ul standard Java.
Cmpuri private, iniializate doar din constructor. Se expun doar getter-i, nu i setter-i. Dac se implementeaz
operaii, aceastea ar trebui s creeze o nou instan i s o returneze, nu s modifice instana curent.
Exemplu din API-ul standard Java: String.

6. Ce putei spune despre programul de mai jos?
class A {
A(int x) { System.out.println("apel constructor A"); } }

class B extends A {
B() { System.out.println("apel constructor B"); } }

public class C {
public static void main(String args[]) { B b = new B(); } }
a.Nu va fi compilat;
b.Va afia "apel constructor B";
c.Va afia "apel constructor A";
d.Va afia "apel constructor B" i apoi "apel constructor A";

7. Ce semnificaie are cuvntul cheie super folosit ca metod?
a.Apeleaz constructorul corespunztor ca numr de argumente al clasei;
b.Apeleaz constructorul corespunztor ca numr de argumente al superclasei;
c.Face referire la variabilele de instan ale superclasei;
d.Cuvtntul cheie super nu poate fi folosit ca metod.

8. Ce putei spune despre programul alturat?
class C1 {
static String f() { return "Mesajul Unu din C1"; }
String g() { return "Mesajul Doi din C1"; }
}

class C2 extends C1 {
static String f() { return "Mesajul Unu din C2"; }
String g() { return "Mesajul Doi din C2"; }
}

public class Test {
public static void main(String args[]) {
C1 obiect = new C2();
System.out.println(obiect.f() + ", " + obiect.g());
}
}
a.programul este corect i va afia la execuie: Mesajul Unu din C1, Mesajul Doi din C1
b.programul este corect i va afia la execuie: Mesajul Unu din C1, Mesajul Doi din C2
c.programul este corect i va afia la execuie: Mesajul Unu din C2, Mesajul Doi din C1
d.programul este corect i va afia la execuie: Mesajul Unu din C2, Mesajul Doi din C2
e.va aprea eroare la compilare deoarece n clasa Test variabila obiect nu aparine clasei C2

9. Ce putei spune despre prgramul alturat?
class C1 {
int x = 1;
void f(int x) { this.x = x; }
int getX_C1() { return x; }
}

class C2 extends C1 {
float x = 5.0f;
int f(int x) { super.f((int)x); }
float getX_C2() { return x; }
}

public class SuprascriereSiAscundere {
public static void main(String args[]) {
C2 obiect = new C2();
obiect.f(4);
System.out.print(obiect.getX_C2() + " ");
System.out.println(obiect.getX_C1());
}
}
1. programul este corect i va afia la execuie: 5 4
2. programul este corect i va afia la execuie: 5.0 4
3. programul este corect i va afia la execuie: 4.0 4
4. va aprea eroare la compilare deoarece n clasa C2 s-a suprascris greit atributul x din clasa C1
5. va aprea eroare la compilare deoarece metoda suprascris f() din clasa C2 ntoarce un tip
diferit de void

10. Ce va afia la execuie aplicaia CtorDemo?
class A{
int a=1;
A() { a=2; }
}

class B extends A {
int b=3;
B() { b=a; }
}

public class CtorDemo {
public static void main(String args[]) {
B bobj = new B();
System.out.println(bobj.b);
}
}
a.1
b.2
c.3
d.Nu se va afia nimic deoarece codul este incorect

LABORATOR 3: Excepii. Fluxuri (intrri/ieiri)

Excepii
Generarea unei excepii:
throw new Exception("mesaj");
Declararea c o metod poate genera o excepie:
public void metoda() throws IOException {
// Cod care ar putea genera IOException
}
Tratarea unei excepii:
try {
// Cod care ar putea genera excepii
} catch (Exception ex) {
// Cod pentru tratarea excepiei
} finally {
// Cod care se execut indiferent dac apar excepii sau nu
}
Rdcina excepiilor i erorilor din Java este clasa Throwable. Doar instanele acestei clase sau ale subclaselor sale pot fi
generate de maina virtual Java sau prin interemdiul instruciunii throw. De asemenea, doar aceast clas sau o subclas
a sa poate fi tipul unui argument din clauza catch.

Figura 1. Ierarhia excepiilor
Checked vs. unchecked:
Checked exceptions - Sunt detectate la compilare, motenesc clasele Throwable sau Exception, cu excepia clasei
RuntimeException. Trebuie obligatoriu tratate (try-catch) sau declarate ca putnd fi generate de metoda respectiv
(throws).
Exemple: FileNotFoundException, MalformedURLException, ClassNotFoundException.
Unchecked exceptions - Sunt detectate la execuie, motenesc clasele Error sau RuntimeException. Tratarea lor
este posibil, dar nu este obligatorie.
Exemple: NullPointerException, ArrayIndexOutOfBoundsException; OutOfMemoryError, StackOverflowError.
Eroare vs. excepie:
Excepie - Surprinde apariia unei situaii n care aplicaia nu i-ar mai putea continua execuia n modul dorit,
ns i poate reveni din aceast situaie. Spre exemplu, dorim s scriem ntr-un fiier, dar acesta nu exist. Nu este
un motiv rezonabil pentru ca aplicaia s fie oprit. O aplicaie bine construit ar trebui s i poat reveni i
continua execuia n astfel de situaii, deci cazurile de excepie ar trebui tratate.
Eroare - Surprinde apariia unei situaii n care aplicaia nu i mai poate continua execuia, iar revenirea din
aceast situaie nu este posibil i nici indicat. Spre exemplu, n cazul unei erori de tipul OutOfMemoryError,
aplicaia ar trebui s fie oprit. Din acest motiv, erorile nu trebuie tratate.

Fluxuri
n vrful ierarhiei pentru operaii de I/O stau patru clase abstracte:
InputStream, OutputStream - Pentru lucrul cu fluxuri de octei (8 bii).
Reader, Writer - Pentru lucrul cu fluxuri de caractere (16 bii);
Toate clasele existente pentru lucrul cu fluxuri, fie c e vorba de fluxuri primitive sau de procesare, motenesc una din
aceste patru clase abstracte. Pentru mai multe detalii, vezi cursul sau documentaia.

Figura 2. Vrful ierarhiei I/O
Funcionalitatea de baz pentru un flux de intrare sau ieire este citirea, respectiv scrierea unor date. Metodele abstracte de
citire sau scriere sunt menite s lucreze la cel mai de jos nivel cu un flux nestructurat.

Figura 3. Funcionalitatea de baz pentru fluxuri input/output
Implementrile concrete ale celor patru clase amintite mai sus servesc pentru diverse scopuri: citire din fiier, citire din
memorie, citire buffer-izat, conversii, serializare etc. Din nou, pentru mai multe detalii, vezi cursul sau documentaia.
Diferenierea ntre fluxuri primitive i fluxuri de procesare se face prin intermediul constructorului. Cele primitive
primesc ca parametru un dispozitiv extern (e.g. un nume de fiier). Cele de procesare primesc ca parametru un alt flux, de
acelai tip.
De cele mai multe ori, funcionalitatea pe care o dorim necesit combinarea mai multor clase dintre cele care
implementeaz InputStream/OutputStream sau Reader/Writer. Acest lucru este posibil datorit ablonului de proiectare
Decorator, folosit in implementarea acestor clase (i.e. faptul c un flux poate fi construit pornind de la alt flux de acelai
tip este un indicator al folosirii acestui ablon de proiectare).

Figura 4. Fluxuri input/output decorate
Exemplul 1. Dorim s citim un fiier linie cu linie n mod buffer-izat. Avem nevoie de:
O instan FileReader - flux primar care permite citirea dintr-un fiier;
O instan BufferedReader - flux de procesare care permite citirea buffer-izat dintr-un Reader.
FileReader fr = new FileReader("fisier.txt");
BufferedReader br = new BufferedReader(fr);

String line = br.readLine();
while(line != null) {
System.out.println(line);
line = br.readLine();
}
br.close();
Exemplul 2. Dorim s scriem ntr-un fiier diverse tipuri primitive n mod buffer-izat.
O instan FileOutputStream - flux primar care permite scrierea ntr-un fiier;
O instan BufferedOutputStream - flux de procesare care permite scrierea buffer-izat dintr-un OutputStream.
O instan DataOutputStream - flux de procesare care permite scrierea tipurilor primitive ntr-un OutputStream;
FileOutputStream fos = new FileOutputStream("out");
BufferedOutputStream bos = new BufferedOutputStream(fos);
DataOutputStream dos = new DataOutputStream(bos);

dos.writeBoolean(true);
dos.writeDouble(3.1416);
dos.writeInt(1234);
dos.writeLong(123456789);
dos.close();
Not: Aceste exemple prezint doar nite variante de rezolvare. Putei gsi i alte metode pentru a realiza aceleai
funcionaliti.

Tips & Tricks - laborator 3
1. Pentru crearea rapoartelor, recomand Freemarker sau JasperReports | iReport. Pentru iReport, exist i un plug-in
pentru NetBeans.
2. Pentru mai multe detalii despre lucrul cu date calendaristice, consultai lecia Dates and Times din tutorialul Java.
3. Clasa File poate reprezenta att un fiier, ct i un director. Dintre metodele acestei clase, v-ar putea fi utile
isDirectory(), isFile(), list(). Uitai-v i la metodele statice din clasa Files. Pentru mai multe detalii despre lucrul
cu fiiere, consultai lecia File I/O (Featuring NIO.2), n special seciunea Listing a Directory's Contents.
4. Pentru a v uura munca la interpetarea comenzilor din shell, folosii-v de expresii regulate.

Antrenament examen
1. Care dintre urmtoarele variante nu este corect?
a. Writer a = new Writer("file.txt");
b. Writer b = new PrintWriter(new FileWriter("file.txt"));
c. Writer c = new FileWriter("file.txt");
d. BufferedWriter d = new BufferedWriter("file.txt");

2. Ce putei spune despre subprogramul alturat?
double x = 0;
if (Double.isInfinite(2 / x))
System.out.println("infinit");
else
System.out.println("2 / 0");
a. Eroare la compilare datorit mpririi la zero
b. Eroare la execuie datorit mpririi la zero (se arunc o excepie ArithmeticException)
c. Programul este corect i va afia: infinit
d. Programul este corect i va afia: NaN

3. Presupunem c avem un fragment de cod Java dintr-o aplicaie care are drept de scriere n directorul de lucru
curent i c n directorul curent nu exist fiierul numit "fisier.txt". Care va fi rezultatul compilrii i execuiei
codului alturat?
try {
RandomAccessFile f1 = new RandomAccessFile("fisier.txt", "rw");
BufferedOutputStream f2 = new BufferedOutputStream(f1);
DataOutputStream f3 = new DataOutputStream(f2);
f3.writeDouble(Math.PI);
f3.close();
f2.close();
f1.close();
} catch(IOException e) { }
a. Codul Java de mai sus nu se poate compila;
b. Codul Java de mai sus se poate compila, dar arunc o excepie la linia 3;
c. Codul Java de mai sus se poate compila i executa dar nu are nici un efect pe sistemul de fiiere local;
d. Codul Java de mai sus se poate compila i executa, crendu-se fiierul "fiier.txt" n directorul curent.

4. Ce se va ntmpla la execuia secvenei alturate?
int test = 0, infinit = 0;
try {
infinit = 1/0;
test ++;
}
catch(Exception e) { test ++; }
finally { test ++; }
System.out.println("test=" + test + " infinit=" + infinit);
a. Se va afia: test=2 infinit=NaN
b. Se va afia: test=2 infinit=0
c. Se va afia: test=1 infinit=0
d. Nu se va afia nimic, programul se va opri cu excepie


5. Ce se va afia la execuia urmtoarei secvene de cod:
RuntimeException a = new RuntimeException();
System.out.println(a.getClass().getSuperclass().getSuperclass());
a. class java.lang.Exception
b. class java.lang.Error
c. class java.lang.Throwable
d. class java.lang.Object

6. Fie codul de mai jos. Care este rezultatul execuiei lui?
File f1 = new File("numeDirector");
File f2 = new File(f1, "numeFisier");
a. eroare la compilare la linia 2, deoarece avem un apel recursiv nepermis
b. programul este corect i se creeaz n directorul curent un director cu numele numeDirector, iar n acest
director se creaz fiierul cu numele numeFisier
c. programul este corect i se creeaz n directorul curent un director cu numele numeDirector i fiierul cu
numele numeFisier.
d. programul este corect i se creeaz n directorul curent doar fiierul cu numele numeFisier
e. programul este corect, dar nu se creeaz nici un director i nici un fiier

7. Care dintre afirmaiile de mai jos sunt adevrate?
a. cnd se creeaz o instan a lui File i nu se folosete semantica de denumire a fiierelor de pe maina
local, atunci constructorul va arunca o excepie IOException
b. cnd se creeaz o instan a lui File i fiierul respectiv nu exist pe sistemul de fiiere local, atunci se
creeaz un astfel de fiier
c. cnd o instan a lui File este eliberat de garbage collector, atunci fiierul corespunztor de pe sistemul
local este ters
d. nici una dintre afirmaiile de mai sus nu este adevrat

8. Ce se va ntmpla la execuia urmtoarei secvene?
float a=0;
int b=0, test=0;
try {
a=1/a; test ++;
b=1/b; test ++;
}
catch(Exception e) { test ++; }
finally { test ++; }
System.out.println("test=" + test + " a=" + a + " b=" + b);
a. Nu se va afia nimic, prograul se va opri cu excepie
b. Se va afia: test=2 a=Infinity b=Infinity
c. Se va afia: test=3 a=Infinity b=0
d. Se va afia: test=4 a=0 b=0

9. Care dintre urmtoarele variante nu este corect?
a. FileWriter a = new FileWriter("file.txt");
b. Writer b = new PrintWriter(new FileWriter("file.txt"));
c. PrintWriter c = new PrintWriter("file.txt");
d. BufferedWriter d = new BufferedWriter("file.txt");

10. Care este superclasa tutor claselor ce descriu excepii sau erori n Java?
a. Throwable
b. Exception
c. RuntimeException
d. Error


LABORATOR 4: Interfee. Pachete. Serializarea obiectelor. Colecii
Discuii referitoare la curs
Interfee
Care sunt modificatorii implicii pentru atribute i metode cnd nu sunt specificai explicit de programator?
Care sunt relaiile care se pot stabili ntre mai multe interfee? Dar ntre clase i interfee?
Cum se poate implementa o metod de tip callback folosind interfee?
Ce sunt clasele anonime? Unde i cum le putem instania? Cum sunt compilate aceste clase?
Care este diferena ntre interfaa Compareable i interfaa Comparator?
Pachete
Cum evitm ambiguitile cnd dorim s folosim clase cu acelai nume din pachete diferite?
Ce este classpath i la ce folosete?
Serializarea obiectelor
Ce fluxuri sunt folosite la serializare?
Cum funcioneaz mecanismul implicit de serializare? Cum trebuie s fie toate atributele unei clase pentru a putea
fi serializat cu succes? Ce se ntmpl cu un obiect serializat la deserializare cnd i-am modificat clasa?
Cum funcioneaz modificatorul transient? Ce se ntmpl cu membrii privai ai unei clase la serializare?
Cum putem s ne implementm propriul mecanism de serializare?
Colecii
Cum se definesc tipurile i metodele generice? Cum se folosesc? Cum se pot delimita?
Ce legtur exist ntre MyType<A> i MyType<B>, dac A extinde B i MyType este un tip generic?
Cum arat ierarhia coleciilor n Java? Numii cteva implementri concrete.
Cum pot fi parcurse coleciile? Cum funcioneaz java.util.Collections.sort()?

Tips & Tricks - laborator 4
1. Doar cea de-a doua problem cere serializarea binar a obiectelor. n prima problem se va folosi n mod
obligatoriu formatul TGF (Trivial Graph Format).
2. Trimiterea ca argument a unei metode se va face precum n exemplul din curs (slide 10). Orice alt abordare nu va
fi punctat.
3. Pentru prima problem putei primi bonus att pentru elemente avansate de algoritmica grafurilor, ct i pentru
folosirea unei biblioteci de desenare a grafurilor (jgraph, jung, prefuse etc.).
4. La a doua problem nu uiai de fiierul de configurare care specific caracterele folosite pentru reprezentarea
tablei de joc si a pieselor. Acesta poate avea orice form dorii voi. Putei ncerca s folosii un fiier .properties.
5. Jocul Atari Go funcioneaz dup aceleai reguli ca i jocul de Go. Diferena (i simplitatea) const n faptul c
jocul de Atari Go este ctigat de cel care realizeaz prima captur.

Antrenament examen
1. O aplicaie de gestiune a studenilor unei universiti conine clasa Student i cte o structur de date
List<Student> studenti; cu studenii fiecrei faculti. Care din invocrile a) Arrays.sort(studenti) sau b)
Collections.sort(studenti) este corect i n ce condiii?
Clasa Student trebuie s implementeze interfaa Comparable i metoda compareTo().

2. n cadrul unei aplicaii dorii s utilizai o clas pentru lucru cu matrici rare cu numele
org.math.cool.SparseMatrix, clas aflat n arhiva coolmath.jar. Care sunt paii pe care trebuie s i facei pentru a
realiza acest lucru?
Se adaug arhiva n classpath. Pot fi menionai i paii specifici IDE-ului pe care il folosii.

3. O aplicaie se conecteaz la un serviciu Web de unde citete valorile cursurilor valutare la o anumit dat.
Declarai i instaniai, folosind tipuri generice, o colecie care s poat memora informaiile citite de la
respectivul serviciu Web.
HashMap<String, Double> map = new HashMap<String, Double>();

4. Ce putei spune despre programul alturat?
interface I1 {
int j = 3;
int [] i = { j + 1, j + 2};
}
interface I2 {
int j = 5;
int [] i = { j + 2, j + 4};
}
public class Test implements I1, I2 {
public static void main(String[] args) {
System.out.print(I1.j + " ");
System.out.print(I2.i[1] + " ");
System.out.print(I1.i[0]);
}
}
a. programul este corect i va afia la execuie: 3 9 4
b. va aprea eroare la compilare deoarece interfeele I1 i I2 conin declaraiile acelorai atribute
c. va aprea eroare la compilare deoarece n interfeele I1 i I2 atributul i conine referin la atributul j
d. va aprea eroare la compilare deoarece interfeele I1 i I2 conin declaraiile unui atribut de tip tablou
e. va aprea eroare la compilare deoarece atributele interfeelor I1 i I2 nu se pot accesa dintr-o metod
static

5. n ce condiii putem apela o metod de sortare polimorfic unei colecii formate din obiecte de acelai tip?
a. Metoda de sortare primete un argument de tip Comparator;
b. Este suficient supradefinirea metodei hashCode() n clasa care descrie obiectele;
c. Clasa care descrie obiectele implementeaz interfaa Comparable i metoda compareTo;
d. Apelul este posibil n orice situaie, fiind apelat metoda implicit equals() a clasei Object.

6. S considerm declaraiile alturate? Care dintre urmtoarele variante nu este corect?
class A{
static int x = 37;
transient int y = 47;
static void f() {
A aref = this;
int i = x;
int j = y;
g();
}
void g() { }
}
a. Declaraia lui aref
b. Declaraia lui i
c. Declaraia lui j
d. Apelul metodei g()

7. S considerm declaraiile alturate de clase i interfee. Care dintre acestea nu este corect?
interface Test { }
abstract class AbstractImpl implements Test { }
class TestImpl extends AbstractImpl { }
a. Test t = new Test();
b. TestImpl t = new AbstractImpl();
c. AbstractImpl t = new Test();
d. AbstractImpl t = new TestImpl();

8. Ce putei spune despre aplicaia TestImpl?
public class TestImpl {
public static void main(String[] args) {
HelloImpl h1 = new HelloImpl(), h2 = h1;
h1.message = "Salut";
System.out.println(h2.sayHello());
}
}
interface Hello {
String sayHello();
}
class HelloImpl implements Hello {
static String message = "Hello";
String sayHello() {
return message;
}
}
a. Va afia la execuie mesajul "Hello";
b. Va afia la execuie mesajul "Salut";
c. Se va opri cu o excepie de tipul NullPointerException;
d. Nu va fi compilat.

9. Ce nelegei prin serializare?
a. Scrierea unui obiect ntr-un fiier de unde s poat fi refcut ulterior;
b. Transformarea unui obiect ntr-un flux de octei;
c. Adugarea unui numr serial unui obiect pentru a putea fi deosebit de alte obiecte ale aceleiai clase, dar
din alte versiuni;
d. Transmiterea obiectelor prin reea.

10. Care dintre afirmaiile urmtoare referitoare la serializarea obiectelor nu este adevrat?
a. Pentru a fi serializabil o clas trebuie obligatoriu s implementeze una din interfeele Serializable sau
Externalizable;
b. Obiectele serializate pot fi scrise atat in fiiere, ct i n memorie;
c. Variabilele declarate cu modificatorii transient sau private nu particip la serializare.
d. Mecanismul implicit de serializare a obiectelor unei clase poate fi modificat;
e. Clasele ObjectInputStream i ObjectOutputStream permit i serializarea tipurilor primitive de date.

LABORATOR 5: Interfaa grafic cu utilizatorul
Swing
Swing este GUI widget toolkit-ul primar din Java, fcnd
parte din JFC (Java Foundation Classes)- un API pentru
realizarea de interfee grafice cu utilizatorul. Swing este
construit peste AWT (Abstract Window Toolkit), iar n
cadrul su se regsesc:
componente top level: JFrame, JDialog, JWindow
(derivate din java.awt.Window), JApplet (derivat din
java.awt.Panel);
alte componente, derivate din clasa JComponent.
Pentru mai multe informaii despre aceastea,
consultai tutorialul Java.

Figura 5. Ierarhia de clase din AWT i Swing
Pentru aranjarea componentelor n cadrul unui container se
folosesc gestionare de poziionare. Pentru a le nelege modul
de utilizare, consultai capitolele dedicate din cadrul
tutorialului. Printre cele mai utilizate sunt BorderLayout i
GridLayout.
Aciunile efectuate de utilizator asupra componentelor
interfeei grafice genereaz evenimente. Pentru a trata aceste
evenimente, trebuie s nregistrm un listener pentru acea
component (recunoatei ablonul de proiectare folosit?). Pentru explicaii detaliate, consultai capitolul Writing Event
Listeners din tutorialul Java.
Exerciiu
Identificai componentele i gestionarii de poziie utilizai n interfaa grafic de mai jos.

Figura 6. Anonymity Checker - Cristina erban, 2012. Meniul plasat deasupra

Figura 7. Anonymity Checker - Cristina erban, 2012. Meniul plasat in partea stng
Tips & Tricks - laborator 4
1. Pentru toate temele care cer interfa grafic putei folosi (n loc de Swing):
a. SWT - Principiile de funcionare sunt asemntoare. nvai conceptele din spate i folosii-v ct mai
puin de mediul grafic pus la dispoziie de Eclipse - codul generat, n general, are tendina s fie haotic.
b. JavaFX - Dei orientat mult spre grafic, ofer i o suit de controale pentru GUI.
2. nvai s creai elementele de interfa din cod, nu cu ajutorul mediului grafic de editare. NetBeans ofer un
astfel de mediu grafic, construit cumva peste Swing, dar codul generat n spate este foarte greoi de parcurs, iar
comportamentul nu este ntotdeauna cel dorit. nvai s creai componente, s le adugai n container-e, s
adugai listner-e, s implementai interfee ce descriu modele.
3. Pentru partea de criptare a rspunsurilor s-ar putea s v ajute Java Cryptography Architecture (JCA).
4. Pentru folosirea documentelor n format XML consultai Java API for XML Processing (JAXP).
5. Se mai poate primi bonus pentru GUI deosebit din punct de vedere al structurii, separare bine fcut ntre model
i view, utilizarea (corect i nu forat) a abloanelor de proiectare (design patterns).

Antrenament examen
1. Care va fi valoarea variabilei s dupa execuia blocului de instruciuni alturat?
int s = 0;
try {
java.awt.Point p[] = new java.awt.Point[10];
p[0].setLocation(-1, -1);
s += 1;
} catch(IllegalArgumentException e) { s += 2; }
catch(NullPointerException e) { s += 3; }
finally{ s += 4; }
a. 0
b. 1
c. 5
d. 6
e. 7

2. Ce se va ntmpla la compilarea fiierului Test.java ce conine clasele alturate?
class A {
double x = 0;
A(double x) { this. x = x; }
A(float x) { this. x = x; }
}

class B extends A {
double y = 0;
B(double x) {
y = 0;
super(x);
}
}
a. Compilarea va fi cu succes.
b. Compilarea va fi cu succes, dar la execuie instanierile obiectelor din clasa A pot provoca excepii.
c. Clasa B nu va fi compilat deoarece nu supradefinete ambii constructori.
d. Clasa B nu va fi compilat deoarece constructorul este definit greit.
e. Clasa A nu va fi compilat deoarece al doilea constructor este greit.

3. Care dintre afirmaiile urmtoare referitoare la colecii nu este adevrat?
a. Clasa TreeMap menine sortate elementele sale.
b. Singura modalitate de a parcurge o mulime de tip HashSet, fr a folosi alte structuri de date, este prin
intermediul iteratorilor.
c. Clasa Collection este superclasa tuturor claselor ce descriu colecii.
d. ntr-un obiect de tip HashMap, cheia i valoarea sunt de tip Object.
e. Orice colecie de elemente poate fi sortat folosind metoda sort() din clasa Collections.

4. Scriei metoda contains(Point p, Point p1, Point p2) care s testeze dac un punct p se gsete pe dreapta
determinat de punctele p1 i p2.
public static boolean contains(Point p, Point p1, Point p2) {
return p.getY() - p1.getY() ==
((p.getX() - p1.getX()) * (p2.getY() - p1.getY())) / (p2.getX() - p1.getX());
}

5. n urma compilrii fiierului Test.java a rezultat, pe lng fiierul Test.class, i fiierul Test$1.class. Care este
explicaia acestui fapt?
a. n fiierul Test.java mai exist o clas cu numele Test$1.
b. Clasa Test conine o subclas cu numele Test$1.
c. Clasa Test conine o clas intern static cu numele 1.
d. Clasa Test conine o clas anonim.
e. Test$1.class este un fiier temporar creat de ctre compilator.

6. Care dintre urmtoarele variante nu este corect?
a. Map a = new Map();
b. Map b = new HashMap();
c. SortedMap d = new HashMap();
d. SortedMap c = new TreeMap();

7. Ce se va ntmpla la compilarea fiierului Stiva.java ce conine clasele alturate?
class ExceptieStiva extends Exception {}

public class Stiva {
Object v[] = new Object[100];
int top = 0;
public void push(Object x) { v[top] = x; top++; }
public void pop() { if(top == 0) throw new ExceptieStiva(); top--; }
public Object top() { return v[top - 1]; }
}
a. Compilarea va fi cu succes i vor rezulta fiierele ExceptieStiva.class i Stiva.class.
b. Compilarea va fi cu succes, dar la execuie metodele push() i top() pot fi sursele unor excepii netratate.
c. Clasa ExceptieStiva nu va fi compilat deoarece nu supradefinete constructorul clasei Exception.
d. Clasa Stiva nu va fi compilat deoarece metodele push() i top() nu trateaz excepiile ce pot aprea.
e. Clasa Stiva nu va fi compilat deoarece metoda pop() este incorect definit.

8. n fiierul A.java sunt urmtoarele declaraii de clase i interfee:
interface X {}
interface Y {}
public class A implements X {}
public class B extends A implements X, Y {}
Care este motivul pentru care secvena de mai sus nu va fi compilat?
a. n Java nu exist motenire multipl.
b. Clasa B face o dubl implementare interfeelor.
c. n fiier exist dou clase publice.
d. Pentru a putea fi implementate, interfeele trebuie s fie publice.

9. Care va fi valoarea variabilei tip dup execuia secvenei alturate?
int c = (int) 'b';
String tip = "nimic";
switch(c) {
case 'a'-'z': tip = "litera";
case '0'-'9': tip = "cifra"; break;
default: tip = "altceva";
}
a. "litera"
b. "cifra"
c. "altceva"
d. "nimic"

10. Considerndu-se declaraia "public private int h;" s se precizeze care afirmaie este adevrat:
a. variabila h va fi accesat n mod public deoarece se ia n considerare primul modificator de acces.
b. variabila h va fi accesat n mod private deoarece se ia n considerare ultimul modificator de acces.
c. va fi eroare la compilare deoarece o variabil nu poate fi n acelai timp accesat public i private.

LABORATOR 6: Desenarea (Java 2D). JavaFX
Java 2D
Majoritatea aspectelor legate de Java 2D API v-au fost explicate la curs. Pentru ceva mai multe detalii, consultai
tutorialul referitor la Java 2D API. Cteva aspecte de interes legate de desenare sunt surprinse n capitolele Drawing
Geometric Primitives, Stroking and Filling Graphics Primitives i Working with Images.
Ca suport pentru desenare, vei utiliza clasa Canvas (de obicei, o clas derivat din aceasta). Desenarea efectiv se va face
n metoda paint(), pe care o suprascriei. Pentru a folosi Java 2D, facei cast de la obiectul de tip Graphics primit ca
parametru la un obiect de tip Graphics2D. Acest obiect reprezint contextul de desenare.
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
// ...
}
Flickering. Double buffering
Metoda update() reactualizeaz suprafaa de desenare i este aplet n urma apelului metodei repaint(). Problema care
apare este c n metoda update(), suprafaa de desenare este tears i apoi redesenat, cauznd apariia unui efect de
"flickering". Soluia pentru acest problem este prezentat n curs, la pagina 19. La aceei pagin amintit mai sus este
dat i un exemplu de double buffering.
Antialiasing
"In computer graphics, antialiasing is a software technique for diminishing jaggies - stairstep-like lines that should be
smooth. Jaggies occur because the output device, the monitor or printer, doesn't have a high enough resolution to represent
a smooth line. Antialiasing reduces the prominence of jaggies by surrounding the stairsteps with intermediate shades of
gray (for gray-scaling devices) or color (for color devices). Although this reduces the jagged appearance of the lines, it
also makes them fuzzier" (sursa: Webopedia).
public void paint (Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
// ...
}
JavaFX
"The JavaFX platform is the evolution of the Java client platform designed to enable application developers to easily
create and deploy rich internet applications (RIAs) that behave consistently across multiple platforms. Built on Java
technology, the JavaFX platform provides a rich set of graphics and media API with high-performance hardware-
accelerated graphics and media engines that simplify development of data-driven enterprise client applications."
Pentru mai multe informaii i tutoriale despre cum s utilizai JavaFX, consultai documentaia. Pentru ceea ce avei
nevoie n cadrul laboratorului, putei ncepe cu Working with Canvas, Applying Transformations in JavaFX i Creating
Transitions and Timeline Animation in JavaFX.

Tips & Tricks - laborator 6
1. Pentru a urmri aciunile mouse-ului, utilizai interfaa MouseInputListener.
2. Atunci cnd trasai o figur, afiai toate formele intermediare pe care aceasta le ia atunci cnd se mic mouse-ul,
fr a lsa rmie de la desenri anterioare. Acest proces ncepe n momentul cnd butonul mouse-ului este
apsat i se termin atunci cnd acesta este eliberat.
3. Eliminai efectul de "flickering", aa cum este prezentat n curs.
4. Folosii tehnica de double buffering, aa cum este descris n curs.
5. Pentru a nelege mai uor diferena ntre modul de desenare "imediat" i cel "scen", facei analogia cu programe
pe care le cunoasteti deja, spre exemplu Paint i Photoshop.
o Paint - Toate elementele deja desenate devin o singur imagine indivizibil. Exist control doar asupra
celei mai recente figuri desenate.
o Photoshop - componentele sunt separate unele de altele, eventual alctuite din subcomponente, rezultnd
o scen arborescent.
6. Pentru a putea comuta uor ntre cele dou moduri de desenare este necesar un nivel de abstractizare. Gndii-v
la noiuni discutate n laboratoarele anterioare care v-ar putea ajuta.

Antrenament examen
1. Ce se va ntmpla la compilarea urmtorului program:
public class SubiectLicentaUnu {
int i = 3, j = 4;
public static void main(String [] arg) {
System.out.println(i ++ + ++ j);
}
}
a. va aprea eroare la compilare deoarece parametrul metodei main() trebuie s fie String args[]
b. va aprea eroare la compilare deoarece dun funcia main() nu putem accesa variabilele nestatice i i
j
c. va aprea eroare la compilare deoarece nu s-au inserat paranteze ntre operatorii ++, adic (i++) i (++j)
d. se va afia 8
e. se va afia 9

2. Ce se va afia n cadrul urmtorului program (liniile sunt numerotate):
1. public class SubiectLicentaDoi {
2. static int x = 10;
3. static { x += 5; }
4. public static void main(String args[]) {
5. System.out.println("x = " + x);
6. }
7. static { x /= 5; }
8. }
a. liniile 3 i 7 nu se vor compila deoarece lipsesc numele metodelor i tipurile returnate
b. linia 7 nu se va compila deoarece poate exista doar un iniializator static
c. codul se compileaz i execuia produce ieirea x = 15
d. codul se compileaz i execuia produce ieirea x = 10
e. codul se compileaz i execuia produce ieirea x = 3

3. Ce se afieaz n urma execuiei urmtorului program?
public class SubiectLicentaTrei {
public static void main(String args[]) {
double d = 12.34;
ScadeUnitate su = new ScadeUnitate();
su.scadeUnitate(d);
System.out.println(d);
}
}

class ScadeUnitate {
public void scadeUnitate(double d) {
d = d - 1.0;
}
}
a. 0.0
b. -1.0
c. 12.34
d. 11.34
e. eroare la compilare deoarece lipsete constructorul clasei ScadeUnitate

4. Ce rezultat obinem la execuia urmtorului cod Java:
int x = 1;
String[] sir = {"Test", " Licenta", " JAVA"};
sir[--x] += ".";
for (int i = 0; i < sir.length; i++)
System.out.print(sir[i]);
a. irul: Test.
b. irul: Test Licenta. JAVA
c. irul: Tes
d. irul: Test. Licenta JAVA
e. o excepie de tip ArrayIndexOutOfBoundsException

5. Considerndu-se secvena de cod alturat, s se precizeze care afirmaie este adevrat:
i) float a = 2;
ii) float b = 1.3;
a. instruciunile i) i ii) sunt corecte
b. instruciunea i) este corect, instruciunea ii) este incorect
c. instruciunea i) este incorect, instruciunea ii) corect
d. instruciunile i) i ii) sunt incorecte

6. Ce putei spune despre urmtorul subprogram Java?
String s1 = "anul" + 200 + 2,
s2 = 200 + 2 + "anul";
System.out.println("s1 = " + s1 + ", s2 = " + s2);
a. s1 = anul202, s2 = 202anul
b. s1 = anul2002, s2 = 202anul
c. s1 = anul202, s2 = 2002anul
d. s1 = anul2002, s2 = 2002anul
e. Eroare la execuie: este necesar o conversie explicit!

7. Ce putei spune despre programul alturat? (liniile sunt numerotate)
1. public class TestTablouri {
2. public static void main(String[]args) {
3. int[] a = {2, 6};
4. Object b = a;
5. System.out.print(b[0] + " ");
6. byte[] c = new byte[2];
7. c = a;
8. System.out.print(c[1] + " ");
9. }
10. }
a. programul este corect i va afia la execuie: 2 6
b. va aprea eroare de compilare doar la linia 4 deoarece b necesit o conversie explicit
c. va aprea eroare de compilare doar la linia 5 deoarece b[0] nu poate fi accesat
d. vor aprea erori de compilare la linia 5 deoarece b[0] nu poate fi accesat i la linia 7 deoarece tipul
componentelor tablourilor a i c nu sunt compatibile
e. va aprea eroare la execuie din cauza liniei 5, aruncndu-se excepia ClassCastException
8. Ce se poate spune despre programul alturat?
public class Apel {
static int f(short a) { return a * 2; }
public static void main(String[] args) {
System.out.println(f(3));
}
}
a. Eroare la compilare: nu exist o definiie a metodei f() cu parametrul int
b. Eroare la compilare: metoda f() nu ntoarce o valoare de tip short
c. Eroare la compilare: metoda static f() trebuie apelat astfel: Apel.f(3)
d. Programul se compileaz i la execuie afieaz 6

9. Ce se va afia n urma execuiei secvenei alturate?
String s1 = new String("hello"),
s2 = "Hello".toLowerCase();
System.out.println(s1 == s2);
a. Secvena nu va fi compilat deoarece variabila s2 nu este instaniat
b. Secvena nu va fi compilat deoarece irurile nu pot fi comparate cu ==
c. false, deoarece s1 i s2 au adrese de memorie diferite
d. true, deoarece toLowerCase convertete un ir la litere mici
e. true, deoarece comparaia irurilor nu ine cont de litere mici sau mari

10. Care dintre urmtoarele afirmaii referitoare la cele 4 linii numerotate ale metodei main este corect?
public class Test {
public static String sayHello() {
return "Hello";
}

public static void main(String[] args) {
Test t = new Test();
String a = Test.sayHello(); // 1
t.sayHello().toUpperCase(); // 2
System.out.println(sayHello()); // 3
args[0] = t.sayHello(); // 4
}
}
a. Totul este corect, clasa va fi compilat
b. Linia 1 este greit, deoarece metodele de clas nu pot fi apelate astfel
c. Linia 2 este greit, deoarece metoda sayHello returneaz un ir de caractere
d. Linia 3 este greit, deoarece metoda sayHello este static
e. Linia 4 este greit, deoarece este posibil ca vectorul args s nu aib elemente

LABORATOR 7: Fire de execuie
Crearea i pornirea firelor de execuie
public class MyThread extends Thread {
public void run() {
//...
}
}
new MyThread().start();
public class MyRunnable implements Runnable {
public void run() {
//...
}
}
new Thread(new MyRunnable()).start();
Ciclul de via al unui thread

Figura 7. Ciclul de via al unui thread
Sincronizare
Un segment de cod ce gestioneaz o resurs comun mai multor de fire de execuie separate i concurente se numete
seciune critic. n Java o seciune critic poate fi un bloc de instruciuni sau o metod. Controlul accesului ntr-o seciune
critic se face prin cuvntul cheie synchronized.
public synchronized void metoda() { //... }
public void metoda() {
//...
synchronized {
//...
}
//...
}

Tips & Tricks - laborator 7
1. Un exemplu interesat de vizualizare grafic sugestiv a execuiei mai multor algoritmi de sortare este
http://www.sorting-algorithms.com/. Pentru bonusul de la prima problem, realizai ceva asemntor. E de ajuns
s fie reprezentai doar trei algoritmi, iar vectorul de sortat trebuie s fie acelai pentru toi algoritmii i poate fi
generat aleator.
2. La a doua problem, numrul de iepurai care vor concura va fi parametrizat i ales de utilizator naintea nceperii
concursului. Cursa se va termina dup ce toi iepuraii au ajuns la sfrit. n momentul cnd un iepura ajunge la
finalul cursei, i se va afia locul pe care a terminat.
3. Orice ar fi, nu folosii metoda stop() pentru oprirea unui fir de execuie.
4. Folosii cuvntul cheie synchronized atunci cnd un cmp sau o metod sunt accesate din mai multe fire de
execuie.
5. Atenie la prioritile pe care le acordai firelor de execuie. Dac este necesar, folosii metoda yield().

LABORATOR 8:Programarea n reea

Noiuni generale
Programarea n retea implic trimiterea de mesaje i date ntre aplicaii ce ruleaz pe calculatoare aflate ntr-o reea local
sau conectate la Internet. Pachetul care ofer suport pentru scrierea aplicaiilor de retea este java.net. Clasele din acest
pachet ofer o modalitate facil de programare n reea, fr a fi nevoie de cunotine prealabile referitoare la comunicarea
efectiv ntre calculatoare. Cu toate acestea, sunt necesare cteva noiuni fundamentale referitoare la reele, cum ar fi
protocol, adresa IP, port, socket.
Protocol - convenie de reprezentare a datelor folosit n comunicarea ntre dou calculatoare.
Adres IP - Orice calculator gazd conectat la Internet este identificat n mod unic de adresa sa IP (IP este acronimul de la
Internet Protocol). Aceasta este un numr reprezentat pe 32 de bii, uzual sub forma a 4 octei, cum ar fi, de exemplu,
193.226.26.231, i este numit adres IP numeric. Corespunzatoare unei adrese numerice exist i o adres IP simbolic,
cum ar fi fenrir.infoiasi.ro.
Port - un numr de 16 bii care identific n mod unic procesele care ruleaz pe o anumit main.
Socket - o abstraciune software folosit pentru a reprezenta fiecare din cele dou "capete" ale unei conexiuni ntre dou
procese ce ruleaz ntr-o retea. Socket-urile sunt de dou tipuri:
TCP, implementate de clasele Socket i ServerSocket
UDP, implementate de clasa DatagramSocket
Gsii n curs exemple de cod:
Comunicarea prin conexiuni
Comunicarea prin datagrame

Tips & Tricks - laborator 8
1. Pentru prima problem, serverul va putea gestiona mai multe partide simultan, n fire de execuie diferite.
Considerai ca unitate de lucru o pereche de clieni care joac mpreun.
2. Aa cum este menionat i n cerin, memorai starea tablei de joc la nivel de server. Atunci cnd vine rndul unui
juctor, acesta va primi starea actualizat a tablei de joc.
3. Ambele probleme trebuie s aib interfa grafic cu utilizatorul.
4. La a doua problem este de dorit ca site-ul copiat s fie navigabil offline.

Antrenament examen
1. S considerm declaraia A a = new A(); unde clasa A este definit mai jos:
class A implements Runnable {
int counter = 0;
public void run() { while (true) counter++; }
}
Care dintre variantele de mai jos instaniaz i lanseaza un fir de execuie?
a. a.run();
b. a.start();
c. new Thread(a).run();
d. new Thread(a).start();

2. Care din afirmaiile urmtoare referitoare la fire de execuie n Java sunt adevrate?
a. Orice fir de execuie este o instan a clasei Thread.
b. Orice clas care descrie un fir de execuie trebuie s implementeze obligatoriu interfaa Runnable.
c. Pentru a controla accesul mai multor fire de execuie la o resurs comun, trebuie s declarm clasa ce
descrie resursa respectiv folosind modificatorul synchronized .
d. Un fir de execuie poate s cedeze procesorul altor fire de execuie cu aceeai prioritate, chiar dac
nu i-a terminat nc activitatea (vezi Thread Priorities, yield() and Join).
e. Singura modalitate de a opri un fir de execuie este prin apelul metodei stop().


3. Ce se va afia la execuia urmtorului program?
1. public class Exemplu {
2. public static void main(String args[]) {
3. A.B a = new A().new B();
4. a.f();
5. }
6.}
7. class A {
8. private int x = 4;
9. public class B {
10. private int y = 5;
11. public void f() {
12. System.out.println("x = " + x);
13. x = 3;
14. System.out.println("x = " + x + ", y = " + y);
15. }
16. }
17.}
a. Eroare de compilare la linia 3 deoarece construcia A.B nu este valid.
b. Eroare de compilare la linia 4 deoarece metoda f() nu aparine clasei A.
c. Eroare de compilare la linia 9 deoarece nu se poate declara o clas n interiorul altei clase.
d. Eroare de compilare la linia 12 deoarece nu se poate accesa data privat x.
e. Se va afia:
x = 4
x = 3, y = 5

4. Scriei o metod care primeste ca argumente o colecie de numere ntregi v precum i un alt ntreg a. Metoda va
elimina din colecie toate valorile strict mai mici dect a i va returna numrul de eliminri efectuate. Metoda
poate s accepte att colecii de tip ArrayList, ct i LinkedList.
Se puncteaz signatura funciei (tip returnat, parametri - n special cel de tip List<Integer>), parcurgerea listei fr
folosirea iteratorilor (de ce?), compararea elementelor, eliminarea elementelor i numrarea eliminrilor.
public static int elimina(List<Integer> v, int a) {
int count = 0;

for(int i = 0; i < v.size(); i++) {
if(v.get(i).compareTo(a) < 0) {
v.remove(i);
i--;
count++;
}
}

return count;
}

5. Care dintre urmtoarele afirmaii sunt adevrate relativ la codul de mai jos?
1. public class Exemplu extends Thread {
2. public void run() {
3. System.out.print("Ultima ");
4. yield();
5. System.out.print("intrebare");
6. }
7. public static void main (String args[]) {
8. Exemplu e = new Exemplu();
9. e.start();
10. }
11.}
a. Compilarea va eua la linia 4 deoarece yield() se poate apela doar n cod sincronizat.
b. Compilarea va eua la linia 4 deoarece yield() se poate apela doar ntr-un bloc try/catch.
c. Compilarea se va face cu succes. La execuie, nu se va afia nimic.
d. Compilarea se va face cu succes. La execuie, se va afia Ultima.
e. Compilarea se va face cu succes. La execuie, se va afia Ultima intrebare.

LABORATOR 9: Applet-uri. Internaionalizare i localizare
Applet-uri
Un applet reprezinta o suprafata de afisare (container) ce poate fi inclusa ntr-o pagina Web si gestionata printr-un
program Java. Un astfel de program se mai numeste miniaplicatie sau, prin abuz de limbaj, applet.
Codul unui applet poate fi format din una sau mai multe clase. Una dintre acestea este principala si extinde clasa Applet
(pentru Swing, vom folosi JApplet), fiind clasa ce trebuie specificata n documentul HTML ce descrie pagina de Web n
care dorim sa includem appletul.
Diferenta fundamentala dintre un applet si o aplicatie consta n faptul ca, un applet nu poate fi executat independent, ci va
fi executat de browserul n care este ncarcata pagina Web ce contine appletul respectiv. O aplicatie independenta este
executata prin apelul interpretorului java, avnd ca parametru numele clasei principale a aplicatiei, clasa principala fiind
cea care contine metoda main. Ciclul de viata al unui applet este complet diferit, fiind dictat de evenimentele generate de
catre browser la vizualizarea documentului HTML ce contine appletul.
Pachetul care ofera suport pentru creearea de appleturi este java.applet.
Internaionalizare
Internaionalizarea - pregtirea unei aplicaii astfel nct s poat fi personalizat n funcie de o regiune geografic,
politic sau cultural.
Localizarea - adaptarea unei aplicaii internaionalizate la o anumit regiune.
Tips & Tricks - laborator 9
1. Putei folosi biblioteci care implementeaz lucrul cu polinoame, dar trebuie s tii s explicai care este principiul
de funcionare.
2. Consultai tutorialul Java pentru exemple de comunicare ntre dou applet-uri.
3. Pentru a obine lista de instane de tip Locale disponibile, aruncai o privire asupra metodelor statice din clasa
Locale.
4. Pentru a obine lista de instane de tip TimeZone disponibile, aruncai o privire asupra metodelor statice din clasa
TimeZone.
5. Pentru a obine denumirile de zile i de luni pentru un anumit Locale, folosii clasa DateFormatSymbols.
6. Pentru a obine denumirea monedei utilizate ntr-un anumit Locale, folosii clasa Currency.

LABORATOR 10: Lucrul cu baze de date n Java
JDBC
Accesul la o baz de date se face prin intermediul unui driver specific tipului respectiv de baz de date. Acesta este
responsabil cu accesul efectiv la datele stocate, fiind legtura ntre aplicaie i baza de date.
JDBC (Java Database Connectivity) este o interfa standard SQL de acces la baze de date. JDBC este constituit dintr-un
set de clase i interfee scrise n Java, furniznd mecanisme standard pentru proiectanii aplicaiilor de baze de date.
Pachetul care ofera suport pentru lucrul cu baze de date este java.sql.
n linii mari, JDBC face trei lucruri:
stabilete o conexiune cu o baz de date;
trimite secvene SQL;
prelucreaz rezultatele.
O conexiune (sesiune) la o baz de date reprezint un context prin care sunt trimise secvene SQL i primite rezultate.
ntr-o aplicaie pot exista mai multe conexiuni simultan la baze de date diferite sau la aceeai baz.
Tips & Tricks - laborator 10
1. Urmrii i acest tutorial despre crearea de rapoarte cu JasperReports|iReport prin intermediul unei conexiuni
JDBC.
2. Pentru mai multe exemple i explicaii, consultai tutorialul Java despre JDBC.
3. Pentru extragerea de metadate, v-ar putea fi de folos urmtoarele materiale:
o Database Metadata with JDBC;
o JDBC: DatabaseMetaData
o Understanding JDBC Metadata;
o Documentaia pentru interfaa DatabaseMetaData;

LABORATOR 11: Lucrul dinamic cu clase. Java Web Start
Tips & Tricks - laborator 11
1. Putei folosi i altceva dect Swing, atta vreme ct sunt implementate cerinele problemei (i.e. bar de
componente, listare de proprieti, schimbare valori proprieti, salvare i restaurare n/din format XML).
2. Accesarea i modificarea proprietilor componentelor se va face folosind reflection.
3. Pentru scrierea i citirea fiierelor XML folosii XMLEncoder i XMLDecoder.
4. Consultai The Reflection API, Java Web Start, JNLP API.

Antrenament examen
1. Ce definete structura de mai jos? Descriei o modalitate de utilizare a ei.
@Target(ElementType.FIELD)
public @interface NotNull { }
Structura definete o adnotare care poate fi folosit pe cmpuri. Dac avei astfel de ntrebri, dai i exemple!

@NotNull
int x;

2. Implementai metoda drawShape care primete ca argument un String ce reprezint numele unei clase ce
implementeaz interfaa java.awt.Shape i un obiect de tip java.awt.Graphics2D, funcionalitatea acesteia fiind
desenarea respectivei forme geometrice (implicite), folosind metoda Graphics2D.draw().
Se puncteaz:
o Signatura metodei: void drawShape(String c, Graphics2D g)
o Folosirea mecanismului de reflection: z = Class.forName(c).newInstance();
o Desenarea: g.draw((Shape)z);

3. Care dintre urmtoarele afirmaii legate de applet-uri nu sunt corecte?
a. Un applet poate fi descrcat de pe un server Web sub form de arhiv jar.
b. Execuia unui applet ncepe ntotdeauna cu metoda main().
c. Applet-urile pot accesa fiiere de pe maina client prin JNLP API.
JNLP API, Accessing the Client Using JNLP API
d. ntr-un applet pot fi folosite mai multe fire de execuie.

4. Fie a un obiect de tip java.awt.Applet ce implementeaz interfaa Runnable. Care dintre urmtoarele variante va
determina pornirea unui fir de execuie?
. a.start();
a. new Thread(a).run();
b. new Thread(a).start();
c. Thread.start(a);

5. Care informaii referitoare la applet-uri sunt corecte?
a. Conin obligatoriu o clas ce extinde java.applet.Applet.
b. Pot fi formate din mai multe clase.
c. Clasele unui applet pot fi grupate n mai multe pachete.
d. Folosesc cel puin dou fire de execuie.

6. Care din urmtoarele afirmaii referitoare la applet-uri sunt adevrate?
a. Trebuie obligatoriu s extind clasa java.applet.Applet
b. Trebuie obligatoriu s supradefineasc metodele init(), start(), stop(), destroy().
c. Clasele unui applet pot fi grupate n mai multe pachete.
d. Un applet trebuie s defineasc cel puin dou fire de execuie.
e. Dac applet-ul nu se gsete ntr-o arhiv .jar, clasele sale sunt transferate una cte una n conexiuni
HTTP diferite.

7. Ce se poate spune despre programul alturat?
public class Program {
static int x = 6;
public static void main(String[] args) {
System.out.print("x = " + x);
int x = (x = 3) * x;
System.out.print(", x = " + x);
}
}
. Eroare la compilare: variabila x este declarat de dou ori.
a. Programul se compileaz i la execuie afieaz x = 6, x = 3.
b. Programul se compileaz i la execuie afieaz x =6, x =9.
c. Programul se compileaz i la execuie afieaz x = 6, x = 18.

8. Care va fi valoarea variabilei counter dup execuia blocului de instruciuni alturat?
int counter = 0;
try {
Object obj[] = new Object[10]; counter ++;
obj[0] = new String("hello"); counter ++;
counter ++;
} catch (Exception e) { counter ++; }
finally { counter ++; }
a. 1
b. 2
c. 3
d. 4
e. 5

9. Care vor fi erorile depistate la compilarea clasei alturate?
class A {
private int x=0;
protected static int y=0;
public void f() { x=1; y=1; }
static void g() { x=2; y=2; }
}
a. Variabila x nu poate fi apelat dintr-un context static
b. Variabila x nu poate fi apelat dintr-un context ne-static
c. Variabila y nu poate fi apelat dintr-un context static
d. Variabila y nu poate fi apelat dintr-un context ne-static
e. Metoda g nu are modificator de acces

LABORATOR 12: Introducere n Java ME
Tips & Tricks - laborator 12
1. Se puncteaz orice implementare (sau tentativ de implementare) care conine elementele cerute (ecran structurat,
ecran grafic, persisten).
2. Tutoriale Netbeans: Java ME MIDP Development Quick Start Guide, Visual Mobile Designer Custom
Components: Creating Login Screens.
3. Tutoriale Eclipse: Using the Oracle Java ME SDK Software with Eclipse, Creating a new J2ME MIDlet Project.
4. Tutorial IntelliJ: IntelliJ IDEA 13.1 Web Help - J2ME.

S-ar putea să vă placă și