Documente Academic
Documente Profesional
Documente Cultură
R: A - fals, nu exista aceasta retrictie, B - clasele interne pot fi private, C - adevarata, interfetele
pot extinde alte interfete, D - fals, in cazul Object se iniializeaz cu null, dar pentru boolean
cu false, int/short/bye cu 0 iar float/double cu 0.0. La test varinta corect cu C aparea cu C, D
a fost anulata intrebarea - considerat corect pentru toi.
2. Care dintre urmtoarele metode suprascrie metoda : public void suprascrie (int a,
String b) {}
- public void suprascrie (String b, int a) {}
- public String suprascrie (int a, String b) {}
+ public void suprascrie (int integer, String string) {}
- public void suprascrie (int a, String b) throws IOException {}
class MyClass{
this.id = id;
}
return id;
@Override
if (class1.equals(class2))
else
System.out.println("Obiectele difera");
R: Se genereaz eroare la @Override pentru c signatura funciei equals din Object primete
parametru Object, ca atare equals-ul definit nu este o suprascriere, ci o suprancrcare.
Motenire i agregare
5. Ce se afieaz la execuia urmtorului cod:
class A {
private int x = 5;
System.out.println(x);
hidden();
class B extends A {
B b = new B();
b.show_hidden();
- eroare la compilare
+5
- 10
-0
R: La execuie se afieaz 5 pentru c variabila x din clasa A este private, altfel ar fi fost 10.
class C {}
class D extends C {}
class A {
class B extends A {
static void foo (C c) { }
(in main)
A a = new B();
C c = new D();
R: Exerciiu similar celui din laboratorul de recapitulare, ns pentru metode statice. Scopul
acestui exerciiu este verificarea cunoaterii conceptului c metodele statice nu pot fi suprascrise.
System.out.println(obj.getValue());
class A {
public int x;
public A() {
x = 10;
}
return x;
class B extends A {
public int x;
public B() {
x = 20;
+ 10
- 20
- Se genereaz eroare la compilare
- Niciuna din variantele de mai sus
R: Din moment ce metoda getValue nu este suprascris n B, atunci se apeleaz cea din A,
pentru care este vizibil x-ul din A, care are valoarea 10.
R: ntrebarea verific regula de baz legat de motenire n Java: poate fi motenit o singur
clas dar implementate oricte interfee.
9. Care variant definete cel mai bine legtura ntre interfee i clase?
- att clasele, ct i interfeele definesc modul n care un obiect execut o operaie
+ interfeele precizeaz operaiile expuse de un obiect, n timp ce clasele modul n care acesta le
execut
- nici clasele, nici interfeele nu precizeaz modul n care un obiect execut o operaie
- o clas nu definete implicit interfaa instanelor sale
Clase interne
10. Ce va afia urmtorul program:
class Outer {
System.out.print("1");
Outer.Inner.main(null);
System.out.print("2");
+ 12
- eroare compilare, nu putem apela explicit main din Inner
-2
- eroare compilare, nu putem avea metoda main intr-o clasa intern
R: Declaraia i apelul metodei main este corect. Clasele interne nu pot fi executate direct, ns
nimic nu restricioneaz apelul acelei metode, din alta parte n program. Se apeleaz main i se
afieaz 1, apoi se afieaz 2.
11. Alegei codul corect pentru instanierea unei clase interne anonime de tipul Food (clas
abstract ce conine metoda public abstract String eat();)
- Food f = new Food()
- System.out.println(new Food(public String eat(){return eat pizza;}));
- System.out.println(new Food{String eat(){return eat pizza;}});
+ System.out.println(new Food(){public String eat(){return ;}});
R: Scopul acestui exerciiu este verificarea cunoatiinelor legate de clasele interne anonime, mai
precis felul n care acestea sunt create, i ca pot fi create n mod convenabil i acolo unde se dau
parametru pentru o alt metod.
R: Scopul acestui exerciiu este verificarea cunotiinelor legate de clasele interne statice, mai
precis conceptul de baz, c nu avem nevoie de referin ctre instana clasei exterioare. Deci nu
avem acces la membrii non statici ai acesteia, pentru ca nu avem o instan n care s existe
acetia.
Excepii
13. Ce putei spune despre urmtoarea funcie?
String s=1;
try {
} catch (Exception e) {
try {
try {
s += "2";
s += "3";
return s;
finally {
s += "5";
finally {
s += "6";
R: Rspunsul corect este irul 123 deoarece, dei se execut instruciunile din finally, pe stiv
s-a pus deja ca rezultat returnat versiunea 123 a irului. Obiectele String sunt immutable, deci
modificrile aduse n finallyau rezultat ntr-un alt obiect string, nemodificndu-se irul pus s fie
returnat. Dac era un return n ultimul finally atunci s-ar fi ntors 12356.
Conform specificaiei Java, blocul finally se execut nainte de transferul controlului (return-ul
efectiv), dar expresia returnat (n cazul nostru irul) va fi cea de dinainte de ntrepunerea finally-
ului.
int s = 0;
s += f(1);
}
return s;
...
try {
System.out.println(f(2));
} catch (Throwable t) {
-2
- eroare de compilare, obiectele Throwable nu pot fi prinse
- va intra ntr-o bucl infinit
+ am prins ceva!
try {
System.out.println(a/b);
return 1;
finally {
return 2;
}
}
System.out.println(result);
-1
+2
- eroare la compilare
- eroare la rulare, excepia generat nu poate fi prins
Colecii i genericitate
16. Pe cte linii exist erori n urmtoarea secven de cod?
-1
-2
+3
-4
17. Ce colecie ar fi cel mai bine de folosit dac am vrea s meninem o serie de
configurri/proprieti ale aplicatiei, citite dintr-un fiier de configurare. Alegei n funcie de cat de
uor e de lucrat cu colecia respectiv n cazul de fa, al lizibiltii codului i eficiena d.p.d.v. al
timpului de acces.
- ArrayList
- HashSet
+ HashMap
- LinkedHashSet
R: Mai precizm exemplul dat n timpul testului: fiierul de configurare poate conine date de
genul: os = linux sau graphics = low etc. Scopul ntrebrii este verificarea nelegerii
avantajelor folosirii HashMap-ului i identificarea situaiilor n care e mai bine s l folosii (bad
coding/design ar fi aici folosirea a doi vectori umplui i parcuri n paralel, greeal ntlnit n
unele cazuri la laborator).
18. Care dintre afirmaiile urmtoare sunt adevrate in contextul limbajului Java?
1. Dac a.equals(b) == false, atunci a.hashcode()==b.hashcode() este false.
2. Metoda equals trebuie implementat pentru a determina dac dou obiecte sunt egale.
3. Chiar dac propriile obiecte nu suprascriu equals, ele pot fi folosite drept chei n obiecte de
tip Map, fr a avea vreun caz de funcionare incorect.
4. HashSet nu permite duplicate i nu menine ordinea elementelor.
- 1, 2, 3
- 1, 4
- 2, 3, 4
+ 2, 4
Design Patterns
19. Care pattern implic ascunderea vizibilitii contructorilor unei clase?
+ Singleton
- Visitor
- Observer
- Command
R: Ascunderea vizibilitii constructorilor este modlitatea prin care ne asigurm ca acea clas nu
poate fi instaniat din alt parte a programului, deci ne ajut n a implementa conceptul de
Singleton.
20. Pe care dintre urmtoarele pattern-uri l-am folosi, dac n aplicaie avem foarte multe
notificri ntre componente?
- Visitor
- Command
+ Observer
- Factory
Metoda de evaluare: gril francez, -1/4 din punctajul unei ntrebri la rspuns greit, 0 dac nu
este marcat niciun rspuns.
Basics
1. Ce obinem la rularea urmtorului cod:
class A {
System.out.println("First");
A a = null;
if (!a.val) a.print();
else System.out.println("Second");
NullPointerException
Second
Eroare de compilare
First
Explicaie: Programul e corect sintactic, deci eroarea de compilare cade. Ideea principal este
c se pot accesa membrii statici pentru obiectele a cror valoare e null. De ce funcioneaz:
runtime-ul nu derefereniaz efectiv obiectul null, ci acceseaz membrii clasei obiectului, pe
baza tipului declarat. De aceea, nu se arunc excepie i se printeaz First.
2. Care afi
rmaii sunt corecte?
A, B, C, E
A, B, E
B, C, E
A, B, D, E
Explicaie: s lum afirmaiile pe rnd:
A) declararea pachetului poate fi doar prima linie necomentat de cod fr dubii, deci corect
B) specificatorii pentru clase externe sunt doar public i default (adic fr modificator); ceilali nu
au sens dect n contextul unei alte clase (private, protected fa de cine?) - corect
C) un fiier poate avea o singur clas public - greit
D) dac un fiier se afl ntr-un pachet default, nu trebuie s aib statement-ul package - greit
E) un fiier poate avea, desigur, mai multe import-uri (i este deseori cazul) - corect
Constructori, referine
3. Ce afieaz urmtorul cod:
class Shape {
new Rectangle().go();
void go() {
System.out.print(this.type + super.type);
}
}
rectangle r s
shape rectangle r r
rectangle r r
shape rectangle r s
Explicaie: Expresia new Rectangle() cheam nti super-constructorul, anume Shape(), care
printeaz shape, dup care se execut instruciunile din constructorul propriu al Rectangle,
care printeaz rectangle. Apoi pe instana de Rectangle se apeleaz metoda go din clasa
Rectangle (ar trebui s fie clar), care seteaz type=r. Rectangle nu are un cmp type propriu,
deci this.type i super.type vor avea aceeai valoare r. Deducem deci c se va afia shape
rectangle r r.
class Main {
if (b.equals(true)) {
System.out.println("1");
b = false;
if (b == new Boolean(false)) {
System.out.println("2");
1
12
Eroare la compilare
Nimic
Explicaie: codul compileaz; singura potenial problem ar fi atribuirea unei valori boolean (tip
primitiv) unei variabile Boolean (tip referin), dar tim c Java face autoboxing (adic se creeaz
un nou Boolean cu falsen interiorul lui). Esena ntrebrii este diferena dintre == i
metoda equals. n mod clar b.equals(true)va fi adevrat, deci se va printa 1. Apoi, pentru c
operatorul == compar referinele (adic verific dac cei doi operanzi sunt de fapt acelai
obiect), b == new Boolean(false) va fi false, deci nu se va printa i 2.
OOP
5. Care variant reprezint suprascrierea corect a metodei: protected int computeX(int
a, float b) {}?
// in clasa InfoManager
7. Ce se afieaz?
class A {
int x;
class B extends A {
System.out.println(a.x);
0
2
3
1
Explicaie: oh but why. De ce 3
Este recomandat ca n codul vostru s nu apelai metode polimorfice n constructori, tocmai din
cauza unui astfel de comportament.
A) C1 extends I1;
B) I1 extends I2, I3;
C) I1 implements I2;
D) C1 implements I1,I2;
E) C1 extends C2, C3.
A, B, C, E
C, E
B, D, E
B, D
Explicaie: Este o ntrebare standard despre fundamentele limbajului Java. Esenial este c o
clas poate extinde o singur alt clas i poate implementa oricte interfee, iar o interfa poate
extinde oricte alte interfee.
Afirmaia E este deci greit, deci pic din start 3 variante, ceea ce v asigur rspunsul corect,
dar s mergem mai departe. Afirmaiile A i C iari nu au sens, o clas extinde alt clas i o
interfa extinde alt interfa. Afirmaia D este corect i apare des n viaa real. Ce este
potenial tricky la aceast ntrebare este afirmaia B, care este corect. De ce este corect: n
virtutea implementrii mai multor interfee, compilatorul este doar interesat de adunat semnturi
de metode n cadrul interfeelor. V putei pune ntrebarea ce se ntmpl dac I1 i I2 conin
aceeai semntur de metod i pe care dintre ele o motenete I. Un rspuns (cu nite
simplificri) e c nu conteaz; ceea ce conteaz este ca acea semntur de metod s se afle n
I. Deci faptul c o interfa extinde mai multe alte intefee cu semnturi de metode potenial
identice nu deranjeaz compilatorul, pentru c nu exist i implementri diferite care s
declaneze eventuale ambiguiti.
9. Fie:
interface ITest {
int y;
int z = 20;
1,3,5
3,4
1,2,3
4
Explicaie: Esenial este faptul c orice variabil din corpul unei interfee este automat
(dedus) public static final, iar metodele sunt implicit public abstract. narmai cu aceste
cunotine, s lum acum fiecare linie pe rnd:
class A {
class B {}
}
// in main
A a = new A();
(xxx)
B b = new B();
A.B b = new B();
A.B b = new A().new B();
A.B b = new a.B();
Explicaie: ntrebare standard despre sintaxa Java la instanierea unei clase interne nestatice.
Corect este (obiect de tip A).new B(), deci singura variant care respect aceast sintax
este cea din bold.
11. Fie interfaa Runnable cu singura metod public void run(). Clasa Thread are un
constructor ce primete un Runnable ca parametru i expune o metod public void
start(). Ce concluzie tragei de la urmtorul cod?
while(true) {
System.out.println("Nyan cat!");
} ).start();
abstract class A {
int x;
A a = new A() {
x = num;
};
public
Nu este necesar niciun cuvnt cheie n plus pentru a permite compilarea corect a
programului.
final
static
Explicaie: Pentru a folosi variabile locale din afara contextului (scope-ului) unei clase interne
(cum e i cazul nostru), e necesar cuvntul cheie final. Motivul este layout-ul n memorie al
claselor i variabilelor, iar finalpermite (prin copiere) i garanteaz accesul la valoarea corect
a variabliei x la orice moment. static i public nu au oricum sens pentru variabile locale, iar
diferenierea dintre nu e nevoie de modificator i final este motivul precedent.
Colecii i genericitate
13. Dac dorim s stocm un ir de elemente fr duplicate ntr-o colecie fr s ne
intereseze ordinea elementelor sau sortarea lor, clasa cea mai potrivit este
Vector
HashMap
HashSet
TreeMap
Explicaie: Cnd auzii fr duplicate, primul impuls trebuie s fie o implementare de Set, deci
deja Vectorcade, iar HashSet este aproape sigur. S ne uitm totui i la celelalte
variante. TreeMap ine minte chei comparabile, deci neinteresndu-ne de ordinea elementelor,
pic. HashMap poate fi de asemenea folosit ca i HashSet cu obiectele noastre ca i chei, dar
pentru a-l folosi corect, trebuie s stocm i valori asociate cheilor, cu toate c nu ne intereseaz
efectiv. HashSet e deci varianta optim.
System.out.println(obj);
list.add(obj); // linia 6
Matching-ul tipului generic (cel dintre paranteze unghiulare) este fcut la compilare i singura
variant care trece de aceast verificare este varianta n bold. Am fi putut avea matching corect
cu wildcard-uri, dar nu a fost cazul aici. Pentru mai multe detalii putei s citii despre covarian
i contravarian i despre type erasure ca s nelegei motivele pentru care Java se comport
astfel.
Excepii
16. Despre excepiile unchecked:
17.
class A {
public int x = 0;
public A foo() {
A a = new A();
try { a.x = 1;
} catch (Exception e) {
a.x = 2;
return a;
} finally { a.x = 3; }
Ce se ntmpl la:
A a = foo();
System.out.println(a.x);
2
excepie NullPointerException neprins, catch-ul prinde doar excepiile checked
1
3
Explicaie: este o ntrebare care necesit mult atenie i cteva cunotine cheie. La momentul
aruncrii excepiei, a.x = 1. NullPointerException deriv din Exception, deci va fi prins. n
acel moment, a.x devine 2 i se va marca obiectul a ca fiind cel pe care l va ntoarce funcia.
Atenie. Doar marcat. Este pus pe stiv referina ntr-un loc special, ntr-un mod asemntor n
care apelai funcii la IOCLA: punei ntr-un registru valoarea de ntors (pe care o putei modifica
de oricte ori) i abia cnd executai instruciunea ret se poate folosi n blocul apelant.
Instruciunea din bytecode este areturn.
Nu se cedeaz controlul apelantului nc, pentru c exist un bloc finally care va trebui
executat (tim c finally se execut no matter what). Blocul finally seteaz a.x la valoarea
3 pe acelai obiect, adic pe cel care va fi apoi ntors. Abia atunci se cedeaz controlul
apelantului. Se va printa 3.
Nu aveai nevoie s cunoatei toate detaliile, ci doar c nu se cedeaz controlul (nu se iese din
funcie) imediat ce se execut o instruciune return ca n C, ci doar dup ce s-a executat codul
din finally, timp n care obiectelor care vor fi ntoarse li se poate modifica starea intern. Cum e
i cazul nostru.
Exist mari anse s v lovii de problema aceasta n cod scris de alte persoane. Problema v
pregtete pentru acest scenariu i aceste cunotine v pot salva ore sau zile pierdute.
Visitor
Singleton
Factory
Observer
Explicaie: Factory este un pattern de construcie de obiecte, nu unul comportamental cum a fost
descris n ntrebare. Visitor este un pattern n care se pot parcurge i procesa n mod polimorfic
structuri de date diverse, iar Singleton permite crearea unei singure instane de un anumit tip,
deci niciuna nu are legtur cu scenariul din ntrebare. Observer, n schimb, se potrivete perfect,
pentru c dac inei minte, la elementele noastre observabile (de tip MyArrayList) nregistram
observatori care se declanau (notificau) atunci cnd executam o operaie pe ele. Aa dorim s
implementm i comportamentul butoanelor: se nregistreaz listeneri, adic observatori, iar la
click s se creeze un obiect (eveniment) cu care s fie notificai i fiecare s-i ruleze un
mecanism intern pe acel eveniment (procesare de date, afiare de coninut, navigare etc). Este
chiar modelul real pe care se bazeaz aproape toate elementele interactive de UI existente (web,
mobile, jocuri etc).
method
unsigned
native
array
Explicaie: Cuvintele method i array pic imediat. Unsigned nu exist n Java, iar native
denumete metodele pe care le putei scrie pentru a interfaa cu programele scrise special pentru
sistemul vostru (arhitectura de calcul, sistem de operare etc). Consultai laboratorul de Reflection.
Nu aveai nevoie de informaii detaliate despre ce face Java Native Interface, ci doar c exist
astfel de metode.
20. Fie urmtorul test JUnit funcional. Ce se va afia n urma execuiei lui?
public class Test {
@Before
@Test
@After
@Test
before:test1:test2:after:
test1:test2:
before:test1:before:test2:
before:test1:after:before:test2:after:
Explicaie: ntrebare simpl despre funcionarea JUnit. Fiecare test n parte este precedat de
rularea metodei adnotat cu Before i succedat de rularea metodei adnotat cu After.
Test gril, ianuarie 2016
Au fost 20 de ntrebri, 4 variante de rspuns, un singur rspuns corect. 4 numere, aceleai 20
de ntrebri n ordine diferit.
Metoda de evaluare: gril francez, -1/4 din punctajul unei ntrebri la rspuns greit, 0 dac nu
este marcat niciun rspuns.
Basics
1. Ce se va afia la rularea urmatorului cod?
String s = 0+1+"ONE"
+3+2+"TWO"+"THREE"
+5+4+"FOUR"+"FIVE"+5;
System.out.println(s);
01ONE32TWOTHREE54FOURFIVE5
1ONE32TWOTHREE54FOURFIVE5
1ONE5TWOTHREE9FOURFIVE5
01ONE5TWOTHREE9FOURFIVE5
R: Neavnd paranteze sau ali operatori n afar de adunare, expresia se evalueaz de la stnga
la dreapta n ordinea dat. nti avem adunare de numere ntregi (0+1), ceea ce d tot un numr
ntreg (1). Dup aceea avem adunare ntre un numr ntreg i un String, iar n Java nu trebuie
conversie explicit pentru a face aceast operaie, rezultatul fiind String-ul 1ONE. Dup aceea
toat expresia devine concatenare de String-uri, realizndu-se conversia implicit a numerelor
ntregi la iruri de caractere. Dac adunrile 3+2 sau 5+4 erau n paranteze, atunci se evalua
nti ceea ce era n paranteze, rezultnd 5, respectiv 9, i se concatena la irul de caractere.
package A;
class A {
private void show1() {}
void show3() {}
(alt fisier)
package B;
class B extends A {
Constructori i referine
3. Fie urmtoarele clase:
A.java
public class A {
int x;
int y;
A() {
x = 1;
y = 1;
A(int x) {
this.x = x;
this.y+=1;
class B extends A {
B(int x) {
this.y += this.x + x;
System.out.print(new A(1).y);
System.out.print(new B(1).y);
20
23
24
35
13
Deoarece ntrebarea a fost formulat greit (variantele de rspuns erau pentru alt versiune a
codului), am decis s o anulm, astfel toata lumea primind punctajul pentru acest subiect.
public class B {
B b = new B();
B b = new B();
b.show();
java.lang.NullPointerException
java.lang.StackOverflowError
0
null
R: Execuia acestui cod va genera StackOverflowException datorit instanierii recursive a clasei
B (linia 1 din clasa B). Practic se va apela recursiv constructorul clasei B i nu se va iei niciodat
din vreun constructor, astfel umplndu-se stiva de apeluri.
clasa Test pare imutabil, deoarece cmpul x nu poate fi modificat, ns poate fi extins,
ceea ce nseamn c obiectele de tip Test pot s fie i mutabil, totul depinznd de cum
implementm subclasele. Pentru mai multe detalii i un exemplu, urmrii rspunsurile de
pe acest thread.
clasa Object nu este imutable, altfel toate obiectele ar fi imutable (toate clasele motenesc
Object)
clasa Test este declarat final, adic nu poate fi extins, dar asta nu nseamn c nu poate
fi mutable. Avnd variabila public y, aceast clas poate fi schimbat, deci este mutable.
Clase abstracte i interfee
6. Care afirmaie este corect?
o clas poate implementa mai multe interfee, ns poate extinde o singur clas
abstract
o clas abstract are cel puin o metod abstract
membrii unei clase abstracte sunt considerai \texttt{static final}
n interfee i clase abstracte nu pot fi definite metode statice
R: Aceast ntrebare verific noiuni de baz legate de clase abstracte i interfee. Prima variant
este corect, e o restricie de baz a limbajului, o clas putnd extinde o singur clas (fie ea
abstract sau nu) i poate implementa mai multe interfee. Aceast restricie e bine de avut n
vedere atunci cnd v decidei dac s facei o clas abstract doar cu metode abstracte sau o
interfa. Dac clasa care o extinde are nevoie sa extind i alt clas atunci mai bine creai o
interfa.
A, B, C, E
B, D, E
B, D
C, E
R: Acest ntrebare verific noiuni de baz legate de conceptul de motenire i implementare
interfee. O clas poate extinde o singur clas. O clas poate implementa oricte interfee. O
interfa poate extinde oricte alte interfee. Doar B i D sunt afirmaii corecte, celelalte fie
folosesc keyword-ul greit (extends n loc de implements i invers - A, respectiv C), fie prezint
motenire multipl (E).
OOP
8. Care variant reprezint suprancrcarea corect a metodei: String getMessage()
public String getMessage()
StringBuffer getMessage()
public String getMessage(String from)
public String getMessage() throws Exception
R: Aceast ntrebare verific cunotiine de baz ale conceptului de suprancrcare
(overloading). Regulile pentru o suprancrcare corect sunt prezentate i n laboratorul
6: metoda suprancrcat are neaprat o list diferit de argumente. Varianta a treia este singura
care respect aceast regul. Schimbarea modificatorului de acces, a tipului de return sau a
excepiilor aruncate, fr a schimba numrul sau tipul parametrilor, nu reprezint o
suprancrcare corect, i nici nu este permis la compilare.
10. Care combinaie reprezint, ntr-o clas pe nume Test, o suprascriere, respectiv o
suprancrcare valid (overriding i overloading) pentru metoda equals din java.lang.Object?
Metoda equals din clasa Object este public, ntoarce un boolean i primete ca parametru un
Object. Fiindc modificatorul de acces este public i altul mai puin restrictiv nu exist, n clasa
Test nu putei suprascrie dect dac metoda este tot public. Tipul de return i semntura trebuie
pstrate identice. Tipul de return poate diferi doar cnd este nlocuit cu un subtip, ceea ce nu este
cazul n acest exerciiu. O greeal comun este de a pune n loc de Object, tipul clasei
respective, in acest caz Test. Aceasta ar fi o suprancarcare i nu o suprascriere. Tot o
suprancrcare este i dac, pe lng tipul parametrului schimbm i tipul de return, ca n
varianta de mai sus.
Package.java
+ c.send(new UDP()));
class Comm {
Clase interne
12. Care din urmtoarele afirmaii este adevarat despre clasele interne statice n Java:
Este nevoie de o referin la un obiect din clasa extern pentru a putea instania un obiect al
clasei interne
Nu are acces la membrii non-statici ai clasei externe
Atributele i metodele coninute de aceasta trebuie s fie statice
Trebuie neaprat s moteneasc clasa extern
R: Scopul acestei ntrebri este verificarea nelegerii conceptelor de baz despre clasele interne
statice i de a nu face confuzia ntre ele i cele nestatice. Dup cum ai aflat i n laboratorul
despre clase interne, clasele interne statice pot fi instaniate fr a avea nevoie de o referin a
clasei externe. Acest lucru este similar cu accesul i ali membrii statici (variabile, metode) far a
avea nevoie de o instan a clasei. Din cauz c nu avem o instan a clasei externe, nu putem
accesa membrii si non-statici.
class Outer {
int y;
int y;
System.out.println(this.new Inner().y);
System.out.println(super().new Inner().y);
System.out.println(Outer.this.Inner().y);
nici una
R: S lum pe rnd variantele de rspuns i s vedem ce putem elimina:
Colecii i genericitate
14. Care declaraie este corect?
15. Ce colecie ar fi cel mai bine de folosit dac am vrea s meninem o serie de
configurri/proprieti ale aplicatiei, citite dintr-un fiier de configurare. Alegei n funcie de cat de
uor e de lucrat cu colecia respectiv n cazul de fa, al lizibiltii codului i eficiena d.p.d.v. al
timpului de acces.
ArrayList
HashSet
HashMap
LinkedHashSet
R: De exemplu fiierul de configurare poate conine date de genul: os = linux sau graphics =
low etc. Scopul ntrebrii este verificarea nelegerii avantajelor folosirii HashMap-ului i
identificarea situaiilor n care e mai bine s l folosii (bad coding/design ar fi aici folosirea a doi
vectori umplui i parcuri n paralel, greeal ntlnit n unele cazuri la laborator).
Excepii
17. Ce se va ntmpla la rularea urmtorului program?
Test.java
try{
System.out.print(i);
return 1;
} finally{
try {
return 10 / 0;
return 100;
} finally {
System.out.print(7);
9100
97100
91007
977100
R: Blocul finally se execut ntotdeauna, chiar i dac avem return (n afar de atunci cnd
avem System.exit i se oprete masina virtual). Din aceast cauz flow-ul codului de mai sus
este: syso(9) se intr n finally return 10/0 genereaz eroare din cauza mpririi la zero
eroare este de tip Throwable i este prins n catch se excut finally-ul acestui bloc try-catch,
syso(7) se termin blocul al doilea finally se termin primul bloc finally se ntoarce 100
syso(100).
ErrorTest.java
import java.io.*;
try {
err.foo();
} catch (IOException e) {
System.out.println("Caught exception");
}
}
Design patterns
General disclaimer pentru intrebarile de design patterns din testele de pn acum i cele viitoare:
La design patterns, unde lucrurile nu sunt fixe (e.g. pot implementa un pattern i ntr-o situaie n
care nu e recomandat deoarece mai mult ncurc designul sau afecteaz performana) e
recomandat s alegei varianta n care vine cel mai uor i natural de implementat, sau care
prezint o situaie pentru care acel pattern este de obicei recomandat, chiar dac considerai c
i celelalte variante sunt aplicabile ntr-o anumit msur. Dac vi se pare c un exerciiu are mai
multe variante corecte, restrangei la cea mai evident de aplicat.
19. Ce design pattern ar fi util de folosit n cazul n care avem o colecie de date i dorim s
facem o statistic relevant n funcie de un anumit criteriu?
Visitor
Command
Factory
Strategy
R: Deci ce avem n aceast situaie? O colecie de date, pe care presupunem c este
reprezentat printr-o colecie (lista, de exemplu) de anumite obiecte, i dorim s facem operaii
pe ea pentru a obine diverse statistici. Asta sun extrem de similar cu un scenariu de folosire
pentru Visitor. Factory pattern este pattern structural, ce se ocup cu crearea obiectelor, deci nu
prea are legatur cu situaia dat (bine, putem folosi Factory pentru a crea acele obiecte din
colecie, dar nu este att de relevant pentru ntrebarea noastr). Command nu prea se potrivete
direct, dect dac ncercm s abordm problema altfel, s decuplm aplicarea unor comenzi de
prelucrare, iar Strategy ar putea fi o opiune potrivit dac am vrea s alegem dinamic, la
runtime, dintre mai multe feluri de a face acea statistic.
20. Ce design pattern folosim dac vrem s simulm pasarea i procesarea de pointeri la funcii
ncapsulai n obiecte?
Command
Factory
Singleton
Observer
R: Factory i Singleton pic din start pentru c sunt pattern-uri legate de crearea obiectelor, iar
ntrebarea nu dorete soluionarea acestui aspect. Componentele i relaiile sugerate de pattern-
ul Observer nu se potrivesc cu aceast problem, nu dorim s monitorizm obiecte, nu dorim
ceva event-triggered etc. Pattern-ul Command este cel mai potrivit pentru aceast situaie,
fiecare pointer fiind un obiect de tip comand.