Sunteți pe pagina 1din 49

Subiecte test ianuarie 2014

POO + Java (principii, best practices, constructii ale


limbajului, cuvinte cheie)
1. Identificai afirmaiile corecte din urmtorul set:
A. O clas imutabila nu permite existena de metode de tip setter publice (definite cu
identificatorul de acces public)
B. Spre deosebire de variabile i metode, clasele nu pot fi definite private.
C. Interfeele pot extinde alte interfee.
D. Dup instantierea unui vector (de exemplu: new Object[10]), indiferent de tipul elementelor,
toate au valoarea null.
- A,B,C
+C
- B,C
- B, D

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 {}

R: ntrebarea verific cunoaterea regulilor pentru supracriere:

aceei list de argumente


acelai tip de return sau un subtip al acestuia
nu pot avea un modificator de acces mai restrictiv
pot arunca doar aceleai excepii, excepii derivate din acestea, sau excepii unchecked.
Doar varianta public void suprascrie (int integer, String string) {} respect
aceste reguli.

3. Ce se afieaz la execuia urmtorului cod:

class MyClass{

private int id;

public MyClass(int id) {

this.id = id;
}

public int getId() {

return id;

@Override

public boolean equals(MyClass obj) {

return obj.id == id;

public static void main(String []args){

MyClass class1 = new MyClass(3);

MyClass class2 = new MyClass(new Integer(3));

if (class1.equals(class2))

System.out.println("Obiectele sunt egale");

else

System.out.println("Obiectele difera");

- Se genereaz eroare de compilare la linia MyClass class2 = new MyClass(new


Integer(3));
- Se afieaz Obiectele sunt egale
- Se afieaz Obiectele difer
+ Se genereaz o alt eroare de compilare fa de cea menionat la celalalta varianta de
rspuns

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.

4. Care dintre urmtoarele afirmaii nu definete ncapsularea?


- gruparea atributelor i operaiilor caracteristice unui obiect
- modificarea strii interne a unui obiect strict prin intermediul operatiilor acestuia
+ posibilitatea implementrii interfeelor
- ascunderea modului de funcionare a unui obiect

R: Scopul ntrebrii este verificarea cunoaterii conceptului de ncapsulare.


Posibilitatea implementrii interfeelor nu are legtur cu conceptul OOP de ncapsulare. Restul
afirmaiilor definesc caracteristici/avantaje ale ncapsulrii.

Motenire i agregare
5. Ce se afieaz la execuia urmtorului cod:

class A {

private int x = 5;

private void hidden() {

System.out.println(x);

public void show_hidden() {

hidden();

class B extends A {

public int x = 10;

public void hidden() {


System.out.println(x);

public class Main {

public static void main(String[] args) {

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.

6. Fie urmtorul program:

class C {}

class D extends C {}

class A {

static void foo (C c) { }

static void foo (D d) { }

class B extends A {
static void foo (C c) { }

static void foo (D d) { }

(in main)

A a = new B();

C c = new D();

Care metod va fi apelat dac se ruleaz a.foo?


+ foo (C ) din A
- foo (C ) din B
- foo (D ) din A
- foo (D ) din B

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.

7. Ce se afieaz la execuia urmtorului cod:

public class Main {

public static void main(String []args) {

B obj = new B();

System.out.println(obj.getValue());

class A {

public int x;

public A() {

x = 10;
}

public int getValue() {

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.

Clase abstracte i interfee


8. Care afirmaie este adevrat n contextul limbajului Java?
- O clas poate implementa oricte interfee i poate moteni oricte clase (abstracte sau
concrete)
- O clas poate implementa o singur interfa i poate moteni oricte clase (abstracte sau
concrete)
+ O clas poate implementa oricte interfee i poate moteni o singur clas (abstract sau
concret)
- O clas poate implementa oricte interfee i poate moteni oricte clase abstracte i o singur
clas concret

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

R: ntrebarea verific cunotiinele legate de scopul i utilizarea interfeelor i cu ce difer fa de


cel al claselor. Raspunsul corect este c interfeele expun operaiile unui obiect (un contract a
ceea ce face/ofer un obiect) iar clasele modul n care le execut.

Clase interne
10. Ce va afia urmtorul program:

class Outer {

static class Inner {

public static void main(String[] args){

System.out.print("1");

public static void main(String[] args) {

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.

12. Care afirmaie despre clasele interne statice este adevrat?


- trebuie s avem o referin la instana clasei exterioare pentru a o putea instania
+ din clasa intern static nu avem acces la membrii non-statici ai clasei exterioare
- variabilele i metodele ei trebuie s fie statice
- o clas intern static nu poate avea specificatorul de acces private

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?

public String f() {

String s=1;

try {

throw new Exception();

} catch (Exception e) {

try {

try {

throw new Exception();

} catch (Exception e1) {

s += "2";

throw new Exception();


} catch (Exception e2) {

s += "3";

return s;

finally {

s += "5";

finally {

s += "6";

- genereaz 1 eroare de compilare


- genereaz 2 erori de compilare
+ la execuie ntoarce 123
- la execuie ntoarce 12356

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.

14. Ce va afia urmtoarea secven de cod?

public int f(int n) {

int s = 0;

for (int i =0; i < n; i++) {

s += f(1);

}
return s;

...

try {

System.out.println(f(2));

} catch (Throwable t) {

System.out.println("am prins ceva!");

-2
- eroare de compilare, obiectele Throwable nu pot fi prinse
- va intra ntr-o bucl infinit
+ am prins ceva!

R: Secvena de cod conine un apel recursiv infinit, ce genereaz o excepie StackOferflow,


prins n blocul catch. La laboratorul de excepii a fost un exerciiu care s genereze aruncarea
unei astfel de excepii.

15. Ce va afia urmtoarea secven de cod?

public class Main {

public static int f(int a, int b) {

try {

System.out.println(a/b);

} catch (Exception ex) {

return 1;

finally {

return 2;

}
}

public static void main(String []args) {

int result = f(10, 0);

System.out.println(result);

-1
+2
- eroare la compilare
- eroare la rulare, excepia generat nu poate fi prins

R: Scopul exerciiului este verificarea nelegerii flow-ului try-catch-finally. Secvena de cod


genereaz o excepie la mprirea cu 0, i atunci se intr n catch i apoi n finally, return-ul luat
n considerare fiind cel din finally.

Colecii i genericitate
16. Pe cte linii exist erori n urmtoarea secven de cod?

List<Integer> l1 = new LinkedList<Integer>();

List<Number> l2 = new LinkedList<Integer>();

List<Integer> l3 = new LinkedList<int>();

List<Number> l4 = new List<Integer>();

-1
-2
+3
-4

R: Scopul exerciiului este verificarea regulilor legate de genericitate n contextul polimorfismului.


Regula de baz, accentuat i n laborator este c atribuirile polimorfice se aplic doar tipului de
baz nu i tipului generic. Din acest motiv, l2 i l4 sunt greite. Atribuirea l3 este greit deoarece
tipurile primitive int/double/float/short/byte/boolean nu pot fi folosite ca tipuri generice.

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

R: Scopul principal al acestui exerciiu este verificarea nelegerii folosirii/implementrii equals i


hashcode. Afirmaia 1 e fals pentru c e fix negarea contractului Java
pentru equals i hashcode. Afirmaia a 3-a este fals pentru c exist situaii n care dac nu
vfacei propria implementare a metodei equals n clasa voastr folosit drept cheie n Map,
atunci comportamentul programului poate sa nu fie cel dorit: se adauga obiecte drept chei in map
care din punctul vostru de vedere sunt egale, insa neavand nici equals si nici hashcode cu
implementari proprii, ele sunt considerate diferite. Aceasta afirmaie verific nelegerea
necesitii de a suprascrie equals i hashcode pentru obiecte proprii, atunci cnd sunt adugate
n seturi sau folosite drept chei n map-uri.

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

R: Pattern-ul Observer este folosit pentru transmiterea de notificri de la componentele


monitorizate ctre componentele care le monitorizeaz.
Test gril, ianuarie 2015
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.

Analizm aici ntrebrile pe rnd, structurat pe seciuni.

Basics
1. Ce obinem la rularea urmtorului cod:

class A {

public static boolean val;

public A() { val = true; }

public static void print() {

System.out.println("First");

public class Main {

public static void main(String[] args) {

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) Statement-ul package poate fi


pus doar pe prima linie necomentat dintr-un
fiier
B) Speci
ficatorii de acces pentru clase externe sunt doar public i default
C) Un
fiier poate avea mai multe clase publice
D) Este obligatoriu pentru un
fiier sa conin statement-ul package
E) Un
fiier poate avea mai multe statement-uri import

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 {

public String type = " s ";

public Shape() { System.out.print("shape ");}

public class Rectangle extends Shape {

public Rectangle() { System.out.print("rectangle ");}

public static void main(String[] args) {

new Rectangle().go();

void go() {

type = "r ";

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.

4. Ce afieaz urmtorul program?

class Main {

public static void main(String[] args) {

Boolean b = new Boolean(true);

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) {}?

int computeX(int a, float b) {}


public int computeX(int a, float b) {}
protected int computeX(Integer a, Float b) {}
protected Integer computeX(int a, float b) {}
Explicaie: ntrebarea verific cunoaterea regulilor pentru supracriere:

aceei list de argumente


acelai tip de return sau un subtip al acestuia
nu pot avea un modificator de acces mai restrictiv
pot arunca doar aceleai excepii, excepii derivate din acestea, sau excepii unchecked.
n cazul de fa suprascrierea este corect dac se pstreaz aceeai semntur (tip de ntors,
nume + parametri, deci variantele 3 i 4 sunt greite), iar modificatorul de acces este cel puin
protected. Modificatorul default poate sau nu s fie mai vizibil dect protected (exerciiu - gndii-
v la scenarii), fapt pentru care compilatorul interzice prima variant ca fiind suprascriere (i.e.
dac adugai adnotarea @Override vei primi eroare).

6. Ce afieaz urmtorul cod (Student e o subclas a Person, iar Person conine


metoda getName)?

// intr-o metoda main

Person s = new Student("Alice");

Person p = new Person("Bob");

InfoManager m = new InfoManager();

System.out.println(m.printInfo(s) +"; " + m.printInfo(p));

// in clasa InfoManager

public String printInfo(Person p){

return "Person " + p.getName();

public String printInfo(Student s){


return "Student " + s.getName();

Person Bob; Student Alice


Person Alice; Person Bob
Student Alice; Student Bob
Student Alice; Person Bob
Explicaie: n lipsa altor detalii, getName() este aceeai metod n clasele Person i Student,
care ntoarce cmpul de tip String din obiect, nici nu am mai scris-o n ntrebare pentru c am
fost siguri c nelegei scenariul. Ce e important de dedus este care metod printInfo se
apeleaz pentru cele dou obiecte s i p. Rspunsul este simplu: se apeleaz acea metod
pentru care tipurile parametrilor coincid cu tipurile declarateale obiectelor pasate efectiv. A nu se
confunda cu runtime dispatch-ul metodelor suprascrise n clase derivate! n cazul nostru
ambele obiecte erau declarate de tip Person, deci se apela de dou ori
metoda printInfo(Person), o dat pentru Alice, o dat pentru Bob.

ntrebarea testeaz c tii c metodele suprancrcate (overloaded) sunt 'alese' la compile-time,


iar cele suprascrise (overriden) la runtime.

7. Ce se afieaz?

class A {

int x;

public A() { init(0); }

protected void init(int x) { this.x = x; }

class B extends A {

public B() { init (super.x + 1); }

public void init(int x) { this.x = x + 1; }

public class Test {

public static void main(String[] args) {


A a = new B();

System.out.println(a.x);

0
2
3
1
Explicaie: oh but why. De ce 3

E clar c variabila a va avea tipul B la runtime. Ce e important e ce se ntmpl la construcia


obiectului B. Constructorul lui B cheam super-constructorul fr parametri, dei nu e scris
explicit. Super-constructorul face init(0). Aici este foarte important. Se cheam funcia init
din B. De ce? nainte s se apeleze efectiv constructorul B, runtime-ul aloc pe heap memorie
aferent unui obiect B i leag toate numele metodelor la implementrile efective, inclusiv init-ul
suprascris. Toate acestea, nainte s se apeleze efectiv constructorul. Metoda init se va chema
deci din clasa B, care face this.x = x+1. Asta nseamn c n acest moment, a.x = 1. Dup
apelul super-constructorului, se execut corpul propriu al constructorului B, care
face init(super.x + 1). Pentru c super.x = this.x = 1, se cheam deci init(2), care iari
face this.x = 2 + 1, de unde this.x = 3. Cu aceast valoare se cedeaz controlul
apelantului i deci a.x = 3.

Este recomandat ca n codul vostru s nu apelai metode polimorfice n constructori, tocmai din
cauza unui astfel de comportament.

Clase abstracte i interfee


8. Care afirmaii sunt corecte? (Ci denot clase, Ii denot interfee)

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 {

protected int x = 10;

int y;

int z = 20;

abstract void foo();

final int f(int x);

Care linii din corpul interfeei (numerotate de la 1 la 5) sunt corecte?

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:

1. protected i public (dedus) intr n contradicie - greit


2. y e final (implicit) i nu e iniializat - greit
3. corect
4. putei considera declaraia un pleonasm, dar compilatorul nu este deranjat, abstract este
oricum dedus - corect
5. metodele din interfee sunt prin definiie abstract; final + abstract = compiler headbang -
greit.
Clase interne
10. Cu ce poate fi nlocuit linia (xxx) pentru a obine o instan a B?

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?

new Thread(new Runnable() {

public void run() {

while(true) {

System.out.println("Nyan cat!");

} ).start();

eroare de compilare, public void run() nu poate fi implementat pe loc


compileaz i ruleaz fr probleme
eroare de compilare, new Runnable() este incorect sintactic, Runnable este o interfa
eroare de compilare, new Thread().start() este incorect sintactic
Explicaie: scenariul din ntrebare este un exemplu clasic de instaniere a unei clase anonime (e
un scenariu real, Thread i Runnable stau la baza multithreading-ului n Java). Expresia new
Runnable() scris fr implementarea care ar urma ar fi ntr-adevr o eroare de compilare (nu
se pot instania tipuri abstracte). Dar, ca i n explicaia de la laboratorul de clase anonime, new
Runnable() { public void run() {} } spune de fapt compilatorului s creeze o nou clas
care implementeaz Runnable i ofer implementarea cu Nyan Cat (lol), dup care i creeaz un
obiect de tipul respectiv. Ct despre new Thread().start(), sintaxa e corect.
12. Ce cuvnt cheie introdus la (xxx) va permite compilarea programului:

abstract class A {

int x;

abstract void set();

public class Test {

public static void main(String args[]) {

(xxx) int num = 30;

A a = new A() {

public void set() {

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.

14. Ce se ntmpl la rularea urmtorului cod:

String[] strings = {"hello", "world"};

Object[] objects = strings; // linia 2

List<?> list = new ArrayList<Object>(); // linia 3

for (Object obj : objects) {

System.out.println(obj);

list.add(obj); // linia 6

eroare de compilare la linia 6


a
fieaz hello i world pe linii diferite
eroare de compilare la linia 2
eroare de compilare la linia 3
Explicaie: Linia 2 e corect sintactic, dei dac apoi ncercm ceva de tipul objects[1] =
1 vom obine un ArrayStoreException la runtime. Linia 3 e perfect n regul, pentru
c ArrayList implementeaz List i wildcard-ul se potrivete cu Object. Ce nu putem face e
s apelm metoda add pe variabila list, pentru c la compilare nu se cunoate tipul obiectelor
coninute n list. Doar null poate fi folosit ca parametru, pentru c null aparine oricrui tip
referin.

15. Care dintre urmtoarele variante este corect (compileaz)?

ArrayList <Person>mylist = new ArrayList<Student>();


List <Person>mylist = new ArrayList<Student>();
List <Student>mylist = new ArrayList<Student>();
ArrayList<Student>mylist = new ArrayList<Person>();
Explicaie: Ideea cheie n aceast ntrebare i n lucrul cu generics n general este c, de
exemplu (exemplul nostru), dac Student e subclas a Person,
atunci ArrayList<Student> nu e subclas a ArrayList<Person>, deci atribuirea nu este
corect (un astfel de exemplu este i n laboratorul de genericitate).

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:

clasele lor nu pot fi


extinse
pot s nu
e declarate n clauzele throws ale metodelor i pot s nu fi
e prinse
trebuie declarate n clauza throws a metodelor care le pot arunca
pot declarate n clauza throws a oricarei metode, dar nu pot fi
prinse
Explicaie: Excepiile unchecked deriv din RuntimeException. Ca orice alt tip referin, se pot
crea noi excepii unchecked dup cum simim nevoia, deci primul rspuns cade. Specificaia lor
include rspunsul de mai sus n bold, care este i cel corect. Excepiile unchecked pot, dar nu
trebuie neaprat s fie declarate n clauzele throws i pot, dar nu trebuie neaprat s fie prinse
de blocurile try-catch.

17.

class A {

public int x = 0;

public A foo() {

A a = new A();

try { a.x = 1;

throw new NullPointerException();

} 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.

Design patterns, JUnit, misc


18. Vrem s implementm un framework de user interface. Cu ce design pattern am putea
modela comportamentul de onClick doSomething pentru un element de tip buton
oarecare?

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).

19. Care cuvnt dintre urmtoarele este rezervat n Java?

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

public void before() { System.out.print("before:");}

@Test

public void test1() { System.out.print("test1:");}

@After

public void after() { System.out.print("after:");}

@Test

public void test2() { System.out.print("test2:");}

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.

Analizm aici ntrebrile pe rnd, structurat pe seciuni.

Basics
1. Ce se va afia la rularea urmatorului cod?

public static void main(String[] args) {

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.

Laboratorul 1 conine explicaii i un exemplu (VeterinaryTest) referitoare la aceast conversia


implicit. Detalii suplimentare pe acest subiect: Java Tutorial - Converting Between Numbers and
Strings.

2. Ce metode sunt vizibile din clasa B?

package A;

class A {
private void show1() {}

protected void show2() {}

void show3() {}

(alt fisier)

package B;

class B extends A {

public void show2() {}

show1, show2 din B, show3


show2 din B, show2 din A, show3
codul nu compileaz datorit suprascrierii greite
show2 din B, show2 din A
Download here the testing code

R: ntrebarea verific nelegerea tipurilor de acces. Rspunsul corect


este show2 din B i show2 din A pentru c show1 este privat iar show3 este default, deci nu
poate fi vizibil din alt pachet. Deoarece din bucata dat de cod lipsea import-ul clasei A, i putea
induce n eroare (codul nu ar fi compilat i nici una din variante nu ar fi fost corecte) am decis s
anulm i aceast ntrebare.

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;

Ce se afieaz dac rulm:

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.

R: n cazul primului numr de afiat, se apeleaz constructorul cu parametru din clasa A,


valoarea cmpului y devenind 1, deoarece, la crearea clasei, ea este 0 iar apoi este incrementat
cu 1. Cea de-a doua valoare este egal cu 3 deoarece constructorul lui B apeleaz implicit
constructorul fr parametrii din printele su, A. Astfel, cmpul y din al doilea obiect este
iniializat cu 1 n constructorul fr parametrii din A, apoi incrementat cu valoarea cmpului x
(iniializat tot cu 1) i cu parametrul x.

4. Ce valoare va returna b.show() ?

public class B {

B b = new B();

public int show () {

return (true ? null : 0);

public static void main(String[] args) {

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.

5. Care dintre urmtoarele clase sunt imutabile?

public class Test { private final int x = 3 };


Object, String
Integer, String
public final class Test { public int y; Test(int y) { this.y = y;} }
R: Obiectele imutabile (imutable) sunt obiecte care dup creare nu mai pot fi modificate.
Clasa String este imutable, coninutul ei nu poate fi modificat i nici nu poate avea subclase
mutabile, fiind declarat final. Asta nseamn c dac dorim s modificm un String (e.g. printr-o
metod de replace a unui caracter) obinem de fapt alt obiect String. La fel ca i String,
clasa Integer, este imutabil i nici nu poate fi extins, la fel ca i restul wrapperelor pentru
primitive.
Legat de restul variantelor de rspuns:

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.

Legat de restul variantelor de rspuns:

o clas abstract nu este obligat s conin metode abstracte


membrii unei clase abstracte poti fi declarai ca membrii oricrei clase, nu este obligatoriu s
fie static final. La interfee este obligatoriu s fie public static final.
putei defini metode statice att n clasele abstracte (dintotdeauna) ct i n interfee (din java
8). Chiar dac nu erai siguri dac pot fi declarate n interfee, fiindc aveam i, afirmaia era
invalidat de partea cu clasele abstracte.
7. Care afirmaii sunt corecte? (Ci denot clase, Ii denot interfee)
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
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.

9. Care dintre urmatoarele variante nu defineste ncapsularea?

expunerea unei interfee high-level de lucru cu obiectul


accesul la membri private folosind metode de tip getter i setter
posibilitatea suprascrierii (overriding) metodelor
construirea de obiecte complexe i ascunderea modului lor de funcionare
R: Variantele 1,2 i 4 reprezint toate definiii/proprieti ale ncapsulrii. Suprascrierea metodelor
nu are nici o legtur cu conceptul de ncapsulare, al crui scop este ascunderea
comportamentului intern al obiectului i oferirea unei interfee de lucru cu acesta, controlnd
astfel accesul la variabilele sale interne, nepermind modificarea lor din alte clase. De exemplu
este bine s avei variabilele private, sau cel mult protected i s oferii getter i setteri pentru
accesarea lor. Acest lucru constituie un avantaj mai ales cnd avei nevoie s facei ceva
suplimentar cu ele n getteri i setteri, de exemplu o validare.

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?

public Boolean equals (Object o) \ protected Integer equals (Object b)


boolean equals(Object o) \ public boolean equals(Test t)
public Boolean equals (Object t) \ public int equals (Object b)
public boolean equals(Object t) \ public int equals(Test t)
R: Toate variantele, n afar de ultima nu respect cel puin un criteriu obligatoriu pentru o
suprascriere sau suprancrcare valid, prezentate i n laboratorul 6.

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.

11. Ce se afieaz la execuia codului urmtor (dac se execut):

Package.java

public class Package {

public String checksum() { return "Package"; }


public static void main(String []args) {

Comm c = new Comm();

System.out.println(c.send((Package)new UDP()) + "; "

+ c.send(new TCP()) + "; "

+ c.send(new UDP()));

class UDP extends Package {

public String checksum() { return "UDP"; }

class TCP extends Package {

public String checksum() { return "TCP"; }

class Comm {

String send(Package p) { return "PKG:" + p.checksum(); }

String send(UDP p) { return "UDP:" + p.checksum(); }

String send(TCP p) { return "TCP:" + p.checksum(); }

codul are o eroare de compilare


UDP:UDP; TCP:TCP; UDP:UDP
PKG:UDP; TCP:TCP; UDP:UDP
PKG:UDP; PKG:TCP; PKG:UDP
R: La compilare, vor fi considerate 3 obiecte, unul de tip Package, unul de tip UDP i unul de
tip TCP i se va considera apelul metodelor send pt Package, UDP i TCP. La runtime, obiectele
p din metodele send vor fi de tip UDP, TCP i UDP. Practic, la runtime care metod suprascris
(overriden) s fie apelat, n timp ce la compilare se decid metodele suprancrcate (overloaded).

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.

Legat de celelalte variante de rspuns:

prima afirmaie se refer la clasele interne ne-statice


a treia afirmaie prezint o restricie care nu este impus de aceste clase
a patra afirmaie, ca i a treia, este greit i absurd n contextul claselor interne
13. Cum afim y din Inner?

class Outer {

int y;

private class Inner {

int y;

class Outer1 extends Outer {

public void show() { //todo afisare 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:

System.out.println(this.new Inner().y); - incorect, nici nu compileaz pentru c


Inner este membru privat al clasei Outer, deci nu poate fi instaniat dect din interiorul lui
Outer.
System.out.println(super().new Inner().y); - incorect deoarece apelul super() poate
fi fcut doar din constructorul lui Outer1. Dac totui nu ai fi observat c este call-ul pt
constructor i l-ai fi confundat cu super.ceva_al_clasei_parinte, tot ar fi trebuit s ridice red
flags accesarea clasei private Inner.
System.out.println(Outer.this.Inner().y); - dac am fi fost ntr-o clas intern lui
Outer, atunci cu Outer.this am fi obinut referina clasei externe Outer. Doar c apelul acesta
este n Outer1, care motenete Outer, nu este intern ei, deci nu are sens, i nici nu
compileaz.
Rmne astfel doar ultima variant, nici una. Dac vrei s l afiai pe y este suficient s
scriei: System.out.println(y); sau System.out.println(this.y);

Colecii i genericitate
14. Care declaraie este corect?

List<Integer> list = new List<Integer>();


ArrayList<Integer> list = new List<Integer>();
ArrayList<Object> list = new ArrayList<Integer>();
List<Integer> list = new ArrayList<Integer>();
R: Scopul ntrebrii era s verificm c tii s instaniai corect o clas parametrizat, n
particular c generics nu sunt covariante i c nu putei instania o interfa. Primele dou
variante de rspuns sunt greite pentru c se instaneaz interfaa List. A treia variant este
greit datorit restriciilor de genericitate. See also discuiadespre genericitate i subtipuri din
laboratorul despre genericitate i acest articol.

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).

(subiectul acesta a fost dat i n testul din 2014)

16. Care afirmaie este fals?

interfaa Comparable<T> conine o metod int compareTo(T o);


interfaa Comparator<T> conine o metod int compare(T o1, T o2);
interfaa Comparator<T> conine o metod int compareTo(T o);
interfaa Comparator<T> conine o metod boolean equals(Object obj) ce face override
metodei din Object;
R: The hint is in their names: interfaa Comparable face ca obiectele de tip T care o
implementeaz s devin comparabile ntre ele, n timp ce interfaa Comparator permite clasei
care o implementeaz s compare dou obiecte de un anumit tip T. Subiectul acesta nu verific
c tii exact numele metodelor din aceste interfee, ci c tii diferena dintre ele. Primele dou
afirmaii sunt adevrate pentru c metoda de comparare are un singur parametru pentru
Comparable i doi pentru Comparator. A treia varianta este cea fals pentru c avem un singur
parametru n metoda Comparator-ului.

Excepii
17. Ce se va ntmpla la rularea urmtorului program?

Test.java

public class Test {

public static int f(int i){

try{

System.out.print(i);

return 1;

} finally{

try {

return 10 / 0;

} catch (Throwable e){

return 100;

} finally {

System.out.print(7);

public static void main(String[] args){


System.out.print(f(9));

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).

18. Care afirmaie este corect pentru codul urmtor?

ErrorTest.java

import java.io.*;

public class ErrorTest {

void foo() throws IOException {

throw new RuntimeException();

public static void main(String[] args) {

ErrorTest err = new ErrorTest();

try {

err.foo();

} catch (IOException e) {

System.out.println("Caught exception");

}
}

se va afia Caught exception


eroare la rulare: RuntimeException
eroare la compilare: antetul metodei foo trebuie s includ i RuntimeException n
clauza throws
eroare la compilare: trebuie adugat un bloc catch i pentru RuntimeException
R: n metoda foo se arunc excepia RuntimeException i nu este prins n main, deci va aprea
la rulare. Blocul catch prinde doar excepiile de tip IOException. De asemenea, pentru c
RuntimeException este excepie unchecked, programul compileaz chiar dac nu o includem n
clauza throws a metodei foo sau dac nu facem un catch pentru ea.

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.

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