Vererbungsfrage

Status
Nicht offen für weitere Antworten.

sterndu1

Mitglied
Habe gerade ein Problem:

Ich habe hier eine Punktklasse:




Code:
public class Punkt {
  protected double x,y;

  public Punkt(double x, double y){
    this.x = x;
    this.y = y;
  } // public Punkt(double x, double y)

Daraus will ich nun eine Klasse Quadrat ableiten. Hier ist mein versuch.Ist das soweit richtig?

Code:
//Klasse Quadrat erweitert von der Klasse Punkt
class Quadrat extends Punkt{
	 super(x,y);      //Variablen der Superklasse
	 double seitenlaenge = deltaX;  // Variableseitenlänge  der Klasse Quadrat deklarieren
	 double umfang=0.0;

	 //Konstruktor der Klase Quadrat
	 public quadrat(double a, double b,double c, double d){
		 super(x,y);   //Variablen der Superklasse
		 this.seitenlaenge= deltaX;  // Variablen der Klasse Quadrat instanzieren
		 this.deltaX = 1.0;    // Variablen der Klasse Quadrat instanzieren

		 a= new super(x,y);
		 b= new super(x+deltaX,y);
		 c= new super(x,y+deltaX);
		 d= new super(x+deltaX;y+deltaX);
		 }

	 public double getUmfang(){
		 return deltaX*4;
		 }

	}
 

tfa

Top Contributor
Tipp das ganze in eine IDE oder lass den Compiler drüber laufen, dann siehst du die Fehler.
 
S

SlaterB

Gast
da ist ja so viel falsch, das glaubt man kaum,

Zeile 3 ist mir ganz unverständlich, was bedeutet das?
du musst in einer Subklasse keine Variablen aus der Oberklasse nochmal 'erwähnen', oder was immer da passiert

-----

Zeile 4:
> double seitenlaenge = deltaX;

was ist deltaX? wieso sollte seitenlaenge das gleiche sein wie deltaX,
reicht dann nicht eine von beiden Variablen? ;)

-----

der Konstruktor muss wie die Klasse groß geschrieben werden,

----

der super-Aufruf in Zeile 9 ist schon ganz gut, aber was soll dort x und y sein?
die sind hier nicht definiert,
du musst dort echte Werte übergeben, z.B. 4 und 5 oder a und b

----

Zeile 13-17:
'new super' gibts in Java nicht,
außerdem sind a-d immer noch double-Variablen, darin könntest du keine Punkt-Objekte speichern, falls du das vorhast

da a-d auch nur lokale Parameter sind, sind sie nach dem Ausführen des Konstruktors weg,
wenn du sie länger speichern willst, dann evtl. als Klassenattribute
 

Landei

Top Contributor
Liebes sternchen, da ist nicht nur der Code falsch (wie slaterB schon ausgeführt hat), sondern die ganze Idee an sich.

Vererbung ist eine "ist-ein" Beziehung: Integer "ist eine" Number. AbstractAction "ist eine" Action. JButton "ist eine" JComponent. Rectangle "ist eine" Shape.

Aber Quadrat ist *kein* Punkt. Quadrat und Punkt könnten vielleicht eine gemeinsame Oberklasse haben (GrafikObjekt oder so), aber egal wie man es dreht und wendet: Eine Quadrat ist keine Art von Punkt. Ein Quadrat kann dir seine Eckpunkte zurückliefern. Ein Quadrat kann man mit Punkten defininieren (z.B. durch den Punkt der linken obere Ecke und einer Seitenlänge). Aber zu sagen "class Quadrat extends Punkt" ist genauso toll wie "class Auto extends Motor" oder "class Mensch extends DNA".
 

sterndu1

Mitglied
Danke schon mal für eure Hilfe . Habe jetzt einiges (!!!!!)daran verbessert. Tut mir leid,wegen meinen dummen Fragen( ich versuche mir grad im Selbststudium Java beizubringen- und das kann schon vberzwickt sein,wenn man keinen Ansprechpartner hat)
also hier erst mal meine Verbesserungen in der klasse Quadrat(der Tochterklasse von Punkt):


