15  Dziedziczenie

  1. Wykonaj kolejno poniższe czynności:

    1. Stwórz klasę bazową Person z prywatnym polem firstName oraz chronionym polem lastName. Następnie stwórz klasę Employee, która dziedziczy po klasie Person. W klasie Employee próbuj odnieść się do obu pól i zauważ, które z nich są dostępne.
    2. Na bazie klasy Person z poprzedniego podpunktu, stwórz metody dostępowe (gettery) dla obu pól. W klasie Employee stwórz metodę displayData, która korzysta z tych metod dostępowych, aby wypisać informacje o pracowniku. Zastanów się, dlaczego metody dostępowe są używane do dostępu do prywatnych pól.
  2. Stwórz klasę bazową Book z prywatnym polem title oraz chronionym polem author. Stwórz klasę potomną Ebook, która dziedziczy po klasie Book. W klasie Ebook spróbuj zmienić modyfikator dostępu dla obu pól z klasy bazowej. Zastanów się, dlaczego jedno z pól pozwala na to, a drugie nie.

  3. Stwórz klasę Tool z chronionym konstruktorem, który przyjmuje nazwę narzędzia. Następnie stwórz klasę potomną Hammer, która dziedziczy po klasie Tool. W klasie Hammer stwórz konstruktor, który korzysta z konstruktora klasy bazowej. Zastanów się, dlaczego używając modyfikatora private dla konstruktora klasy bazowej, taki scenariusz nie byłby możliwy.

  4. Stwórz dwa różne pakiety: animals i mammals. W pakiecie animals stwórz klasę bazową Animal z chronionym polem species i prywatnym polem age. W pakiecie mammals stwórz klasę Dog, która dziedziczy po klasie Animal. Spróbuj odnieść się w klasie Dog do obu pól z klasy bazowej i zauważ, które z nich są dostępne.

  5. Wykonaj kolejno poniższe czynności:

    1. Stwórz klasę bazową Vehicle z metodą drive, która wypisuje “The vehicle is moving.”. Następnie stwórz klasę potomną Car, która nadopisuje metodę drive tak, by wypisywała “The car is moving.”. Utwórz obiekt klasy Car i wywołaj jego metodę drive, aby zaobserwować wynik.
    2. Na bazie klasy Vehicle z poprzedniego podpunktu, w klasie Car, nadpisz metodę drive tak, by wywoływała oryginalną metodę z klasy bazowej i dodatkowo wypisywała informacje specyficzne dla klasy Car. Użyj słowa kluczowego super, aby wywołać metodę z klasy bazowej.
  6. Stwórz klasę Calculator z metodą add, która przyjmuje dwa argumenty typu int i zwraca ich sumę. Następnie stwórz klasę potomną ExtendedCalculator, która nadpisuje metodę add w taki sposób, by przyjmowała trzy argumenty typu int i zwracała ich sumę. Zastanów się, czy to faktycznie nadpisywanie metody, czy może coś innego.

  7. Stwórz klasę bazową Base z metodą statyczną info, która wypisuje “This is the base class.”. Następnie stwórz klasę potomną Child i próbuj przesłonić metodę statyczną info tak, by wypisywała “This is the child class.”. Zastanów się nad zachowaniem tak przesłoniętych metod i dlaczego takie przesłanianie jest inaczej traktowane.

  8. Stwórz klasę bazową Computer z chronioną metodą start, która wypisuje “Computer started.”. Stwórz klasę potomną Laptop, która próbuje nadpisać metodę start, ale z modyfikatorem dostępu public. Spróbuj skompilować kod i zastanów się, dlaczego występują pewne ograniczenia w nadpisywaniu metod pod względem modyfikatorów dostępu.

  9. Stwórz klasę bazową o nazwie Vehicle z polami: brand i model. Klasa ta powinna posiadać konstruktor przyjmujący oba te parametry. Następnie stwórz klasę potomną o nazwie Car, która dziedziczy po klasie Vehicle. Klasa Car powinna posiadać dodatkowe pole numberOfDoors. Stwórz konstruktor dla klasy Car, który przyjmuje wszystkie trzy parametry i korzysta z konstruktora klasy bazowej. Stwórz przypadek testowy.

  10. Stwórz klasę bazową o nazwie Animal z polem name oraz konstruktor z domyślnym przypisaniem nazwy do “Unknown”. Następnie stwórz klasę Dog, która dziedziczy po klasie Animal. Nie twórz w niej dodatkowego konstruktora. Sprawdź, jakie zwierzę zostanie utworzone, gdy stworzysz nową instancję klasy Dog.

  11. Stwórz klasę bazową o nazwie Building z polami: height i color. Klasa ta powinna posiadać dwa konstruktory: jeden przyjmujący oba parametry i drugi bezparametrowy, który przypisuje domyślne wartości. Stwórz klasę potomną House z dodatkowym polem numberOfRooms. Klasa House powinna posiadać konstruktor, który wykorzystuje przeciążony konstruktor klasy bazowej. Stwórz przypadek testowy.

  12. Stwórz trzy klasy: Entity, Human i Programmer. Klasa Human powinna dziedziczyć po klasie Entity, a klasa Programmer po klasie Human. W każdej z klas dodaj konstruktor, który wypisuje informację o tworzeniu instancji danej klasy. Stwórz instancję klasy Programmer i zaobserwuj kolejność wywoływania konstruktorów.

  13. Utwórz klasę Vehicle z polami brand, model i yearOfProduction. Utwórz klasy Car i Motorcycle, które dziedziczą po klasie Vehicle. Klasa Car powinna mieć dodatkowe pole numberOfDoors, a klasa Motorcycle pole engineCapacity. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  14. Utwórz klasę Employee z polami firstName, lastName i salary. Utwórz klasy Programmer i Tester, które dziedziczą po klasie Employee. Klasa Programmer powinna mieć dodatkowe pole programmingLanguage, a klasa Tester pole testingType. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  15. Utwórz klasę Property z polami address, size i price. Utwórz klasy House i Apartment, które dziedziczą po klasie Property. Klasa House powinna mieć dodatkowe pole numberOfFloors, a klasa Apartment pole floorNumber. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  16. Utwórz klasę BoardGame z polami gameName, minPlayers, maxPlayers oraz rules (jako ArrayList typu String). Utwórz klasy EducationalGame i StrategicGame, które dziedziczą po klasie BoardGame. Klasa EducationalGame powinna mieć dodatkowe pole subject, a klasa StrategicGame pole duration. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  17. Utwórz klasę Team z polami name, city oraz points (jako ArrayList typu Integer). Utwórz klasy SoccerTeam i VolleyballTeam, które dziedziczą po klasie Team. Klasa SoccerTeam powinna mieć dodatkowe pole rankingPosition, a klasa VolleyballTeam pole numberOfVictories. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  18. Utwórz klasę Computer z polami manufacturer, model oraz partsPrices (jako ArrayList typu Double). Utwórz klasy Laptop i Desktop, które dziedziczą po klasie Computer. Klasa Laptop powinna mieć dodatkowe pole weight, a klasa Desktop pole caseType. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  19. Utwórz klasę MusicAlbum z polami title, artist oraz ratings (jako ArrayList typu Integer). Utwórz klasy RockAlbum i JazzAlbum, które dziedziczą po klasie MusicAlbum. Klasa RockAlbum powinna mieć dodatkowe pole rockGenre, a klasa JazzAlbum pole jazzGenre. Dodaj konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode() dla każdej z klas. Napisz program testujący zdefiniowane klasy i metody.

  20. Utwórz klasę Book z polami author, title i yearOfPublication. Następnie utwórz dwie klasy pochodne: Ebook, która dodaje pole fileSize i PaperbackBook, która dodaje pole numberOfPages. Każda z klas powinna zawierać konstruktory, metody gettery i settery, metodę toString(), equals() oraz hashCode(). W metodzie equals() klasy Book porównaj tylko author, w klasie Ebook po author i fileSize, a w klasie PaperbackBook porównaj author i numberOfPages. Napisz program testujący te klasy, demonstrujący działanie polimorfizmu i porównanie obiektów.

  21. Zaprojektuj klasę Employee z polami name, department i salary. Utwórz dwie klasy pochodne: Manager z dodatkowym polem bonus i Intern z polem internshipLength. Każda klasa powinna mieć konstruktory, gettery i settery, toString(), equals() oraz hashCode(). W metodzie equals() klasy Employee porównaj tylko name, w klasie Manager po name i bonus, a w klasie Intern porównaj name i internshipLength. Napisz program testujący te klasy, demonstrujący działanie polimorfizmu i porównanie obiektów.