Przejdź do treści
INF.04 · część pisemna

Paradygmaty programowania

Przed Tobą 10 pytań w formule egzaminu CKE.

Pytanie 1 / 10Algorytmika i Logika
Programista napisał klasę Pracownik, a następnie utworzył operatorem new dwa egzemplarze: p1 oraz p2. Które stwierdzenie jest poprawne?
Wszystkie 10 pytań z wyjaśnieniamiRozwiń, jeśli wolisz przejrzeć zestaw bez rozwiązywania testu.

Filary programowania obiektowego: hermetyzacja, dziedziczenie, polimorfizm i abstrakcja oraz relacje między klasami.

1.Programista napisał klasę Pracownik, a następnie utworzył operatorem new dwa egzemplarze: p1 oraz p2. Które stwierdzenie jest poprawne?

  • A.Klasa i obiekt to synonimy, więc p1 oraz p2 są klasami typu Pracownik
  • B.Klasa zajmuje pamięć na dane, a obiekty przechowują wyłącznie metody
  • C.Klasa jest wzorcem, a p1 oraz p2 mają własne komplety wartości pól— poprawna
  • D.Każdy obiekt ma własną kopię metod, ale wspólne wartości wszystkich pól
Dlaczego: Klasa jest tylko deklaracją typu i sama nie przechowuje stanu; dopiero operator new rezerwuje pamięć na instancję. Kusi odpowiedź o wspólnych wartościach pól, ale współdzielone przez wszystkie obiekty są wyłącznie składowe oznaczone słowem static.

2.Klasa Programista dziedziczy po klasie Pracownik i zawiera metodę public double obliczWynagrodzenie() bez parametrów. Metoda o dokładnie takiej samej sygnaturze istnieje już w klasie Pracownik. Jaki to mechanizm?

  • A.Przeciążanie metody, rozstrzygane na etapie kompilacji
  • B.Przesłanianie metody, rozstrzygane w czasie wykonania programu— poprawna
  • C.Przeciążanie konstruktora odziedziczonego z klasy bazowej
  • D.Ukrywanie pola klasy bazowej przez pole klasy pochodnej
Dlaczego: Rozstrzyga lista parametrów: identyczna sygnatura w klasie pochodnej oznacza nadpisanie wersji bazowej, a wybór wersji następuje po typie obiektu w czasie wykonania. Odpowiedź o przeciążaniu kusi, bo nazwa metody też się powtarza, ale tam parametry musiałyby się różnić.

3.Klasa Kalkulator zawiera metodę public int dodaj(int a, int b). Dopisano do niej metodę public double dodaj(int a, int b). Jak zareaguje kompilator Javy?

  • A.Zgłosi błąd, ponieważ sam typ zwracany nie odróżnia przeciążeń— poprawna
  • B.Przyjmie kod, ponieważ inny typ zwracany tworzy poprawne przeciążenie
  • C.Przyjmie kod i potraktuje nową metodę jako przesłonięcie starszej
  • D.Przyjmie kod i wybierze wersję double dopiero w czasie wykonania
Dlaczego: Przeciążenia rozróżnia się po liczbie i typach parametrów, bo tylko one są widoczne w miejscu wywołania. Uczniowie często zakładają, że typ zwracany wystarczy, jednak kompilator nie miałby jak wybrać wersji dla wywołania, w którym wynik jest ignorowany.

4.Pole pensjaPodstawowa ma być dostępne wewnątrz klasy Pracownik oraz w klasach po niej dziedziczących, ale niedostępne dla pozostałego kodu programu. Który modyfikator należy zastosować?

  • A.private
  • B.public
  • C.static
  • D.protected— poprawna
Dlaczego: Tylko jeden modyfikator daje dokładnie tę kombinację: dostęp w klasie i w potomkach, brak dostępu z zewnątrz. Wybór private kusi, bo kojarzy się z ukrywaniem danych, ale odcina też klasy pochodne; static w ogóle nie dotyczy widoczności, lecz przynależności do klasy.

5.Klasa Pracownik ma pole private String imie oraz metodę public String getImie(). Klasa Programista dziedziczy po klasie Pracownik. W jaki sposób Programista może odczytać wartość tego pola?

  • A.Nie może, bo pole prywatne nie jest w ogóle tworzone w obiekcie klasy pochodnej
  • B.Za pomocą odziedziczonej metody getImie(), bo samo pole pozostaje niedostępne— poprawna
  • C.Bezpośrednio przez this.imie, ponieważ dziedziczenie znosi modyfikator private
  • D.Bezpośrednio przez super.imie, ponieważ super omija modyfikatory dostępu
Dlaczego: Składowa prywatna fizycznie istnieje w obiekcie klasy pochodnej, lecz kod tej klasy nie ma do niej dostępu wprost i musi skorzystać z odziedziczonej metody publicznej. Kusi zapis przez super, ale słowo super sięga po składowe bazowe, nie zmienia ich widoczności.

