Zum Forum springen
java Objekte ausgeb...
 
Benachrichtigungen
Alles löschen

[Geschlossen] java Objekte ausgeben

11 Beiträge
5 Benutzer
0 Reactions
4,474 Ansichten

hab ne klasse geschrieben und möchte in der testklasse das neu gebildete objekt ausgeben.. aber irgwie gibt er mit nur die referenz raus??
1. Klasse:

class Complex {
private double real, imag;

/* Konstruktor, bildet Komplexe Zahl mit Realteil a & Imaginärteil b*/
Complex(double a, double b) {

}
/* liefern Realteil & imaginärteil der komplexen Zahl*/
double getReal() { return real;}
double getImag() { return imag;}

/* setzt die Werte im Konstruktor fest sodass ein Objekt complex(a,b) entsteht*/
void setComplexZahl(double a, double b) { real = a; imag = b;}

/* addiert zwei komplexe Zahlen this und arg miteinander und liefert neues Objekt Complex*/
Complex add (Complex arg){
double summeReal = this.getReal() + arg.getReal();
double summeImag = this.getImag() + arg.getImag();
return new Complex(summeReal, summeImag);
}

}

>>>>>>>>>>>>>>>>>>
2.Testklasse

import java.util.*;
class ComplexTest {
public static void main (String[] args) {

Complex eins = new Complex(2,4);
Complex zwei = new Complex(5,7);
System.out.println(eins.add(zwei).toString());
}
}


10 Antworten

Nehme an, es soll 7 + 11i ausgegeben werden?

Dann solltest du die Methode toString() in der Klasse Complex überschreiben, so dass die Ausgabe passt. Die von Object geerbte Methode toString() gibt, soweit nicht anders definiert, die Referenz aus.

Also in etwa so:

class Complex {
...
public String toString() {
return real + "+" + imag + "i";
}
}


also dann kommt 0.0, 0.0i raus... ich versteh nicht ganz den Bezug von der MEthode String toString() in der Klasse?!? also was bewirkt die genau... (also hab sozusagen deine methode in die Klasse kopiert... und vererbung habe ich noch nicht gemacht falls das dafür erforderlich ist?!?)

... bzw wie bekomme ich die Werte summeReal und sumeImag in diese methode?


Die Methode toString wird in System.out.println aufgerufen, wenn ich mich recht entsinne, wenn du diese nun überschreibst, nutzt println deine eigene Methode. Die Methode toString ist normalerweise in der Klasse Object definiert, von der automatisch jede java klasse erbt. Vererbung ist nicht nötig.

das bei dir 0.0 und 0.0 rauskommt, liegt daran, dass dein konstruktor leer ist, der wert von real und imag wird nicht verändert und ist daher derselbe, wie nach dem initialisieren.

ergänz den konstruktor um

this.real = a;
this.imag = b;


Original von Marddin
ergänz den konstruktor um

this.real = a;
this.imag = b;

yap, das fehlt noch.


jop thx!!!
aber noch eine Frage zum Verständnis... in meiner toString() methode stehen die variablen real und imag... jetzt gibt aber miene testklasse summeReal und summeImag aus aus der add() methode...und bei weiteren methoden die ich geschrieben habe zb das produkt usw obwohl die variablen jeweils verschiedene namen haben... wie kommt das?


TheJerk
Beigetreten: 14.10.2008

Ich habe mir jetzt deinen Post min. 6 mal durchgelesen und hab immer noch nicht kapiert, auf was deine Frage abzielt.

Dir sollte eines klar sein:
- real und imag sind sog. Attribute, d.h. Membervariablen, die zu einer Klasse gehören. Erzeugst du von deiner Klasse (hier Complex) eine Instanz (hier eins oder auch zwei), dann hat jede Instanz für sich eigene Membervariablen namens real und imag. Diese können unterschiedliche Werte annehmen und gehören wie gesagt zur zugehörigen Instanz der Klasse. (ganz im Gegensatz zu Klassenvariablen, die alle Instanzen einer Klasse gemeinsam haben; werden bei der Deklaration zusätzlich mit dem Wort "static" definiert)

- Deine Variablen summeReal und summeImag sind sog. lokale Variablen. Ihr Scope, also ihr sichtbarer Bereich ist nur in der Instanzmethode add, da sie innerhalb der Methode deklariert werden. Wird die Methode beendet, werden auch die Variablen sozusagen gelöscht und sind nicht mehr existent/referenzierbar.

Ich hoffe, ich habe deine Frage einigermaßen korrekt verstanden... ;)


also mal schaun ob ichs richtig verstanden habbe... heißt das in meinem beispiel soviel wir:
-ich bilde in meiner testklasse zwei complex objekte, dann wende ich die methode add an diese wird ausgeführt sodass zunächst die ergebnisse in der methode add in den variablen summeReal und summeImag stehen

-dass neu entstandene objekt in der mehtode wird geliefert und die werte gelangen in die instanzvariablen in diesem objekt, also Complex(real,imag), wobei in real der Wert summeReal gespeichert ist und in imag summeImag

- wenn ich jetzt eine weitere methode(zb multipliziere) auf meine zwei complex objekte anwende wird diese ausgeführ, das ergebnis in zb mulReal und mulImag gespeichert, dann wird das neue complex objekt zurückgeliefert und die Werte aus mulReal und mulImag gelangen in real und imag...

und hier liegt mein problem... wenn ich auf meine zwei complex objekte in der testklasse einmal multipliziere() und einmal add () anwende werden doch beide male real und imag geliefert, aber einmal sind real und imag ergebnisse der addition, einmal der multiplikation, woher weiß mein programm wann die variablen real und imag welchen welches ergebnis beinhalten sollen?

oder kann ich mir das so vorstellen, das von der methode add() das complex(real1,imag1) und von der methode mulipliziere() das objekt complex(real2,imag2) zurückgeliefert wird?


BigBiber
Beigetreten: 17.09.2006

Du kriegst jedes mal ein neues Objekt zurückgeliefert

public class Complex{

Complex(double a, double b){
this.real = a;
this.imag = b;
}

Complex add(Complex arg){
double summeReal = this.getReal() + arg.getReal();
double summeImag = this.getImag() + arg.getImag();
return new Complex(summeReal, summeImag);
}

Complex mul(Complex arg){
double summeReal = this.getReal() * arg.getReal();
double summeImag = this.getImag() * arg.getImag();
return new Complex(summeReal, summeImag);
}

public static void main(String[] args){
Complex eins= new Complex(5, 7);
Complex zwei = new Complex(8, 4);

// Wo jetzt gilt:
eins.add(zwei) != eins.mul(zwei);
// Es sind 2 verschiedene Objekte jeder Aufruf von add und mul erzeugt eine neues Instanz die zurückgegeben wird
}

mh ok.. ist nur irritierend weil gleiche benennung...
thx für die guten antworten!!!


BigBiber
Beigetreten: 17.09.2006

Oh das war keine Absicht sollten natürlich eins und zwei sein^^