ОО2/Пробни тестови 2021 — разлика између измена
м (Objašnjenja za stvari koje možda nisu najočiglednije) |
м (Ispravka u šestom zadatku autora koji nema nalog koji mogu da pomenem) |
||
Ред 122: | Ред 122: | ||
'''Odgovor:''' <span class="spoiler">ab</span> | '''Odgovor:''' <span class="spoiler">ab</span> | ||
'''Objašnjenje:''' <span class="spoiler">Prva završi sa inicijalizacijom klasa <code>A</code> kao natklasa klase <code>B</code>, a zatim se pozove konstruktor klase <code>B</code>. | '''Objašnjenje:''' <span class="spoiler">Prva završi sa inicijalizacijom klasa <code>A</code> kao natklasa klase <code>B</code>, a zatim se pozove konstruktor klase <code>B</code>. Pošto je metoda natklase označena kao <code>private</code>, ona neće biti polimorfno redefinisana u <code>B</code> i zato se iz konstruktora <code>A</code> poziva metod te klase.</span> | ||
=== 7. zadatak === | === 7. zadatak === |
Верзија на датум 13. мај 2021. у 17:29
- 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:
Kolokvijum - samotestiranje
Na svakom pitanju je bilo ili moguće izabrati jedno ili više rešenja ili uneti odgovor u polje.
1. zadatak
Koje tvrdnje za jezik Java su tačne?
- Interpretiranje bajtkoda je po pravilu efikasnije od izvršenja programa na mašinskom jeziku.
- JIT (Just In Time) prevodilac prevodi izvorni kod programa u bajtkod.
- Implementacija virtuelne mašine zavisi od konkretne platforme, ali interfejs prema bajtkodu ostaje isti.
- Izvorni kod programa se interpretira od strane virtuelne mašine.
- Izvorni kod programa se naziva bajtkod.
Objašnjenje: JIT prevodilac prevodi bajtkod u mašinske instrukcije prilikom izvršavanja, virtuelna mašina interpretira bajtkod i on je različit od izvornog koda po tome što prevodilac mora da prevede izvorni kod u bajtkod.
2. zadatak
Šta ispisuje sledeći program?
public class A {
public static void main(String[] args) {
String str1 = "abc", str2 = "abc", str3 = "ab" + "c", str4 = new String("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1==str4);
}
}
false
false
falsefalse
false
truetrue
false
falsetrue
true
falsetrue
true
true
Objašnjenje: Prevodilac će optimizovati[?] str3
prilikom prevođenja pa će str1
, str2
i str3
pokazivati na iste niske u string pool dok str4
izričito koristi nisku koja nije u string pool.
3. zadatak
Dat je sledeći program:
public class Primer{
int polje;
static void f(Object o){
if(o instanceof Primer)
((Primer)o).polje = 1;
else if (o instanceof Integer)
o = 0;
}
public static void main(String[] args){
Primer p = new Primer();
Integer i = 0;
f(p);
f(i);
System.out.println(p.polje + " " + i);
}
}
Odabrati tačan odgovor
- Kod je sintaksno neispravan.
- Program ispisuje vrednosti
0 0
. - Program ispisuje vrednosti
0 1
. - Program ispisuje vrednosti
1 0
. - Program ispisuje vrednosti
1 1
.
Objašnjenje: Prvi poziv f
će izmeniti polje klase na 1 preko reference dok drugi poziv neće izmeniti objekat i
jer se reference prenose po vrednosti. Bez obzira na ovo drugo, doduše, i
bi svakako bio 0.
4. zadatak
Za pakete na jeziku Java važi:
- Postoje tipovi koji mogu pripadati većem broju paketa.
- Svaka klasa mora biti deo nekog paketa.
- Uvoženjem paketa ne uvoze se i svi potpaketi tog paketa.
- Sve klase koje se nalaze u istoj datoteci su deo istog paketa.
- Paket
java.lang
se automatski uvozi. - U datoteci može postojati više naredbi:
package
naziv_paketa;
5. zadatak
Koje tvrdnje su tačne za nestatičke inicijalizacione blokove?
- Izvršavaju se nakon izvršavanja konstruktora svoje klase.
- Mogu bacati izuzetke.
- Može ih biti više u jednoj klasi.
- Izvršavaju se nakon punjenja klase u memoriju, a pre stvaranja prvog objekta date klase.
- Izvršavaju se nakon izvršavanja konstruktora natklase.
Objašnjenje: Nestatički inicijalizacioni blokovi mogu bacati izuzetke ukoliko su svi konstruktori klase deklarisani kao da te izuzetke bacaju.
6. zadatak
Šta ispisuje sledeći program na programskom jeziku Java? Upisati 0 ukoliko se program ne prevodi, odnosno 1 ukoliko postoji greška u vreme izvršavanja programa.
class A {
private void m() {
System.out.print("a");
}
public A() {
m();
}
}
class B extends A {
public void m() {
System.out.print("b");
}
public B() {
m();
}
}
public class Test {
public static void main(String args[]) {
new B();
}
}
Odgovor: ab
Objašnjenje: Prva završi sa inicijalizacijom klasa A
kao natklasa klase B
, a zatim se pozove konstruktor klase B
. Pošto je metoda natklase označena kao private
, ona neće biti polimorfno redefinisana u B
i zato se iz konstruktora A
poziva metod te klase.
7. zadatak
Modifikator abstract je moguće staviti ispred definicije:
- metoda
- klase
- interfejsa
- nabrajanja
- polja klase
8. zadatak
Šta važi za throw na programskom jeziku Java?
- Može se koristiti u statičkim inicijalizacionim blokovima.
- Predstavlja operator jezika Java.
- Parametar mu je referenca na objekat klase koja mora biti izvedena iz klase Exception.
- Može se koristiti bez parametra.
- Predstavlja ključnu reč jezika Java.
Objašnjenje: throw
se može koristiti u statičkim inicijalizacionim blokovima, ali samo ako se izuzeci bačeni preko njega u tom istom statičkom inicijalizacionom bloku i uhvate. Za razliku od C++, u Javi throw
nije operator već naredba (i ključna reč), i ponovno bacanje izuzetka sa throw;
nije dozvoljeno. Parametar mu je referenca na objekat izveden iz klase Throwable
, koja je nadklasa Exception
.
9. zadatak
Ukoliko su definisani sledeći interfejsi:
interface I1 {int m(int i);}
interface I2 {int m(int i, int k, int j);}
interface I3 {double m(int n);}
interface I4 {double m(double x, double y);}
interface I5 {int m(int i);}
koje od navedenih naredbi su ispravne?
int i=1,j=2; I5 i5=(i+j)->i*j;
I3 i3=k->{double p=1; for (int i=1; i<=k; p*=i++); return p;};
I2 i2=(x,y,z)->x+y-z;
I4 i4=(a,b)->{a*b};
I1 i1=n->n+5;
Objašnjenje: Izraz sa četvrtim interfejsom nije validan jer kada se lambda izraz okruži blokom ({}
) više se ne podrazumeva return
. Izraz sa petim interfejsom ima sintaksnu grešku, jer (i+j)->...
nema smisla.
10. zadatak
Koja tvrđenja su tačna na programskom jeziku Java?
- Ako je pre ulaska u
wait()
pozvan metodnotifyAll()
za isti objekat, nit koja pozivawait()
neće biti blokirana. - Po ulasku u
wait()
, nit se blokira (suspenduje) i oslobađa se brava objekta. - Metodi
wait()
,notify()
inotifyAll()
moraju da se pozivaju iz sinhronizovanih delova koda. - Metod
notify()
budi samo jednu nit i to uvek onu koja je najduže čekala. wait()
je metod klaseThread
.
Objašnjenje: wait()
je metod klase Object
, dok notify()
ne budi nužno nit koja je najduže čekala.