Code:
//Klasse Quadrat erweitert von der Klasse Punkt
class Quadrat extends Punkt{
	 double deltaX;  // seitenlängehalbierende  der Klasse Quadrat deklarieren
	 double seite; // seitenlaenge
	 double umfang=0.0;

	 //Konstruktor der Klase Quadrat
	 public Quadrat(double x, double y,double deltaX){
		 super(x,y);   //Variablen der Superklasse
		  this.deltaX=0.0;  // Variablen seitenlaengenhalbierende der Klasse Quadrat
		  this.seite = deltaX*2;  //Variabe seitenlaenge

}





   public double umfang()
  {
    return umfang=(4*seite);
  }

  public void String toString()
  {
     new String("Der Umfang des Quadrates betraegt:" + umfang);
  }

Nun habe ich aber noch ein Problem - in der Vaterklasse Punkt ist schon folgende Methoden deklariert:

Code:
 public String text(){
     return new String("("+x+", "+y+")");
   } // public String text()

und
Code:
public String toString(){
    return new String("Punkt: "+text());
  }// public String toString()

} // public class Punkt

Kann ich diese nicht auch in der Quadratklasse verwenden,ohne neue Methoden zu erstellen?Und wenn ja ,wie mache ich das - genauso wie bei den Variablen?

Danke schon mal für Eure Hilfe!!
 
M

maki

Gast
Code:
class Quadrat extends Punkt
Das ist schon falsch.. ist ein Quadrat ein Punkt?
 
S

SlaterB

Gast
schreibe niemals "new String" in dein Programm,
statt
> return new String("Punkt: "+text());
geht z.B. genauso
return "Punkt: "+text();

auf die Methode text() kannst du ganz einfach mit text()-Aufruf zugreifen,
was du vielleicht noch suchst ist

Code:
public void String toString() 
  { 
     return "Der Umfang des Quadrates betraegt:" + umfang+
               ", sonstige Info: "+super.toString(); 
  }
 

sterndu1

Mitglied
Doch noch ne kleine Nachfrage:
Ich habe jetzt das Programm einmal um ein Rechteck erweitert,das läuft auch problemlos und um eine Klasse Kreis.
Von einem Objekt der Klasse Kreis habe ich den Umgang und die Fläche ausgeben wollen auf der Konsole.Ich erhalte da aber nur 0.0 werte. Warum??

Code:
class Kreis extends Punkt
{
 double radius;  //Variable für Radius
 double kreisUmfang;  // Variable für Umfang
 double kreisFlaeche; // Variable für Kreisfläche



//Konstruktor der Klasse Kreis


Kreis(double x, double y, double radius){
 super(x,y);
 this.radius = 0.0;

}




//Umfang berechnen
public double kreisUmfang(){
	return kreisUmfang=(2* Math.PI*radius);
	}
public double kreisFlaeche()
{
return kreisFlaeche= Math.PI * (radius * radius);
}
public String toString()
{
return new String(" " + super.toString());
}

}
// Klasse Test(Hauptklasse)
public class Test{
	//Aufruf der Main-Methode
	public static void main(String[]args){

   Punkt   punkt1     = new Punkt(20,20);
   Kreis  kreis1      = new Kreis(20,20,12);
  
   kreis1.kreisUmfang();
  // Aufruf der Methode zur Berechnung der Kreisflaeche
  kreis1.kreisFlaeche();

   // Ausgabe des Umfang des Kreises
  System.out.print("\nDer Umfang des Kreises betraegt: " + kreis1.kreisUmfang);

    // Ausgabe der Flaeche des Kreises
  System.out.print("\nDie Flaeche  des Kreises betraegt: " + kreis1.kreisFlaeche);




		} // Ende Main Methode
}  //Ende der Hauptklasse Test
 
M

maki

