Zkouška 23.1.2023

ruby at 2023-01-24 19:09:25

Zkouška vypadala podobně jako v minulých letech. Znění ani odpovědi asi nejsou úplně přesné, ale logika otázek snad zachována.

  1. Co vypíše následující kód?

    public class A { public static void appendToString(String s) { s = s + " world"; }

     public static void main(String[] args) {
         String s = "Hello";
         appendToString(s);
         System.out.println(s);
     }
    

    }

Odpověď: Hello (stringy jsou immutable)

  1. Co vypíše následující kód?

    public class A { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5, 6}; System.out.println(array[1] + array[3]); } }

Odpověď: 6

  1. Co udělá následující kód, pokud jsou zaplé asserty?

    public class A { public static void setInterval(int i) { assert i > 0; //... }

     public static void main(String[] args) {
         setInterval(-1);
     }
    

    }

Odpověď: vyhodí výjimku AssertionError a ukončí program

  1. Co vypíše následující kód, pokud metoda someMethod vyhodí MyException?

    public class A { public static void main(String[] args) { try { someMethod(); } catch (MyException e) { System.out.println("MyException"); } catch (Exception e) { System.out.println("Exception"); } finally { System.out.println("finally"); } } }

Odpověď: MyException finally

  1. Mějme 3 interfaces:

    interface Callable<T> {T call(); }

    interface Supplier<T> {T get(); }

    interface Predicate<T>{boolean test(T t); }

Který z následujících kódů se přeloží?

Supplier<Boolean> su = () -> { return true; };
Callable<Boolean> sa = () -> { return true; };
Predicate<Boolean> pr = () -> { return true; };

Odpověď: A, B (predikát potřebuje parametr)

  1. Doplňte kód tak, aby se přeložil bez chyby. Chyba je na 2. a 3. řádku.

    enum Answer { NO, YES;

     private boolean isYes;
    
     private Answer(boolean isYes) {
         this.isYes = isYes;
     }
    

    }

Odpověď: Je třeba změnit na NO(false) a YES(true).

  1. Ke kterému objektu se vztahuje keyword this?

    public class A { public void someMethod() { Thread t = new Thread(() -> System.out.println(this)); } }

Odpověď: K objektu t (nejspíš).

  1. Napište čítač (long) s metodami inc() a get(), který bude thread-safe.

Odpověď: Metody musí být synchronized.

public class Counter {
    private long counter = 0;

    public synchronized void inc() {
        counter++;
    }

    public synchronized long get() {
        return counter;
    }
}
  1. Napište metodu, která má dva parametry typu int, hrubou mzdu a daň v procentech, a vrací hodnotu typu double udávající daň k zaplacení. Ověřte, že daň je v rozmezí 0–100 a mzda je nezáporná, pokud parametry nejsou v pořádku vyhoďte výjimku MyException, která je přímým potomkem java.lang.Exception (předpokládá se, že je deklarovaná a importovaná).

Odpověď: Nezapomenout na dělení ve float-point aritmetice.

public class TaxCalculator {
  public double calculateTax(int gross, int taxPercentage) throws MyException {
    if(gross < 0 || taxPercentage < 0 || taxPercentage > 100) throw new MyException();
    return gross * (taxPercentage / 100.0);
  }
}
  1. Doplňte do kódu implementaci iterátoru, který musí být implementován jako anonymní třída.

    interface Iterator<T> { boolean hasNext(); T next(); }

    public class A { int[] elements; int numElements;

    public static void main(String[] args) {
        Iterator<Integer> it = // doplňte kód
    }
    

    }

Odpověď:

public class A {
    int[] elements;
    int numElements;

    public static void main(String[] args) {
        Iterator<Integer> it = new Iterator<Integer>() {
            private int i = 0;

            @Override
            public boolean hasNext() {
                return i < numElements;
            }

            @Override
            public Integer next() {
                if(hasNext) return elements[i++];
                else throw new NoSuchElementException();
            }
        };
    }
}
__Karlord19 at 2024-01-21 11:41:51

K otázce 7: myslím že this se vztahuje k instanci třídy A, ke které se vztahuje ta metoda someMethod

public class A
{
    public String toString() {
        return "hello there";
    }

    public void someMethod() {
        Thread t = new Thread(() -> System.out.println(this));
        t.start();
    }
    
    public static void main(String[] args) {
        A a = new A();
        a.someMethod();
    }
}

v tomto případě se vypíše hello there, jakožto stringová reprezentace oné instance třídy A

další věc je, že se nezkompiluje, když metodu someMethod dáme jako statickou:

non-static variable this cannot be referenced from a static context

můžu se plést, tak mi kdyžtak řekněte kde

ruby at 2024-01-25 18:07:48

__Karlord19 wrote: K otázce 7: myslím že this se vztahuje k instanci třídy A, ke které se vztahuje ta metoda someMethod

jo, máš pravdu. taky jsem to zkusil