1. Co platí pro následující kód?
public class Main {
public static void foo(int i) {
i = 10;
}
public static void main(String[] args) {
Integer i = 0;
foo(i);
System.out.println(i);
}
}
A. Lze přeložit a vypíše
B. Lze přeložit a vypíše
C. Lze přeložit, ale nelze určit, co se vypíše
D. Nelze přeložit, protože nesouhlasí typ parametru předávaného do metody foo
2. Které z definicí proměnné jsou korektní pro následující blok kódu?
synchronized (s) {
// ...
}
A. synchronized nelze tímto způsobem použít
B. boolean s = true;
C. Object s = new Object()
D. String s = "Hello";
E. int s = 100;
3. Uvažujme následující kód (Výjimky):
class MyException extends java.lang.Exception {}
class MyExceptionExt extends MyException {}
public class A {
public void foo(int i) throws MyException {
if (i < 0) {
throw new /* type of exception here */ ();
}
}
}
Které z následujících výjimek lze vyhodit na řádku tak, aby byl kód přeložitelný?
A. MyException
B. java.lang.Exception
C. MyExceptionExt
D. java.lang.Error
E. java.lang.RuntimeException
4. Mějme následující kód:
/* uloženo v souboru A.java */
public interface A {
void foo(int i);
default void bar() {
foo(0);
}
}
/* uloženo v souboru B.java */
public class B implements A {
public void foo(int i) {
System.out.println(i);
}
public void bar() {
System.out.println("Hello");
}
}
Které z následujících tvrzení jsou pravdiva
A. Interface A i třída B překladač přeloží zcela bez chyb.
B. nelze přeložit, chyba je na řádku – z defaultní metody nelze volat nedefaultní metodu B (a protože nelze přeložit A, nelze přeložit B)
C. překladač přeloží bez chyby, ale nikoliv – chyba na řádku - chybí modifikátor default.
5. Uvažujme následující třídu. Upravte text třídy tak, aby byla přeložitelná kompilátorem bez chyby. Můžete kód přidávat, ale nesmíte stávající odebírat.
public class MyClass {
abstract void foo();
}
6. Napište metodu copyFromSetToSet, která kopíruje elementy z jednoho "setu" do druhého. Set je kolekce (objekt obsahující jiné objekty), která daný element může obsahovat maximálně jednou. Je reprezentována rozhraním Set, kde typový parametr reprezentuje typ elementů v kolekci. Na tomto rozhraní je definována metoda void add(T obj) pro vložení elementu. Přistupovat k elementům přímo nelze, ale lze iterovat přes "set" pomocí iterátoru (Set implementuje standardní rozhraní Iterable).
7. Metoda void log(Supplier<String> supp) vytiskne na standardní výstup řetězec, který jí předá Supplier předaný v parametru. Metodu lze volat například takto: log(() -> "Hello");
Interface Supplier je definován následovně:
interface Supplier<T> {
T get();
}
Naimplementujte metodu log:
void log(Supplier<String> supp) {
8. Následující blok kódu kopíruje jeden soubor do druhého. Za použití try/catch/finally opravte kód tak, aby byl korektní a byly ošetřeny všechny možné výskyty výjimek (připomenutí – veškeré operace se soubory (apod.) mohou způsobit IOException).
FileInputStream fis = new FileInputStream(inFile);
FileOutputStream fos = new FileOutputStream(outFile);
int c;
while ((c = fis.read()) != -1) {
fos.write(c);
}
9. Napište třídu StringUtils a v ní metodu concat, která jako parametry dostane dva řetězce a vrátí řetězec obsahující jejich spojení. Metodu musí být možné volat odkudkoliv a z jakéhokoliv kontextu. Nápověda: pozor na modifikátory metody.
10. Napište metodu countOlder, která vrátí počet osob s daným věkem nebo starší. Osoby s nevhodně nastaveným jménem (atribut jméno bude null nebo prázdný řetězec), nebudou do výsledku zahrnuty.
public class Test {
public static class Person {
String name;
int age;
}
}
public int countOlder(int age, Person[] items) {