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 1010

  • B. Lze přeložit a vypíše 00

  • 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é ss 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 1010 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. AA nelze přeložit, chyba je na řádku 55 – z defaultní metody nelze volat nedefaultní metodu B (a protože nelze přeložit A, nelze přeložit B)

  • C. AA překladač přeloží bez chyby, ale BB nikoliv – chyba na řádku 1414 - 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) {