# [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem



## Defenz0r (28. Dezember 2012)

*[JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Hallo Leute, mein Problem sieht wiefolgt aus:

Ich habe eine Klasse namens Moveconstructor -> Parameter ->   private int AtackStrength;
                                                                                       private String AtackName;

Er wird wiefolgt initialisiert:


```
public Moveconstructor()    { this(0,"" ); }
```

Danach das übliche:


```
public Moveconstructor(   int AtackStrength, String AtackName   )
  
  {
    this.AtackStrength    =         AtackStrength;
    this.AtackName        =         AtackName;
  }
```

Dann die ganzen Getter und Setter vom MoveConstructor... könnt ihr euch denken

Mein Problem ist nun das wenn ich nun neue Instanzen in einer andren Klasse generiere und setze:


```
class Moves {
  
  Moveconstructor Hieb = new Moveconstructor();

  public void  SetzeDieStrings() {
    Hieb.setAtackName("Hieb");
    }
  
  
  public String SpuckDieStringsAus(){
    
    return Hieb.getAtackName();
    }
  
}
```


Das ich immer wieder einen leeren Rückgabewert zurückbekomme, also der MoveConstructor an sich hat ja eigentlich schon getter usw aber es will nicht funktionieren.

Immer leerer Rückgabewert



Gruß


----------



## Kellerkind79 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Hi, warum rufst Du im Default-Konstruktor den parameterisierten Konstruktor auf? 
Das habe ich so in der Art noch nie gesehen. Der Sinn dahinter erschließt sich mir nicht.

Vielleicht postest Du mal Deine kompletten Klassen? Dann ist der Fehler bestimmt schnell gefunden.


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Okay, ich poste euch die 2 SubKlassen:


```
class Moveconstructor
{
  
  // Anfang Attribute
  private int AtackStrength;
  private String AtackName;
  // Ende Attribute
  
  
  public Moveconstructor()    { this(0,"" ); }
  
  public Moveconstructor(   int AtackStrength, String AtackName   )
  
  {
    this.AtackStrength    =         AtackStrength;
    this.AtackName        =         AtackName;
  }

  // Anfang Methoden
  public int getAtackStrength() {
    return AtackStrength;
  }

  public void setAtackStrength(int AtackStrength) {
    this.AtackStrength = AtackStrength;
  }

  public String getAtackName() {
    return AtackName;
  }

  public void setAtackName(String AtackName) {
    this.AtackName = AtackName;
  }

  // Ende Methoden
  
}
```



```
class Moves {
  
  Moveconstructor Hieb = new Moveconstructor();

  public void  SetzeDieStrings() {
    Hieb.setAtackName("Hieb");
    }
  
  
  public String SpuckDieStringsAus(){
    
    return Hieb.getAtackName();
    }
  
}
```


----------



## Kellerkind79 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Hm...und wie rufst Du die Klasse in der Main-Methode Deines Programms auf?


----------



## bingo88 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*



Kellerkind79 schrieb:


> Hi, warum rufst Du im Default-Konstruktor den parameterisierten Konstruktor auf?
> Das habe ich so in der Art noch nie gesehen. Der Sinn dahinter erschließt sich mir nicht.


 Das ist schon okay so, auch gar nicht mal so unüblich. Du kannst dann im Default-Constructor einen parametrisierten Constructor mit Standardwerten aufrufen.

Zum Thema: Soweit sieht das eigentlich gut aus. Rufst du denn bei Moves die SetzeDieStrings() überhaupt auf? Der Konstruktor erzeugt ja einen leeren String und wenn du den String nicht mit was anderem belegst, bleibt der auch leer.

So am Rande: Soll das nicht "at*t*ack" heißen?


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Jo
Ich gebe den AtackNamen in einem seperaten Menu aus
Wundere mich aber warum die Ausgabe immer Leer ist
Ja ich habe eine Hauptklasse^^
Wie meinst du das? Der String ist schon belegt?
Kannst du mir das mal eben zeigen?

Bin Total verwundert warum da nen leerer String rauskommt


Gruß


----------



## bingo88 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Du setzt den String ja erst in der Methode SetzeDieStrings(). Wenn du die nicht irgendwann mal aufrufst (oder eine andere, die einen String setzt), wird ja nur der im Konstruktor gesetzte Wert ausgegeben.


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Wie ruf ich den auf?
Ich hab doch Hieb.setAtackName("Hieb"); gesetzt.

Warum kann ich dann nicht in einer anderen Klasse z.B AtackMenu soetwas machen:

Moves AtackList = new Moves();

System.out.println(AtackList.SpuckDieStringsAus());

Es kommt immer nichts raus


----------



## bingo88 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*


```
class Moves {
    Moveconstructor Hieb = new Moveconstructor();

    // rufst du diese Methode irgendwo mal auf?
    public void  SetzeDieStrings()
    {
        Hieb.setAtackName("Hieb");
    }

    public String SpuckDieStringsAus(){
        return Hieb.getAtackName();
    }
}
```
Siehe Kommentar

Nur weil du die Methode definiert hast, rufst du sie noch nicht auf. Wenn du das in der Form Moves m = new Moves() automatisch haben willst, musst du das im Konstruktor der Moves Klasse machen. Ich habe aber jetzt irgendwie die Vermutung, mit einem objektorientierten Ansatz würdest du da besser fahren (_hängt aber von deinem genauen Vorhaben ab_).


```
// Abstrakte Basisklasse für Angriffsbewegungen
abstract class AttackMove {
     // muss von abgeleiteter Klasse implementiert werden
    public abstract String getName();
}

// abgeleitete Klasse für Hieb-Angriffe
class HiebMove extends AttackMove {
    // implementierung für "Hieb"
    public String getName() {
        return "Hieb";
    }
}
```


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Also ich bin im ersten Ausbildungsjahr, und ja wir lernen Objektorientiertes Programmieren.
Kenne die Commands abstract und extends leider noch nicht.
Das wäre doch aber sehr dürftig, für jeden Move ne eigene Klasse zu schreiben.
Schließlich sind es ja nur AttackName + AttackStrength
Dachte mir eher das ich die überall mit der Instanz die ich in der Klasse Moves angelegt habe mit
Instanz.getAtackName generisch abrufen kann.

Merkwürdig, ich habe auch noch einen Attribs Constructor der int übermittelt, bei dem Funktioniert alles Problemlos.
Der Unterschied ist, das da alles in der Hauptklasse gesetted wird -> Jede Klasse kann mit einer neuen Instanz Problemlos darauf zugreifen warum auch immer


----------



## bingo88 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Ah okay. Na dann lassen wir das besser erst mal mit dem Objektorientierten ^^

Wenn du die Werte passend initialisierst, kannst du das aber auch so abrufen. Meine Vermutung ist halt, dass du die Werte nicht setzt. Wenn du die SetzDieStrings() Methode im Konstruktor der Moves Klasse aufrufst, müsste das aber funktionieren.


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Habs ...

Musste vor dem ausgeben den Setter ausführen

Funktioniert


----------



## Kellerkind79 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Sicher musst Du den Setter vor dem Getter ausführen, sonst wird ja kein Wert gesetzt.
Du solltest Dich trotzdem mal mit "abstract" und besonders mit "extends" beschäftigen.
Auch wenn es jetzt funktioniert, ist mir der Sinn Deiner Klassen nicht ganz klar geworden.


----------



## Defenz0r (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Das ganze wird eine Art Pokemon Klon, zuerstmal auf Textbasis.


----------



## Kellerkind79 (28. Dezember 2012)

*AW: [JAVA] Neue Instanz eines Constructors, Rückgabewert Problem*

Ok, bei Pokemon kenne ich mich gar nicht aus. Viel Erfolg dabei!


----------

