# Zkouška 23.1.2023

<{ForumPost(poster="ruby", timestamp=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)  
  
2) 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  
  
3) 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  
  
4) 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  
  
5) 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)  
  
6) 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).  
  
7) 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íš).  
  
8) 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;
        }
    }
    

9) 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);
      }
    }
    

10) 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();
                }
            };
        }
    }
    


<{/ForumPost}>

<{ForumPost(poster="__Karlord19", timestamp=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
<{/ForumPost}>

<{ForumPost(poster="ruby", timestamp=2024-01-25 18:07:48)}>

 > [__Karlord19](/var/www/html/forum.matfyz.info/memberlist.php?mode=viewprofile&u=1) wrote: [↑](/var/www/html/forum.matfyz.info/viewtopic.php?p=58742#p58742)
 > 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
<{/ForumPost}>

