Dlaczego konstruktor z nadklasy wywołał się?

0
public class Main {
	public static void main(String[] args) {
		Pracownik Adam = new Pracownik();
		Adam.CoTuRobic();

	}
}
public class Osoba {
	public Osoba() {
		System.out.println("Kontruktor Osoby wywolany. Bez odbioru.");
	}
	public void NicNieRobi() {
	}
}
public class Pracownik extends Osoba {
	public void CoTuRobic() {
		System.out.println("xxx");
	}
}

Co mnie zdziwiło? Oczywiście to że w wyniku uruchomienia tego programu wynik jest następujący:

Kontruktor Osoby wywolany. Bez odbioru.
xxx

Jakim cudem został wywołany konstruktor z nadklasy skoro z tego co mi wiadomo w Java trzeba użyć metody super(); aby wywołać konstruktor z klasy wyżej?

0

Zdaje się, że klasa Pracownik nie posiada swojego konstruktora. Istnieje za to konstruktor nadklasy, który się wywołuje. Jeśli miałbyś konstruktora klasy Pracownik, to zapewne wtedy musiałbyć użyć super().
Aczkolwiek mogę się mylić ;)

0

Konstruktor bezparametrowy (jeżeli istnieje) z klasy bazowej jest wywoływany automatycznie. super() jest potrzebne gdy chcesz wywołać inny konstruktor.
Sprawdź co się stanie po takiej zmianie klasy Osoba:

public class Osoba {
        public Osoba(String txt) {
                System.out.println("Kontruktor Osoby wywolany. Bez odbioru.");
        }
        public void NicNieRobi() {
        }
}
0

OK. Zauważyłem jeszcze jedną rzecz związaną z konstruktorami.
Mianowicie kiedy stworzę klasę bez jawnie zdefiniowanego jakiegokolwiek konstruktora i próbuje potem utworzyć obiekt tej klasy z konstruktorem bezparametrowym to wszystko działa.
Jednak kiedy w tej klasie zdefiniuje jawnie konstruktor z jakimś parametrem a potem próbuje utworzyć obiekt również z bezparametrowym kontruktorem to dostaje błąd że nie ma takiego konstruktora w tej klasie.
Czy to oznacza że ten konstruktor został automatycznie 'usunięty' z tej klasy kiedy stworzyłem jawnie inny?

0

Tak to właśnie działa.
Domyślnie tworzony jest bezparametrowy konstruktor. Jeśli jednak utworzysz choć jeden własny konstruktor, ten tworzony domyślnie przestaje istnieć i jeżeli zależy Ci na bezparametrowym konstruktorze musisz utworzyć go sobie sam.

0

Inaczej mówiąc: domyślny konstruktor jest automatycznie dodawany tylko wtedy, gdy nie ma żadnych innych.

0

A jeszcze inaczej mówiąc: dopisanie konstruktora, usuwa inny konstruktor.

0

no dopisanie konstruktora nie usuwa innego konstruktora a tylko konstruktor domyślny. Można mieć konstruktorów ile się zechce. Zawsze jest też wywoływany konstruktor klasy bazowej. Jak stworzysz jakiś konstruktor w klasie bazowej to w dziedzicznej musisz użyć super(parametry) z parametrami pasującymi przynajmniej do jednego z konstruktorów z bazy. Tak to działa.

0

super trzeba użyć tylko wtedy gdy klasa bazowa nie ma konstruktora bezparametrowego, jeżeli ma konstruktor bezparametrowy super zostanie wywołane automatycznie. Dodatkowo napisanie jakiegokolwiek konstruktora nie usuwa domyślnego, tylko domyślny nie jest wtedy w ogóle tworzony(żeby coś usunąć to to musi istnieć).

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