*Zadeklarować klasę Samochod(abstrakcyjna, metody: poruszajSie, dajDzwiek), która dziedziczy z klasy Obiekt (metoda: getNazwa/setNazwa, k. abstrakcyjna). Zdefiniować klasę Mazda oraz Toyota (dziedziczą z samochodu). Konstruktor konkretnych samochodów ma przyjmować nazwę jako argument (np. dla mazdy "CX-7").
Zaprezentować działanie programu (utworzyć obiekty poprzez wywołanie konstruktorów dla toyoty i mazdy w tym ustawić nazwę).
*Zmodyfikować program w następujący sposób:
utworzyć konstruktory domyslne wypisujące na konsolę nazwę klasy tworzonego obiektu. Omówić kolejność wykonywania konstruktora. Czy konstruktor klasy abstrakcyjnej jest wywoływany?
*Dopisać do klas Toyota, Mazda, oraz samochod konstruktory, które przyjmują argument - nazwa. Nazwa ta ma być ustawiana w klasie Samochod. Konstruktory poszczególnych klas powinny wyświetlać nazwę klasy tworzonego obiektu.
*Zadeklarować statyczny, globalny obiekt typu Mazda. Odpowiedzieć na pytanie, czy wywoływany jest konstruktor i ew. w którym momencie działania procesu?
*Utworzyc klase fabryka, która ma zawierać metody: samochod* utworzSamochod(typ), zwracający nowy samochod(Mazdę albo Toyotę w zależności od typu). Druga metoda to metoda samochod napraw(samochod s) - która konkatenuje nazwę z stringiem "Naprawiony".
Zaprezentować działanie konstruktora kopiującego (utworzyć za pomocą metody utworzSamochod konkrenty typ samochodu i wykonać na nim metodę napraw, uprzednio definując konstruktor kopiujący dla samochodu).
*Dla każdej klasy napisać destruktor (ma zwalniać przydzieloną pamięć np. nazwa).
Jawnie dla mazdy i toyoty wywołać destruktory. Odpowiedzieć na pytanie czy zwolniono pamięć?
Usunąć wszystkie obiekty.
*Napisać klasę singleton (może istnieć tylko jeden obiekt takiej klasy, konstruktor prywanty, statyczna zmienna(wskaznik) tej klasy w niej samej, statyczna metoda getInstance() zwracająca obiekt tejże klasy(ew. jeśli obiekt nie istnieje to tworzy obiekt, jeśli istnieje to go zwraca)).