dziedziczenie konstruktory

0

Witajcie mam trochę problem ze zrozumieniem dziedziczenia pokażę to na przykładzie:

 
class Pkt2d{
    int x;
    int y;
    public Pkt2d(){
        x=0;
        y=0;
    }
    public Pkt2d(int a, int b){
        x = a;
        y = b;
    }
}
 
public class Pkt3d extends Pkt2d{
    int z;
    public Pkt3d(int a, int b, int c){
        x=a;
        y=b;
        z=c;
    }
}

i oczywiście w klasie głównej tworzę obiekty ale jak usunę z klasy Pkt2d konstruktor zerujący

  public Pkt2d(){
        x=0;
        y=0;
    }

to w klasie Pkt3d wywala mi błąd Implicit super constructor Pracownik() is undefined for default constructor. Must define an explicit i nie wiem o co chodzi z góry dziękuję za pomoc

1
  1. To co robisz to zły pomysł.
  2. Powinieneś wołać konstruktor nadklasy tzn
public class Pkt3d extends Pkt2d{
    int z;
    public Pkt3d(int a, int b, int c){
        super(a,b);        
        z=c;
    }
}
0

@Shalom zły pomysł to że usuwam konstruktor zerujący?

0

Źle że robisz copypaste bo dwa rady powtarzasz kod z konstruktora klasy bazowej. Jakby ta hierarchia miała więcej poziomów i więcej pól to wyobraź sobie co by się działo...

0

dobrze jak użyję konstruktora super to będę mógł usunąć konstruktor zerujący ? teraz nie mam akurat jak tego sprawdzić

0

jak konstruktory to tylko teleskopowe

0

Kurczę mówcie po naszemu (tym łatwiejszym sposobem :) ) dopiero uczę się javy i nie dotarłem do konstruktorów teleskopowych

0

to wiem tylko czemu wywala błąd?

3

Generalnie pewnie w wyjątku pisze ci brak konstruktora bezargumentowego. Dodaj sobie w kodzie, sysouta, tzn.

 
 public Pkt2d(){
   	System.out.println("wywalanie konstruktora dla pkt2d");
  }

i zobaczysz, że w momencie tworzenia obiektu dziedziczącego po Pkt2d czyli Pkt3d, wywoływany jest konstruktor klasy Pkt2d.

0

Ok a czemu jest on tam potrzebny skoro nic nie deklaruję

1

Bo logika sugeruje że tworzenie obiektu "bardziej szczególnego" wymaga "stworzenia obiektu bazowego a następnie dodania do niego nowych elementów" i tak też jest to implementowane. Konstruktor klasy pochodnej MUSI wywołać któryś z konstruktorów klasy bazowej.

0

'super' !!! :) słówko kluczowe super oznacza tak jakby przeniesienie konstruktora klasy nadrzędnej ( z której dziedziczymy) , do klasy podrzędnej (dziedziczącej) .

0

"Obiekt klasy" bez wywołanego konstruktora jest co najwyżej przydzielonym na niego obszarem pamięci - nie jest jeszcze obiektem. Ponieważ wywołując jakąkolwiek metodę JVM musi wiedzieć, którą metodę z hierarchii klas wywołać, kompilator "dokleja" do konstruktora kod wypełniający coś co się nazywa tablicami metod wirtualnych (a w Javie domyślnie każda metoda jest wirtualna). Tak więc jeżeli myślisz, że kod "pustego" konstruktora "nic nie robi" (poza zerowaniem pól obiektu), to bardzo się mylisz.
Im bardziej rozbudowana klasa tym więcej rzeczy konstruktor robi bez Twojej wiedzy.

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