java Objekte ausgeben

    • denyo7788
      denyo7788
      Bronze
      Dabei seit: 06.05.2007 Beiträge: 264
      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
    • frank1012
      frank1012
      Bronze
      Dabei seit: 01.03.2006 Beiträge: 2.682
      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";
      }
      }
    • denyo7788
      denyo7788
      Bronze
      Dabei seit: 06.05.2007 Beiträge: 264
      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?
    • Marddin
      Marddin
      Bronze
      Dabei seit: 25.06.2007 Beiträge: 838
      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;
    • frank1012
      frank1012
      Bronze
      Dabei seit: 01.03.2006 Beiträge: 2.682
      Original von Marddin
      ergänz den konstruktor um

      this.real = a;
      this.imag = b;
      yap, das fehlt noch.
    • denyo7788
      denyo7788
      Bronze
      Dabei seit: 06.05.2007 Beiträge: 264
      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
      TheJerk
      Black
      Dabei seit: 14.10.2008 Beiträge: 1.415
      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... ;)
    • denyo7788
      denyo7788
      Bronze
      Dabei seit: 06.05.2007 Beiträge: 264
      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
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Du kriegst jedes mal ein neues Objekt zurückgeliefert

      code:
      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
      }
      
    • denyo7788
      denyo7788
      Bronze
      Dabei seit: 06.05.2007 Beiträge: 264
      mh ok.. ist nur irritierend weil gleiche benennung...
      thx für die guten antworten!!!
    • BigBiber
      BigBiber
      Bronze
      Dabei seit: 17.09.2006 Beiträge: 3.279
      Oh das war keine Absicht sollten natürlich eins und zwei sein^^