6.Na czym polega hermetyzacja i jaka jest rola getterów oraz setterów?

  • A.Na dziedziczeniu pól z klasy bazowej, a gettery kopiują je do klasy pochodnej
  • B.Na oznaczeniu metod słowem static, a gettery udostępniają je bez tworzenia obiektu
  • C.Na ukryciu pól jako private i udostępnieniu ich metodami pilnującymi poprawności danych— poprawna
  • D.Na podziale dużej klasy na mniejsze, a gettery łączą je z powrotem w jedną całość
Dlaczego: Sens tego mechanizmu jest praktyczny: skoro pole zmienia wyłącznie metoda, można w niej sprawdzić warunki, na przykład odrzucić pensję poniżej minimalnej. Uczniowie mylą hermetyzację z abstrakcją albo z dziedziczeniem, bo wszystkie trzy opisuje się hasłem ukrywania szczegółów.

7.Metoda obliczWynagrodzenie() klasy Pracownik zwraca pensjaPodstawowa, a dziedzicząca po niej klasa Menedzer przesłania ją wzorem pensjaPodstawowa * 1.2 + liczbaPodwladnych * 150. Co wypisze kod: Pracownik p = new Menedzer(8000, 4); System.out.println(p.obliczWynagrodzenie());

  • A.8000.0
  • B.9600.0
  • C.8600.0
  • D.10200.0— poprawna
Dlaczego: O wyborze wersji metody decyduje typ obiektu utworzonego operatorem new, a nie typ zmiennej, więc liczy się wzór 8000 razy 1.2 plus 4 razy 150. Wynik 8000.0 kusi tych, którzy patrzą na typ referencji, a 9600.0 tych, którzy pomijają drugi składnik wzoru.

8.Które zdanie poprawnie opisuje różnicę między klasą abstrakcyjną a interfejsem w Javie?

  • A.Klasa abstrakcyjna ma konstruktor i pola z danymi, a rozszerzyć można tylko jedną taką klasę— poprawna
  • B.Interfejs ma konstruktor i pola z danymi, a zaimplementować można tylko jeden interfejs
  • C.Z klasy abstrakcyjnej można utworzyć obiekt operatorem new, a z interfejsu nie można
  • D.Klasa abstrakcyjna nie może zawierać metod z implementacją, a interfejs może je zawierać
Dlaczego: Interfejs jest czystym kontraktem: bez konstruktora i bez stanu, jego pola to stałe public static final, za to klasa może wdrożyć dowolnie wiele interfejsów. Kusi twierdzenie o tworzeniu obiektu, ale ani z klasy abstrakcyjnej, ani z interfejsu instancji utworzyć się nie da.

9.Klasa Zespol przyjmuje w parametrze konstruktora listę gotowych obiektów klasy Pracownik i zapamiętuje przekazane referencje. Jaka to relacja między klasami?

  • A.Kompozycja, ponieważ obiekty klasy Pracownik giną razem z obiektem klasy Zespol
  • B.Dziedziczenie, ponieważ zespół jest rodzajem zbioru obiektów klasy Pracownik
  • C.Agregacja, ponieważ obiekty klasy Pracownik istnieją niezależnie od zespołu— poprawna
  • D.Polimorfizm, ponieważ lista przechowuje obiekty wielu klas pochodnych naraz
Dlaczego: Rozstrzyga miejsce powstania części: obiekt przekazany z zewnątrz przeżywa całość, więc powiązanie jest luźne i na diagramie UML oznacza się je pustym rombem. Kompozycja kusi, bo też jest relacją posiadania, lecz wymaga tworzenia części wewnątrz konstruktora całości.

10.Konstruktor klasy Pracownik wypisuje literę A, a konstruktor dziedziczącej po niej klasy Programista wypisuje literę B i rozpoczyna się od wywołania super(...). Co pojawi się na ekranie po wykonaniu instrukcji new Programista(...)?

  • A.Litera B, a po niej litera A
  • B.Litera A, a po niej litera B— poprawna
  • C.Tylko litera B, bo konstruktory nie są dziedziczone
  • D.Tylko litera A, bo konstruktor bazowy przesłania pochodny
Dlaczego: Zanim klasa pochodna zacznie ustawiać własne pola, musi mieć gotową część odziedziczoną, dlatego wywołanie super() jest pierwszą instrukcją i kończy się przed resztą konstruktora. W C++ destruktory idą odwrotnie: najpierw pochodny, potem bazowy, co bywa mylone z kolejnością konstruktorów.

To nie koniec powtórki

Przećwicz kolejny zestaw i utrwal materiał przed egzaminem.

Dalej: Języki programowania