User Tools

Site Tools


Problem constructing authldap
test:test_2014

This is an old revision of the document!


POO + Java (principii, best practices, constructii ale limbajului, cuvinte cheie)

1. Identificați afirmațiile corecte din următorul set:
A. O clasă imutabila nu permite existența 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. Interfețele pot extinde alte interfețe.
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 inițializează cu null, dar pentru boolean cu false, int/short/bye cu 0 iar float/double cu 0.0.

2. Care dintre următoarele 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ă cunoașterea regulilor pentru supracriere:

  • aceeși listă de argumente
  • același tip de return sau un subtip al acestuia
  • nu pot avea un modificator de acces mai restrictiv
  • pot arunca doar aceleași excepții, excepții derivate din acestea, sau excepții unchecked.

Doar varianta public void suprascrie (int integer, String string) {} respectă aceste reguli.

3. Ce se afișează la execuția următorului 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 afișează “Obiectele sunt egale”
- Se afișează “Obiectele diferă”
+ Se generează o altă eroare de compilare față de cea menționată la celalalta varianta de răspuns

R: Se generează eroare la @Override pentru că signatura funcției equals din Object primește parametru Object, ca atare equals-ul definit nu este o suprascriere, ci o supraîncărcare.

4. Care dintre următoarele afirmații nu definește încapsularea?
- gruparea atributelor și operațiilor caracteristice unui obiect
- modificarea stării interne a unui obiect strict prin intermediul operatiilor acestuia
+ posibilitatea implementării interfețelor
- ascunderea modului de funcționare a unui obiect

R: Scopul întrebării este verificarea cunoașterii conceptului de încapsulare. Posibilitatea implementării interfețelor nu are legătură cu conceptul OOP de încapsulare. Restul afirmațiilor definesc caracteristici/avantaje ale încapsulării.

Moștenire și agregare

5. Ce se afișează la execuția următorului 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 execuție se afișează 5 pentru că variabila x din clasa A este private, altfel ar fi fost 10.

6. Fie următorul 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: Exercițiu similar celui din laboratorul de recapitulare, însă pentru metode statice. Scopul acestui exercițiu era verificarea cunoașterii conceptului că metodele statice nu pot fi suprascrise.

7. Ce se afișează la execuția următorului 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 interfețe

8. Care afirmație este adevărată în contextul limbajului Java?
- O clasă poate implementa oricâte interfețe și poate moșteni oricâte clase (abstracte sau concrete)
- O clasă poate implementa o singură interfață și poate moșteni oricâte clase (abstracte sau concrete)
+ O clasă poate implementa oricâte interfețe și poate moșteni o singură clasă (abstractă sau concretă)
- O clasă poate implementa oricâte interfețe și poate moșteni oricâte clase abstracte și o singură clasă concretă

R: Întrebarea verifică regula de bază legată de moștenire în Java: poate fi moștenită o singură clasă dar implementate oricâte interfețe.

9. Care variantă definește cel mai bine legătura între interfețe și clase?
- atât clasele, cât și interfețele definesc modul în care un obiect execută o operație
+ interfețele precizează operațiile expuse de un obiect, în timp ce clasele modul în care acesta le execută
- nici clasele, nici interfețele nu precizează modul în care un obiect execută o operație
- o clasă nu definește implicit interfața instanțelor sale

R: Întrebarea verifică cunoștiințele legate de scopul și utilizarea interfețelor și cu ce diferă față de al claselor. Raspunsul corect este că interfețele expun operațiile unui obiect (un contract al ceea ce face/oferă un obiect) iar clasele modul în care le execută.

Clase interne

10. Ce va afișa următorul 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ă

11. Alegeți codul corect pentru instanțierea unei clase interne anonime de tipul Food (clasă abstractă ce conține 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 “”;}});

12. Care afirmație despre clasele interne statice este adevărată?
- trebuie să avem o referință la instanța clasei exterioare pentru a o putea instanția
+ 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

Excepții

13. Ce puteți spune despre următoarea funcție?

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 execuție întoarce 123
- la execuție întoarce 12356

14. Ce va afișa următoarea 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!

15. Ce va afișa următoarea 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, excepția generată nu poate fi prinsă

Colecții și genericitate

16. Pe câte linii există erori în următoarea 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

17. Ce colecție ar fi cel mai bine de folosit dacă am vrea să menținem o serie de configurări/proprietăți ale aplicatiei, citite dintr-un fișier de configurare. Alegeți în funcție de cat de ușor e de lucrat cu colecția respectivă în cazul de față, al lizibiltății codului și eficiența d.p.d.v. al timpului de acces.
- ArrayList
- HashSet
+ HashMap
- LinkedHashSet

18. Care dintre afirmațiile următoare sunt adevărate 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, fără a avea vreun caz de funcționare incorectă.
4. HashSet nu permite duplicate și nu menține ordinea elementelor. - 1, 2, 3 - 1, 4 - 2, 3, 4 + 2, 4

Design Patterns

19. Care pattern implică ascunderea vizibilității contructorilor unei clase?
+ Singleton
- Visitor
- Observer
- Command

20. Pe care dintre următoarele pattern-uri l-am folosi, dacă în aplicație avem foarte multe notificări între componente?
- Visitor
- Command
+ Observer
- Factory

test/test_2014.1390136018.txt.gz · Last modified: 2014/01/19 14:53 by Adriana Draghici