Gast
kreis1.kreisUmfang

vs.

kreis1.kreisFlaeche()

DU benutzt Vererbung immer noch falsch ;)
 
S

SlaterB

Gast
der Radius ist auch immer 0, der im Konstruktor übergebene wird ignoriert
 

sterndu1

Mitglied
Ich glaube jetzt verstehe ich gar nichts mehr.
Aber warum wird es dann bei Quadrat bzw. rechteck richtig ausgegeben:


Code:
//Klasse Quadrat erweitert von der Klasse Punkt
class Quadrat extends Punkt{
	 double deltaX;  // seitenlängehalbierende  der Klasse Quadrat deklarieren
	 double seite; // seitenlaenge
	 double umfang=0.0; //umfang

	 //Konstruktor der Klase Quadrat
	 public Quadrat(double x, double y,double deltaX){
		 super(x,y);   //Variablen der Superklasse
		  this.deltaX=0.0;  // Variablen seitenlaengenhalbierende der Klasse Quadrat
		  this.seite = deltaX*2;  //Variabe seitenlaenge

}




   //Methode Umfang
   public double umfang()
  {
    return umfang=(4*seite);
  }
   // Umwandlung in einen String
  public String toString()
  {
     return new String("Der Umfang des Quadrates betraegt:" + super.toString());
  }



	}  //Ende der Klasse Quadrat


//Klasse Rechteck erweitert von der Klasse Punkt
class Rechteck extends Punkt{
 double deltaX;    // Deklarieren der neuen Variablen,um die die klasse Punkt erweitert wird
 double deltaY;
 double seiteX;
 double seiteY;
 double rechteckFlaeche;



//Konstruktoren
Rechteck(double x, double y, double deltaX, double deltaY)
{
super(x,y);   // Uebernahme der Variablen y und y der Superklasse
this.deltaX = 0.0;    // Instanzieren der neuen Variablen
this.deltaY = 0.0;
this.seiteX = deltaX*2;
this.seiteY = deltaY*2;
}

//Methoden zur Bestimmung von Flaeche
public double rechteckFlaeche()
{
return rechteckFlaeche=(seiteX  * seiteY);
}

// Methode  Umwandlung in einen String - vererbt von der Superklasse
public String toString()
  {
    return  new String("Die Fläche  des Rechtecks betraegt:" + super.toString());
  }
und in der Main-Methode:
Code:
public class Test{
	//Aufruf der Main-Methode
	public static void main(String[]args){

  //jeweils ein Objekt der Subklassen Quadrat, Rechteck und Kreis erstellen sowie der Klasse Punkt
  Punkt   punkt1     = new Punkt(20,20);
  Quadrat quadrat1 	 = new Quadrat(20,20,20);
  Rechteck rechteck1 = new  Rechteck(20,20,30,5);
 // Aufruf der Methode zur Berechnung des Umfangs des Quadrates
  quadrat1.umfang();
  // Aufruf der Methode zur Berechnung der Flaeche des Rechtecks
  rechteck1.rechteckFlaeche();
  
  // Ausgabe des Umfang des Quadrates
  System.out.print("Der Umfang des Quadrates betraegt: " + quadrat1.umfang);

  // Ausgabe der Flaeche des Rechtecks
  System.out.print("\nDie Flaeche  des Rechtecks betraegt: " + rechteck1.rechteckFlaeche);




  Help !!!!!  ???:L
 
S

SlaterB

Gast
abgesehen von deinen schlechten Methoden und dem Vorgehen (get-Methode setzt Klassenattribut welches später direkt ausgelesen wird, gruselig)
liegt der direkte Fehler wahrscheinlich weiterhin bei:
SlaterB hat gesagt.:
der Radius ist auch immer 0, der im Konstruktor übergebene wird ignoriert
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Vererbungsfrage Java Basics - Anfänger-Themen 5
G Vererbungsfrage Java Basics - Anfänger-Themen 12

Ähnliche Java Themen

Neue Themen


Oben