Java - dziedziczenie konstruktorów domyślnych

0

Jak w temacie. Mam problem, związany z dziedziczeniem konstruktorów domyślnych. Problem oraz pytanie.

class Punkt
{
 private double x;
 private double y;
 private String nazwa;
 public Punkt(String n, double xx, double yy)
 {
	 this.nazwa=n="A";
	 this.x=xx=0;
	 this.y=yy=0;
 }
}

class Kolo extends Punkt
{
	private double promien;
	public Kolo(String naz, double a, double b,double r)
	{
	super(naz,a,b);
	
		promien=r=1;
		naz="B";
		a=4;
		b=4;
	}
}

public class czyKolo 
{
	public static void main(String[] args)
	{
		Kolo k = new Kolo();
	}
}

 

Problem polega na tym, że eclipse twierdzi, że konstruktor klasy Kolo nie jest zdefiniowany i wyrzuca błąd w: Kolo k = new Kolo(); . Po wpisaniu w nawiasy zmienne typu string i 3x double nie zwraca jednak błędu. Tylko ja bym chciał, żeby konstruktor klasy koło dziedziczył po konstruktorze klasy Punkt i jednocześnie był konstruktorem domyślnym z innymi parametrami. Jest to możliwe?
Czy w liniach:
naz="B";
a=4;
b=4;
Muszę przez naz, a, b napisać najpierw argumenty które klasa koło dziedziczy z klasy punkt? Tzn:
nazwa=naz="B";
x=a=4;
y=b=4;
?

0
import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
  {
   public static void main(String[] args)
     {
      Kolo k = new Kolo("Nazwa",0,0);
     }
  }

class Punkt
  {
   private double x,y;
   private String nazwa;
   public Punkt(String nazwa,double x,double y)
     {
      this.nazwa=nazwa; // ="A" po kiego przekazujesz nazwÄ i ja zamieniasz ?
      this.x=x;
      this.y=y;
     }
   public Punkt(String nazwa)
     {
      this(nazwa,0,0);
     }
   public Punkt()
     {
      this("Punkt");
     }
  }
 
class Kolo extends Punkt
  {
   private double promien;
   public Kolo(String nazwa, double x, double y,double r)
     {
      super(nazwa,x,y);
      promien=r;
     }
   public Kolo(String nazwa, double x, double y)
     {
      this(nazwa,x,y,1);
     }
   public Kolo(String nazwa)
     {
      this(nazwa,0,0);
     }
   public Kolo()
     {
      this("Kolo");
     }
  }
1

Problem polega na tym, że eclipse twierdzi, że konstruktor klasy Kolo nie jest zdefiniowany i wyrzuca błąd w: Kolo k = new Kolo()

No bo taki konstruktor nie istnieje.
Masz tylko konstruktor 'public Kolo(String naz, double a, double b,double r)'.
Stwórz konstruktor bezparametrowy czyli

 
public Kolo(){
}

(Taka uwaga: Jeśli nie masz innych konstruktorów, to konstruktor bezparametrowy jest tworzony domyślnie przy kompilacji. Stąd zazwyczaj nie tworzysz pustych konstruktorów)

A tak w ogóle to nie czaję o co ci chodzi z tym przypisaniem, przecież to bez sensu. Po co ci to n, xx, yy czyli argumenty konstruktora, skoro przypisujesz i tak wartości na sztywno "A" , 0, 0?

 
        this.nazwa = n = "A";
        this.x = xx = 0;
        this.y = yy = 0;

Jak chcesz takie przypisanie na sztywno to zrób konstruktor bezargumentowy

 
public Punkt(){
 this.nazwa = "A";
        this.x =  0;
        this.y =  0;
}

i drugi argumentowy:

 
public Punkt(String n, double xx, double yy){
 this.nazwa = n;
        this.x = xx;
        this.y =  yy;
}
0

Dzięki.
A teraz inne pytanie mi się narodziło, tzn. przypomniało. Jeżeli w konstruktorze podaje się parametr o nazwie załóżmy nazwa ( Punkt(String nazwa); ), a w klasie istnieje już parametr o nazwie nazwa (private String nazwa;) , to skąd kompilator wie, że chodzi mi o to co się poda w nawiasach, żeby tym ustawić wartość parametrowi nazwa?

@szarotka Najpierw się uczyłem obiektowego c++ z tutoriali p.Zelenta, żeby zrozumieć o co chodzi z obiektowością. I w c++ można było zrobić konstruktor z parametrami, taki że jeżeli się nie poda parametrów, to ustawi z góry narzucone jakieś podstawowe. I kompilator nie wyrzucał błędu. Równie dobrze można było podać jakieś dane i też nie pokazywał błędu.

1

Jeżeli w konstruktorze podaje się parametr o nazwie załóżmy nazwa ( Punkt(String nazwa); ), a w klasie istnieje już parametr o nazwie nazwa (private String nazwa;) , to skąd kompilator wie, że chodzi mi o to co się poda w nawiasach, żeby tym ustawić wartość parametrowi nazwa?

Wtedy robimy tak:

 
Punkt(String nazwa){
this.nazwa = nawa;
}

(this oznacza, że odwołujemy sie do zmiennej "nazwa", będącej polem tej klasy a nie argumentem funkcji w tym przypadku konstruktora)

0

@Aisekai, java to nie C++, alternatywę do parametrów domyślnych pokazałem wyżej, zresztą jak i rozstrzygnięcie kolizji nazw.

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