Witam. Robię zadania z książki Thinking Java i doszedłem do rozdziału Klasy abstrakcyjne i napotkałem następujące problemy. Mam zadanie o następującej treści:
Utwórz klasę bazową z abstrakcyjną metodą print(), przesłoniętą w klasach pochodnych. Wersja przesłonięta metody ma wypisywać wartość składowej int zdefiniowanej w klasie pochodnej. W miejscu definiowania zmiennej nadaj jej wartość niezerową. W konstruktorze klasy bazowej wywołaj metodę. W metodzie main() utwórz obiekt klasy pochodnej, a potem wywołaj na jego rzecz metodę print(). Wyjaśnij zaobserwowane efekty.
Napisałem coś takiego:
abstract class Klasa {
Klasa() {
print();
}
abstract void print();
}
class Klasa1 extends Klasa {
int i = 10;
void print() {
System.out.println(i);
}
}
public class Glowna {
public static void main(String[] args) {
Klasa1 k = new Klasa1();
k.print();
}
}
W wyniku wykonania programu otrzymuje:
0
10
I mam problem z wyjaśnieniem zaobserwowanych efektów. Mianowicie w wyniku dostaje to 0, i zupełnie nie wiem skąd się to wzięło. Domyślam się, że przy tworzeniu obiektu Klasa1 wywoływany jest konstruktor abstrakcyjnej klasy Klasa, który z kolei wywołuje abstrakcyjną metodę print i wypisuje 0. Czemu skoro ta metoda jest abstrakcyjna i nie powinna wypisywać żadnej wartości, w ogóle chyba nie powinna się uruchomić. Zupełnie nie rozumiem czemu tak się dzieje.
Drugie zadanie ma treść:
Utwórz klasę abstrakcyjną bez żadnych metod. Wyprowadź z niej klasę pochodną i uzupełnij ją o metodę. Utwórz metodę statyczną, która przyjmuje referencję klasy bazowej, rzutuje ją w dół na typ klasy pochodnej i wywołuje metodę tej klasy pochodnej. Zademonstruj działanie całości w metodzie main(), a potem uzupełnij deklarację metody w klasie bazowej słowem abstract, eliminując tym samym potrzebę rzutowania.
Napisałem coś takiego:
abstract class Klasa {
}
class Klasa1 extends Klasa {
void print() {
System.out.println("Witam");
}
}
public class Glowna {
static void metoda(Klasa k) {
((Klasa1)k).print();
}
public static void main(String[] args) {
Klasa k = new Klasa(); // Nie mogę przecież utworzyć tego obiektu
metoda(k);
}
}
I właśnie jak mam to zaprezentować w metodzie main skoro nie mogę stworzyć obiektu klasy abstrakcyjnej, który następnie trzeba przekazać do metody statycznej?