Zagadka w języku Java

Maj 18th, 2009 · 5 Comments ·

Dzisiaj na mojej uczelni odbywały się coroczne Trójmiejskie Targi Pracy. Jedna z firm przedstawiających swoje oferty, Sygnity, zorganizowała mały konkurs z nagrodami. Konkurs miał 10 pytań o tematyce programistycznej (Java, JEE, SQL, build-scripts). Z testu uzyskałem wynik 9/10. Potknąłem się na rzeczy, której byłem po prostu pewien – na analizie krótkiego kodu w języku Java.

Należy dodać, że nie był to typowy konkurs, w którym pytają o imię głównego bohatera serialu Świat wg Kiepskich, dając do wyboru Zbigniewa, Ferdynanda i Jerzego. Test zgrabnie stwierdzał, czy jesteś oczytany w tematach związanych z programowaniem. Jeden z wykładowców, pan Kaczmarek, mawiał na wykładach o Linuksach, że wiedza jest banalna, jeśli się pozna polecenie i niemożliwa do wymyślenia, jeśli tego polecenia na oczy nie widzieliśmy.

Poniżej umieszczam zadanie testowe, które mnie wkopało. Kurczę, podium było tak blisko :>

class A {
    public String a = "3";

    public String getA() {
        return this.a;
    }
}

class B extends A {
    public String a = "5";

    public String getA() {
        return this.a;
    }
}

public class C {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.a + ", " + a.getA());
    }
}

Jaki będzie wynik działania tego programu?

  • 3, 3
  • 3, 5
  • 5, 3
  • 5, 5

Proponuję najpierw udzielić odpowiedź, a dopiero potem sprawdzić sobie rezultat na żywo. Ja po prostu nie wiedziałem, że tak to działa. Może dlatego, że zgodnie z zasadą enkapsulacji nie pozostawiałem nigdy żadnych publicznych pól? Ale teraz już wiem :-)

P.S. W losowaniu jedną z nagród zgarnął oczywiście Zal, masowy wygrywacz wszystkich konkursów :D Ale dzięki temu miałem przyjemność poznać go osobiście.

Tags: Programowanie

Jest już 5 komentarzy ↓

  • Airborn // maj 18, 2009 at 22:55

    Ja bym obstawiał na 3, 5

  • Nowaker // maj 18, 2009 at 22:58

    I taka też jest prawidłowa odpowiedź. Wystarczy wiedzieć, że dostęp do właściwości działa trochę inaczej, niż do metod.

  • Airborn // maj 18, 2009 at 23:02

    To ‘wina’ tego, że w Javie wszystkie funkcje są wirtualne.

  • Nowaker // maj 18, 2009 at 23:07

    Ja akurat nie wiedziałem, w jaki sposób odbywa się dostęp do właściwości. Zaznaczyłem 5, 5.

  • Antoni Jakubiak // cze 2, 2009 at 08:11

    I słusznie, że nie znałeś prawidłowej odpowiedzi. Kod z przykładu jest po prostu zepsuty. Prawidłowa odpowiedź na pytanie jest taka, że kodu z przykładu nie powinniśmy w ogóle kompilować. Miejmy nadzieję, że w Sygnity tak nie programują… bo wiele projektów rządowych było by w niebezpieczeństwie…

Zostaw swój komentarz

W treści komentarza obowiązuje składnia Markdown.
**pogrubienie**, *kursywa*, nowy akapit - dwa znaki nowej linii