Klasy abstrakcyjne

0

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?

1
  1. Klasa k = new Klasa1();

  2. Jeśli tworzysz obiekt klas A, która rozszerza klasę B, która ... klasę X, to najpierw zostaną wykonane konstruktory i bloki inicjalizacyjne z klasy X, potem ... B, a na końcu A. Gdy tworzysz obiekt klasy Klasa1, to najpierw jest wywoływany konstruktor klasy Klasa i to jest moment kiedy pole z klasy Klasa1 jeszcze nie jest zainicjalizowane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1