# Objektwerte addieren / Konstruktor



## jolom (15. Jan 2014)

Hallo,

ich habe folgendes Problem.

Ich möchte 2 Beträge aus Objekten addieren in einer dafür geschaffenen Methode addieren, weiß aber nicht genau, wie ich die Beträge aufrufen kann, um mit ihnen zu rechnen.



Grüße Jolom


```
public class Betrag {
 
  private int x;
  
 
  // leerer Konstruktor
  public Betrag() {
 
    this.x = 1;
    
  }
 
  // Konstruktor mit Parameterliste
  public Betrag(int neuesX) {
 
    this.x = neuesX;
   
  }
 

    
    
    
 // hier möchte ich die Beträge addieren.
 public void addieren () {
     
 
    
   
 }
 
 
  public static void main(String[] args) {
 
    Betrag Betrag1 = new Betrag(6);
    Betrag Betrag2= new Betrag(5);
 
    // mit diesem Aufruf will ich die Methode aufrufen.

   Betrag1.addieren(Betrag2);
  }
}
```


----------



## TheSorm (15. Jan 2014)

NamedeDesObjects.Methode; so macht man das standartmäsig also bei dir ca so, Betrag1.Betrag(intzahl)
und genau so rufst du auch variablen auf zb Betrag1.Variable


----------



## jolom (15. Jan 2014)

also quasi einfach nur:

betrag1.x + betrag2.x  ?


----------



## TheSorm (15. Jan 2014)

ja denke schon.


----------



## jolom (15. Jan 2014)

Da bekomme ich aber die Fehlermeldung dass er das Symbol nicht finden kann :/


----------



## TheSorm (15. Jan 2014)

hast das in adieren geschrieben ? dann geht das natürlich nicht, mach das am besten in der main.


----------



## jolom (15. Jan 2014)

achso, ja aber ich möchte das gerne in der methode addieren machen, würde also die Werte gerne dahineinbekommen wenn das möglich ist.


----------



## wolfgang63 (15. Jan 2014)

Du brauchst noch eine Methode
public int getX(){
   return x;
}
und in die Addierenmethode muss so sein

public void addieren(Betrag obj){
   x=x+obj.getX();
};


----------



## jolom (15. Jan 2014)

wolfgang63 hat gesagt.:


> Du brauchst noch eine Methode
> public int getX(){
> return x;
> }
> ...



Also bekommt er quasi das x aus dem Objekt mit dem ich die Methode aufrufe mitgeliefert, das andere x muss er aber durch getX bekommen?


----------



## jolom (15. Jan 2014)

Soweit funktioniert das auch alles schon. Vielen Dank an euch beide!

Ich habe aber noch eine Frage:

Wenn ich jetzt diese beiden Beträge miteinander vergleichen will mit einer gesonderten boolean-Methode
dann würde ich schreiben:


```
private boolean equal(Betrag Betrag2) {



if (x==Betrag2.getX())

return true;

else 

return false;
```

nun bekomme ich aber immer false zurück auch wenn die Werte beide gleich sind, woran liegt das?


----------



## TheSorm (15. Jan 2014)

Gesonder heist nicht in der classe des Objektes das du vergleichst ? dann if (Betrag.x == Betrag2.x) return true;


----------



## jolom (15. Jan 2014)

In der main-Methode wäre das so in Ordnung,

aber wenn ich das in einer boolean Methode mache, dann funktioniert es eben nicht und ich frage mich warum.


----------



## X5-599 (16. Jan 2014)

Kannst du den gesamten Code nochmal posten?


----------



## wolfgang63 (16. Jan 2014)

Vorsicht beim vergleichen von Werten mit "=="!
Besser man verwendet die equals() Methode.


```
if ( x.equals(Betrag2.getX())
```


----------



## TheSorm (16. Jan 2014)

equals sollte man bei Strings benutzen


----------



## kaoZ (16. Jan 2014)

equals(Object) dient als Referenzvergleich, es prüft ob im Speicher das gleiche Objekt Referenziert wird,  wenn du prüfen willst ob die *Werte* deiner "Objekte" ( bzw. primitiven Datentypen ) identisch sind nutze
	
	
	
	





```
"=="
```

z.B

Tenärer Operator

```
boolean isSame = y.getWert() == x.getWert() ? true : false;
```

oder per if-Anweisung

```
if(y.getWert() == x.getWert()){
 
  // Do something special :)

}
```

[TIPP]Desweiteren kannst du auf primitiven Datentypen keine Methoden ausführen, sondern lediglich auf der Referenz einer Wrapper Klasse [/TIPP]

Bedeutet: 


```
int x = 3;

x.equals();  // funktioniert nicht , da x kein Objekt sondern ein primitiver Datentyp ist

....


Integer x = 3;

x.equals(); // funktioniert, da x nun von einem Wrapper, also ein Objekt welches deinen primitiven Datentyp umhüllt referenziert wird
```


----------



## wolfgang63 (16. Jan 2014)

jolom hat gesagt.:


> In der main-Methode wäre das so in Ordnung,
> 
> aber wenn ich das in einer boolean Methode mache, dann funktioniert es eben nicht und ich frage mich warum.



Also der Unterschied ist, das die main Methode statisch ist und deine equal-Methode nicht!
Aus statischen Methoden kann man nur auf statische Variablen und Methoden zugreifen.

Um einen objektorientierten Ansatz in dein Programm zu bekommen, solltest du eine separate Klasse Start schreiben die in der Mainmethode die beiden Objekte Betrag1 und Betrag2 erzeugt. Das hat eigentlich nichts in der Klasse Betrag verloren. Die Vergleichsmethode ist dann in deiner Startmethode und der Zugriff auf die beiden Werte wird über die Punktschreibweise mit den Objektvariablen programmiert.
Dann hast du einen sauberen objektorientierten Code.

Zum lernen von Java empfehle ich das Buch "Programmieren mit BlueJ".
Ist ein schönes Lern- und Arbeitsbuch und führt gut in objektorientierte Programmierung ein.


----------



## wolfgang63 (16. Jan 2014)

Zum Beispiel so.


```
public class Start {

	public static void main(String[] args) {
		Betrag betrag1 = new Betrag(5);
		Betrag betrag2 = new Betrag(3);
		System.out.println("" + Start.addiere(betrag1.getX(), betrag2.getX()));
		if (equal(betrag1, betrag2))
			System.out.println("Ergebnis ist true");
		else
			System.out.println("Ergebnis ist false");
	}

	public static int addiere(int x, int y) {
		return x + y;
	}

	public static boolean equal(Betrag b1, Betrag b2) {
		if (b1.getX() == b2.getX())
			return true;
		else
			return false;
	}
}
```


```
public class Betrag {
	
	private int x;
	
	public Betrag(int x) {
		this.x = x;
	}
	
	public int getX() {
		return x;
	}
	
}
```


----------



## kaoZ (16. Jan 2014)

Nurnoch mal so am Rande, das ist die Standartimplementierung von 
	
	
	
	





```
equals(Object);
```


```
public boolean equals(Object obj) {
  return (this == obj);
}
```

So und wem fällt jetzt noch auf was genau dort passiert ^^


----------



## wolfgang63 (16. Jan 2014)

Ich probiers mal.
Wenn das aufrufende Objekt gleich dem übergebenen Objekt ist wird true zurück gegeben.


----------

