Dziedziczenie a Konstruktory

0

Uczę się javy i przerabiam tego typu przykład i naszła mnie taka myśl
Czy można odziedziczyć konstruktory czy jedynie wartości zmiennych?

public class Punkt{

    public static void main(String args[]){
        Punkt2D dwaD = new Punkt2D(2,8);
        Punkt2D dwaD1 = new Punkt2D();
        Punkt3D trzyD = new Punkt3D();      //**********************
        Punkt3D trzyD1 = new Punkt3D(2,5);//chodzi o tego typu obiekt 
                                           //**********************
        System.out.println("  x= "+dwaD.x+"  y= "+dwaD.y);
        System.out.println("  x= "+dwaD1.x+"  y= "+dwaD1.y);
        System.out.println("  x= "+trzyD.x+"  y= "+trzyD.y+"  z= "+trzyD.z);   
    }
}
class Punkt2D {
    int x;
    int y;
        public Punkt2D(){
            x=0;
            y=0;
        }
        public Punkt2D(int a, int b){
            x=a;
            y=b;
        }
}
class Punkt3D extends Punkt2D{
    int z;
 	public Punkt3D(){
	z=5;
	}       
}
 
1

Nie można dziedziczyć konstruktorów. Klasa pochodna może natomiast w swoim konstruktorze wywołać konstruktor klasy bazowej poprzez super()

0

A czy mógłbyś podać jakiś prosty przykład jak skorzystać z tych konstruktorów żeby nie trzeba było ich przepisywać??

        public Punkt2D(){
            x=0;
            y=0;
        }
        public Punkt2D(int a, int b){
            x=a;
            y=b;
        }
 
2
class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
	super();
	//super(x, y);
    z=5;
    }       
}
2

Dziedziczenie Pinkt3D po Pinkt2D nie ma żadnego sensu, ponieważ praktycznie jedynie co da się wykorzystać to deklaracja dwóch zmiennych przy czym tego samego typu co ta trzecia potrzebna w Pinkt3D.
Więc jeżeli chodzi o jakąś oszczędność wiersza na deklaracje dwóch zmiennych to mamy wyłacznie straty.

0

Zastanawiam się dlaczego nie można tak

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(x, y);//????????????????????????
    z=5;
    }       
}

Tylko trzeba tak?

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(int x, int y){
    super(x, y);
    z=5;
    }       
}

Czy może jest jakiś sposób na to??

0
class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(x, y);//????????????????????????
    z=5;
    }       
}

A co to są x, y? Jakie mają wartości?
Zauważ, że to już jest ok (choć bez sensu):

class Punkt3D extends Punkt2D{
    int z;
     public Punkt3D(){
    super(234, 34);
    z=5;
    }       
}
0

Tworząc obiekt klasy Punkt3D wywołujesz konstruktor tej klasy, klasa po której ta klasa dziedziczy nie ma żadnego wpływu na zmienne przekazywane do konstruktora klasy Punkt3D, tak więc w pierwszym przypadku nie przekazujesz w żaden sposób zmiennych x i y, oczywiście nie musisz ich przekazywać, tylko np. zadeklarować je wewnątrz klasy, jednak to w tym wypadku byłoby pozbawione sensu.

0

Tak to powinno wyglądać technicznie:

class Punkt2D
  {
   protected int x,y;
   public Punkt2D() { x=y=0; }
   public Punkt2D(int px, int py)
     {
      x=px;
      y=py;
     }
  }

class Punkt3D extends Punkt2D
  {
   protected int z;
   public Punkt3D()
     {
      super();
      z=0;
     }       
   public Punkt3D(int px, int py,int pz)
     {
      super(px,py);
      z=pz;
     }       
  }

Zaś praktycznie - powtarzam jeszcze raz to dziedziczenie nie ma żadnego sensu.

0

Właśnie widzę że to nie ma sensu i dlatego się zastanawiam po co stosować konstrukcję super(); ??
skoro i tak praktycznie muszę tworzyć od nowa praktycznie identyczny konstruktor.

0
  1. Po to aby sie nie powtarzac - jezeli z klasy bazowej dziedziczy wiele klas to wyobraz sobie, ze do klasy bazowej dopisujesz jakies pole, ktore wymaga inicjalizacji. Musialbys wtedy poszukac kazda klase pochodna i inicjalizowac wszedzie pole z klasy bazowej - nie ma to kompletnie sensu i tylko komplikuje sprawe.
  2. Po to aby zainicjalizowac pola, ktore w klasie bazowej sa prywatne. Klasa pochodna nie ma dostepu do pol prywatnych klasy bazowej. Oczywiscie jezeli klasa bazowa posiada metody dzieki ktorym mozna zainicjalizowac prywatne pola to nie ma z tym problemow (o ile metody nie sa prywatne) ale nie zawsze tak musi byc.
1

To nie ma sensu, bo Twoja hierarchia dziedziczenia jest mało sensowna. Jakiś przykład skopiowany z SO:

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}

public class Cat extends Animal {
    public Cat() {
        super("Miau");
    }
}

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