poniedziałek, 2 czerwca 2008

Javowe Igraszki z kodem

W ramach opanowania swoich wrażeń po konferencji Javarsovia 2008 i konkursowego testu, postanowiłem zamieścić kilka javowych zagadek. Zapewne programiści Javy poradzą sobie z nimi od razu, ale "kropki" mogą mieć już więcej problemów. ;)

Na początku będą zagadki, pod nimi znajdziecie odpowiedzi, a na końcu ankietę, w które wstawcie swój wynik (tylko bez oszukiwania i kompilacji kodu! :P ). W przykładach używałem javy 1.5.

No więc zapraszam do kombinowania :)

Zagadki

1. Co wypisze się na ekran?




Odpowiedzi:

  1. Zmienna "i" będzie równa 0,
  2. Zmienna "i" będzie równa 69,
  3. Kod się nie skompiluje,
  4. Wystąpi błąd podczas działania aplikacji (RuntimeException).


2. Co wypisze się na ekran?



Odpowiedzi:

  1. 4,
  2. 127,
  3. Kod się nie skompiluje,
  4. Wystąpi błąd podczas działania aplikacji (RuntimeException).

3. Co wypisze się na ekran?



Odpowiedzi:

  1. here1 here2,
  2. here1 here2 here3 here4,
  3. here1 here2 here4,
  4. here2 here3 here4,
  5. here2 here4,
  6. Kod się nie skompiluje,
  7. Wystąpi błąd podczas działania aplikacji (RuntimeException).


4. Co wypisze się na ekran?



Odpowiedzi:

  1. pre b1 b2 r3 r2 hawk,
  2. pre b1 b2 r3 r2 hawk,
  3. pre b2 b1 r2 r3 hawk r1 r4,
  4. r1 r4 pre b1 b2 r3 r2 hawk,
  5. r1 r4 pre b2 b1 r2 r3 hawk,
  6. pre r1 r4 b1 b2 r3 r2 hawk,
  7. pre r1 r4 b2 b1 r2 r3 hawk ,
  8. Kod się nie skompiluje,
  9. Nie można określić poprawnej kolejności.
5. Co wypisze się na ekran?



Odpowiedzi:

  1. Jacek,
  2. Jacek is,
  3. Jacek is …,
  4. Jacek is stupid,
  5. Jacek is great,
  6. Jacek is stupid and great,
  7. Jacek is
    … stupid and great,
  8. Jacek is and,
  9. Kod się nie skompiluje,
  10. Nie można określić poprawnej kolejności.


Pokaż odpowiedzi



Odpowiedzi


Schowaj odpowiedzi

1.

Prawidłowa odpowiedź to 3. Klasa dziedziczy stan z klasy powyżej, a w klasie wyżej zmienna "i" ma private. Kod się oczywiście nie kompiluje.

2.

Poprawna odpowiedź to numer 3. Kod się nie kompiluje, ponieważ domyślnym wynikiem z operacji arytmetycznych jest int, a więc otrzymujemy przypisanie "byte c = jakiś wynik typu int". Aby kod się kompilował, niezbędne jest rzutowanie na int -> byte c = (byte) a + b.

3.

Prawidłowa odpowiedź to 2. Java dla niskich wartość (char <0, 127>, Boolean oraz int/double <-127, 128>) trzyma obiekty na stałe. Związane jest to z oszczędnością pamięci, która doprowadza do tego, że takie absurdalne przykłady w kodzie mają miejsce ;) (w Javie 1.6 autoboxing został 'zmodyfikowany' i powyższy kod się nie skompiluje).

4.

Odpowiedź prawidłowa to 4. Statyczne bloki wykonują się w czasie ładowanie klas, bloki inicjalizacyjne po wywołaniu super() w konstruktorze. Przy więcej niż jednym bloku, liczy się kolejność w kodzie.

5.

Tym razem dobrze zrobili Ci, co zaznaczyli odpowiedź numer 6! Typ enumeryczny został rozbudowany do tego stopnia, że używając go w switch-ach nie musimy w każdym case podawać nazwy enum-a. Coś na zasadzie "With" w Visual Basic. (w Javie 1.6 enumy zostały 'ulepszone' i powyższy kod się nie skompiluje).



Ankieta, czyli pochwal się wynikiem


I jak Wam poszło? Ja się przyznam, że zamieszczone w/w przykłady, to takie na których ja się wyłożyłem, a więc moja odpowiedź w ankiecie to 5 :P

Resources

  • Większość przykładów pochodzi/wywodzi się z książki "Scjp Sun Certified Programmer For Java 5 Study Guide (Exam 310-055)" - Kathy Sierra i Bert Batesa.
  • Konkurs javowy na konferencji Javarsovia 2008.
  • Blog Mariusza Lipińskiego, javowego eksperta i pogromcy kodu.

Zapraszam do komentowania i umieszczania swoich wyników. Jeśli macie jeszcze jakieś ciekawe przykłady to podsyłajcie, a na pewno zamieszczę je w kolejnych postach dotyczących javy.


Pozdrawiam,
Jacek Ciereszko


1 komentarz:

Mariusz Lipiński pisze...

O kurcze Jacek. Czytam sobie artykuł, czytam, myśle świetny, a wreszcie na końcu widzę miano pogromcy kodu jakie mi nadałeś - najlepszy art jaki kiedykolwiek widziałem! :)