ОО2/К2 2021
- Za pitanja sa više odgovora, tačni odgovori su podebljani i uokvireni.
- Za pitanja za koje se odgovori unose, tačni odgovori su podvučeni i sakriveni: ovako.
- Pritisnite na sledeće dugme kako biste ih sakrili ili otkrili:
G1
1. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Ako konstruktor natklase nema konstruktor bez parametara (no-arg) potrebno je eksplicitno pozvati taj konstruktor u prvoj liniji konstruktora posmatrane klase.
- Konstruktor natklase će biti implicitno pozvan ako postoji i bez parametara je.
- Konstruktor natklase se može eksplicitno pozvati imenom te klase.
- ??
- ??
2. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
3. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Anonimna klasa je lokalna klasa bez imena.
- Anonimna klasa se definiše u izrazu new, kao deo naredbe.
- Anonimna klasa proširuje drugu klasu ili interfejs.
- Natklasa anonimne klase se definiše u imenu te klase.
- Anonimna klasa u svojoj definiciji koristi ključne reči
extends
i/iliimplements
.
4. zadatak
Šta ispisuje sledeći kod na programskom jeziku Java? (Upisati 0 ako se program ne prevodi.)
interface A { default void m() { System.out.print("A.m()"); } }
interface B { default void m() { System.out.print("B.m()"); } }
public class C implements A,B {
public void m() { System.out.print("C.m()"); A.super.m(); B.super.m(); }
public static void main(String[] arguments) {
C c = new C();
c.m();
}
}
Odgovor: C.m()A.m()B.m()
5. zadatak
Šta se može napisati umesto ###
kako bi se sledeći kod na programskom jeziku Java prevodio ispravno?
interface Calc {
int m(int a, int b);
}
public class Test {
public static void main(String[] arguments) {
###
}
}
Calc c = (int a, int b) -> a + b;
Calc c = a, b -> a + b ;
Calc c = a, b -> { a + b };
Calc c = (int a, b) -> return a + b;
Calc c = (int a, int b) -> { return a + b; };
6. zadatak
Šta se može napisati umesto $$$
kako bi se sledeći kod na programskom jeziku Java ispravno izvršavao i ispisivao 3?
class Spoljna {
int x = 1;
class Unutrasnja {
int x = 2;
public void m(int x) {
System.out.println($$$);
}
}
}
public class Main {
public static void main(String[] arguments) {
new Spoljna().new Unutrasnja().m(3);
}
}
this.x
x
super.x
Spoljna.this.x
Spoljna.x
7. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- finally blok se izvršava samo ukoliko se u try bloku baci izuzetak.
- finally blok se izvršava samo ukoliko se u try bloku ne baci izuzetak.
- finally blok se izvršava bez obzira na to da li je u try bloku bačen izuzetak.
- Može postojati samo jedan finally blok za posmatrani try blok.
- U finally bloku može biti bačen izuzetak.
8. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Telo metode run klase Thread je prazno.
- Korisnik eksplicitno treba da pozove metodu run.
- Klasa izvedena iz klase Thread treba[2] da nadjača metodu run.
- Java virtuelna mašina implicitno zove metodu run.
- Nit normalno završava izvršenje po povratku iz njenog metoda run.
9. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Poziv interrupt nad blokiranom niti metodom join() izaziva izuzetak InterruptedException.
- Poziv interrupt nad blokiranom niti metodom join() izaziva izuzetak ThreadDeath.
- Poziv interrupt nad blokiranom metodom join() nit se deblokira.
- Poziv interrupt nad blokiranom niti metodom join() postavlja interrupted status.
- Poziv interrupt nad blokiranom niti metodom join() ne postavlja interrupted status.
Objašnjenje: Tvrdnja pod e je na kolokvijumu bila označena kao tačna, ali zapravo nije, i studentima su naknadno bili priznavani bodovi. U verziji prezentacije iz niti iz 2021 je ovaj deo na slajdu 11 ispravljen.
10. zadatak
Šta je tačno za sledeći kod na programskom jeziku Java?
public class Test {
public static void main(String[] arguments) {
Thread t1 = new Thread(() -> { while (true); });
t1.setDaemon(false);
t1.start();
}
}
- Referenca t1 pokazuje na demonsku nit.
- Java virtuelna mašina (JVM) završava svoj rad nakon završetka glavne funkcije.
- Linija sa setDaemon u kodu ne menja demonski status niti na koju pokazuje t1.
- Nakon izvršenja glavne funkcije se ne izlazi iz programa jer ima još korisničkih niti za izvršavanje.
- Linija sa setDaemon u kodu ne menja ništa, odnosno nema efekta.
G2
1. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Eksplicitni ili implicitni poziv konstruktora nadklase se može izbeći ako se u konstruktoru izvedene klase pozove neki drugi konstruktor te iste klase.
- Ako se koristi, poziv drugog konstruktora iste klase mora biti prva naredba u konstruktoru.
- Konstrukcija objekta se može delegirati pozivom jednog konstruktora iz drugog konstruktora.
- Rekurziju u delegiranju konstruktora detektuje prevodilac.
- Dozvoljeno je u konstruktoru prvo pozvati konstruktor nadklase a zatim delegirati konstrukciju nekom drugom konstruktoru.
2. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Referenca na neki interfejs može pokazivati na literal null.
- Svi interfejsi su izvedeni iz klase Interface u paketu java.lang.
- Referenci na neki interfejs može se dodeliti objekat bilo koje klase koja proširuje[1] taj interfejs.
- Referenci na interfejs se može dodeliti objekat koji se dobije kada se sa druge strane alokatora
new
nađe naziv tog interfejsa. - Referenca na neki interfejs se može dodeliti referenci tipa Object.
3. zadatak
Šta ispisuje sledeći kod na programskom jeziku Java? Ukoliko se program ne kompajlira, upisati 0.
interface A { default void m() { System.out.println("A.m()"); } }
class C { public void m() { System.out.println("C.m()"); } }
public class Test extends C implements A {
public static void main(String[] arguments) {
Test t = new Test();
t.m();
}
}
Odgovor: C.m
4. zadatak
Anonimna klasa na programskom jeziku Java može sadržati:
- konstruktor
- nestatičke metode
- statičke metode
- nestatička polja
- statička polja
5. zadatak
Šta se može napisati umesto ###
kako bi se sledeći kod na programskom jeziku Java prevodio ispravno?
interface Calc {
int m(int a, int b);
}
public class Test {
public static void main(String[] arguments) {
###
}
}
Calc c = (int a, int b) -> a + b;
Calc c = (int a, int b) -> { a + b };
Calc c = (int a, int b) -> { int r = a + b; return r; };
Calc c = (int a, int b) -> return a + b;
Calc c = (int a, int b) -> { return a + b; };
6. zadatak
Šta se može napisati umesto $$$
kako bi se sledeći kod na programskom jeziku Java ispravno izvršavao i ispisivao 2?
class Spoljna {
int x = 1;
class Unutrasnja {
int x = 2;
public void m(int x) {
System.out.println($$$);
}
}
}
public class Main {
public static void main(String[] arguments) {
new Spoljna().new Unutrasnja().m(3);
}
}
x
this.x
super.x
Spoljna.this.x
Spoljna.x
7. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- finally blok može da postoji bez catch bloka.
- finally blok se izvršava samo ukoliko se u catch bloku baci izuzetak.
- finally blok se izvršava samo ukoliko se u catch bloku ne baci izuzetak.
- finally blok se izvršava bez obzira na to da li je u catch bloku bačen izuzetak.
- finally blok se izvršava iako ne dođe do greške.
8. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Metoda start ponovo pokreće nit ukoliko je završena.
- Ponovni poziv start nakon završetka niti je greška.
- Poziv metode start stavlja nit nad kojom je pozvana u red spremnih niti.
- Nit koja poziva start se blokira.
- Nit koja poziva start se ne blokira.
9. zadatak
Označiti tačna tvrđenja na programskom jeziku Java:
- Poziv interrupt nad blokiranom niti izaziva izuzetak InterruptedException.
- Poziv interrupt nad blokiranom niti izaziva izuzetak ThreadDeath.
- Poziv interrupt nad blokiranom niti je deblokira.
- Poziv interrupt nad blokiranom niti ne menja njeno stanje.
- Poziv interrupt nad blokiranom niti ne postavlja interrupted status.
Objašnjenje: Tvrdnja pod e je na kolokvijumu bila označena kao tačna, ali zapravo nije, i studentima su naknadno bili priznavani bodovi. U verziji prezentacije iz niti iz 2021 je ovaj deo na slajdu 11 ispravljen.
10. zadatak
Šta je tačno za sledeći kod na programskom jeziku Java?
public class Test {
public static void main(String[] arguments) {
Thread t1 = new Thread(() -> { while (true); });
t1.setDaemon(true);
t1.start();
}
}
- Referenca t1 pokazuje na demonsku nit.
- Java virtuelna mašina (JVM) završava svoj rad nakon završetka glavne funkcije.
- Linija sa setDaemon u kodu ne menja demonski status niti na koju pokazuje t1.
- Nakon izvršenja glavne funkcije se ne izlazi iz programa jer ima još korisničkih niti za izvršavanje.
- Referenca t1 ne pokazuje na demonsku nit.
G3
1. zadatak
Šta će sledeći program ispisati? Napisati 0 ukoliko se program ne prevodi.
interface A { default void m() { System.out.print("A.m()"); } }
interface B { default void m() { System.out.print("B.m()"); } }
public class X implements A, B {
public void f() { System.out.print("X.f()"); A.super.m(); B.super.m(); }
public static void main (String[] args) {
X x = new X();
x.f();
}
}
Odgovor: 0
Objašnjenje: Klasa X implementira interfejse koji imaju podrazumevanu metodu istog naziva, a pritom je ne redefiniše kao svoj metod, što je u Javi greška i takav program se neće prevoditi.
2. zadatak
Koji su iskazi tačni za metod wait
:
- Ukoliko se pozove interrupt za nit za koju je prethodno pozvano wait, takva nit će se deblokirati.
- Ukoliko se pozove interrupt za nit za koju je prethodno pozvano wait, baciće se izuzetak InterruptedException.
- Ukoliko se pozove interrupt za nit za koju je prethodno pozvano wait, baciće se izuzetak ThreadDeath.
- Ukoliko se pozove interrupt za nit za koju je prethodno pozvano wait, neće se promeniti status prekida.
Objašnjenje: Tvrdnja pod d je na kolokvijumu bila označena kao tačna, ali zapravo nije, i studentima su naknadno bili priznavani bodovi. U verziji prezentacije iz niti iz 2021 je ovaj deo na slajdu 11 ispravljen.
3. zadatak
Koji su iskazi tačni za metod join
:
- Pozivom metoda join bez argumenata za neku nit, nit koja poziva metod čeka da nit za koju je metod pozvan završi izvršavanje.
- Metod join se može pozvati bez argumenata.
- Pozivom metoda join za neku nit sa zadatim vremenom u milisekundama čekaće se bar toliko vremena, bez obzira na to da li je nit završila izvršavanje pre isteka vremena.
- Metod join ne može da se nadjača u izvedenim klasama.
- Pozivom metoda join podrazumevano se završava nit za koju je pozvan metod.
4. zadatak
Šta važi za anonimne klase:
- Anonimne klase mogu pristupati nestatičkim poljima okružujuće klase.
- Anonimne klase mogu pristupati statičkim poljima okružujuće klase.
- Anonimne klase mogu pristupati nepromenljivim parametrima metoda koji ih okružuje.
- Anonimne klase mogu pristupati lokalnim promenljivama okružujućeg metoda kojima se ne menja vrednost.
- Anonimne klase mogu pristupati svim lokalnim promenljivama okružujućeg metoda, kao i njegovim parametrima, bez obzira na to da li im se menja vrednost.
5. zadatak
Šta važi za interfejse:
- Podrazumevano su polja interfejsa javna, statička i konačna.
- Podrazumevano su metodi interfejsa apstraktni i javni.
- Interfejsi mogu definisati podrazumevane metode.
- Interfejsi mogu definisati statičke metode.
- Interfejsi mogu imati modifikator final.
6. zadatak
Navesti šta je tačno za demonske niti:
- Demonstvo se nasleđuje od niti iz koje je kreirana data nit.
- Demonstvo može da se menja nakon pokretanja niti.
- Pokušaj promene demonstva nakon pokretanja baciće IllegalStateException.
- Demonske niti će nastaviti izvršavanje nakon završetka svih ostalih niti.
- Demonstvo se može menjati samo pre pokretanja niti.
7. zadatak
interface Calc {
int f(int x);
}
public class Test {
public static void main(String[] args) {
Test test = new Test();
###
}
}
Šta treba da stoji umesto ###
da bi program korektno završio?
Calc c = (a) -> a * a;
Calc c = a -> a * a;
Calc c = a -> { a*a; }
Calc c = b -> b * b;
Calc c = (int a) -> a * a;
8. zadatak
Koje su tvrdnje tačne za podrazumevani ugrađeni konstruktor:
- Ukoliko nije definisan nijedan drugi konstruktor, prevodilac ga automatski obezbeđuje.
- Podrazumevano će samo pozvati podrazumevani konstruktor natklase.
- Neće pozvati podrazumevani konstruktor natklase samo u slučaju da je klasa direktno izvedena iz klase Object.
- Ukoliko je klasa javna, i on je podrazumevano javan.
- ??? svakako nešto netačno
9. zadatak
public class Spoljna {
int x = 1;
class Unutrasnja {
int x = 2;
void m(int x) {
System.out.print(###);
}
}
public static void main(String[] args) {
new Spoljna().new Unutrasnja().m(3);
}
}
Šta može sve stajati umesto ###
da bi program korektno završio i ispisao 1?
this.x
x
Spoljna.this.x
Outer.x
super.x
10. zadatak
Navesti tačne tvrdnje za izuzetke:
- Svi izuzeci u Javi moraju biti izvedeni iz klase Exception.
- Svi izuzeci koji se bacaju u metodu moraju se navesti u njegovoj throws klauzuli.
- Prevodilac može da proveri tipove izuzetaka navedenih u throws klauzuli.
- Metod može baciti izuzetak isključivo eksplicitnim navođenjem uz throw.
Napomene
- ↑ 1,0 1,1 1,2 1,3 1,4 Ovo nije bila navlakuša, već je trebalo da piše "implementira". Nekim studentima koji su ovakvu grešku smatrali namernom su bodovi koje su izgubili nezaokruživanjem tačnih tvrdnji zbog ove greške bili priznati naknadno.
- ↑ Ovo nije navlakuša već se misli pri konkretnom korišćenju, tako da treba, ali ne mora - samo neće raditi ništa.