**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 $10$  
- B. Lze přeložit a vypíše $0$  
- 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é $s$ 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 $10$ 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. $A$ nelze přeložit, chyba je na řádku $5$ – z defaultní metody nelze volat nedefaultní metodu B (a protože nelze přeložit A, nelze přeložit B) 
- C. $A$ překladač přeloží bez chyby, ale $B$ nikoliv – chyba na řádku $14$ - 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) {
~~~