# longwert mit Methode addieren geht nicht!



## Leuchtturm (15. Jan 2010)

Nabend, ich versuche grad ne methode zu schreiben mit der ich 2 natürliche zahlen (long) addieren kann aber es kommt immer : not a statement this.n + n;


Hier die Klasse:

```
abstract public class Nat extends Zahl {
    
   private long n;


    public Nat() {
        n = 0;
    }
    
    public Nat(long n){
        if (n < 0) {
            System.out.println("Fehler! Keine natürliche Zahl!");
            System.exit(1);
         }
         else 
            this.n = n;   
   }

    
    public void add(Nat r) {
       this.n + r.n;
   }   
}
```

Wieso funktioniert das nicht??? :rtfm:


----------



## Schandro (15. Jan 2010)

Was soll den mit dem Ergebniss der Addition geschehen? ...


----------



## Leuchtturm (15. Jan 2010)

einfach ausgegebn werden, oder was meinst du?


----------



## eRaaaa (15. Jan 2010)

Dann musst du das aber sagen 

also
System.out.println((this.n + r.n));

oder
long erg = this.n + r.n;

nur

this.n + r.n ist halt, wie schon angemeckert vom Compiler, keine gültige Anweisung


----------



## Leuchtturm (15. Jan 2010)

Jo danke... 

habs so gelöst: 


```
public long add(Nat r) {
       return this.n += r.n;
   }
```


----------



## eRaaaa (15. Jan 2010)

Macht Sinn. 
Allerdings musst du dir dann im Klaren sein, dass das Ergebnis nun auch in n steht?  Ist das so gewollt? 

Nicht eher

```
return this.n + r.n;
```
 ???:L


----------



## Leuchtturm (15. Jan 2010)

doch  is doch richtig so??


----------



## eRaaaa (15. Jan 2010)

Ich weiß es nicht!(ist ja nicht mein Programm  )
Ich denke eher, du sollst ein neues Objekt mit dem Ergebnis zurückliefern:


```
public Nat add(Nat r) {
       return new Nat(this.n + r.n);
   }
```

/edit: In dem anderen Thread wo du gepostet hast, steht ja oben auch, man solle folgendes berechnen können:

```
Zahl e = (r[0].sub(r[1])).div(r[2].add(r[3].mul(r[4])));
```


----------



## Tomate_Salat (15. Jan 2010)

Leuchtturm hat gesagt.:


> ```
> abstract public class Nat extends Zahl {
> private long n;
> 
> ...



Wie kann denn das gehen wenn n private ist?! Oder irre ich mich?! [c]r.n[/c] sollte und dürfte nicht gehen, oder ist das eine Ausnahme, weil man sich hier im selben Objekt befindet?! Also nach meinen begriffen kann das schon wegen dem private nicht gehen und dass das Ergebnis untergeht ist ja schon bekannt.


----------



## eRaaaa (15. Jan 2010)

Tomate_Salat hat gesagt.:


> oder ist das eine Ausnahme, weil man sich hier im selben Objekt befindet?!



Jepp, so ungefähr  Nat ist nunmal Nat ?! 

Beispiel: Wenn du equals implementierst vergleichst du ja schließlich in dne meisten Fällen auch die privaten Instanzvariablen ?!


----------



## Tomate_Salat (15. Jan 2010)

ja habs grad getestet. Hab bisher noch nicht wirklich gehabt, dass ich auf was privates so zugreifen musste :-/ . Habs auch grad getestet, es funktioniert wirklich^^. Find das trotzdem iwie seltsam...naja egal.


----------



## Noctarius (15. Jan 2010)

Tomate_Salat hat gesagt.:


> ja habs grad getestet. Hab bisher noch nicht wirklich gehabt, dass ich auf was privates so zugreifen musste :-/ . Habs auch grad getestet, es funktioniert wirklich^^. Find das trotzdem iwie seltsam...naja egal.



Wieso seltsam? private sagt doch gerade, dass der Zugriff auf diese Instanz beschränkt ist. Wie willst du denn Getter / Setter machen ohne private Zugriff?


----------



## Tomate_Salat (15. Jan 2010)

auf die eigene, ist klar, nur dass man aber eine andere instanz weitergibt und man auf deren private objekte zugreifen. Ja egal.


----------



## Noctarius (16. Jan 2010)

Ist doch da oben garnicht.


```
public foo(int bar) {
    this.bar = bar;
}
```

[c]this.bar[/c] sagt explizit nimm das Instanzfeld bar und nicht den Parameter bar.


----------



## eRaaaa (16. Jan 2010)

Noctarius hat gesagt.:


> Ist doch da oben garnicht.
> 
> 
> ```
> ...



Ich glaube ihm ging es mehr um das 
	
	
	
	





```
r.n
```
 / 
	
	
	
	





```
Nat r
```
 wo er sich wunderte, dass man dort auf n zugreifen kann


----------



## Noctarius (16. Jan 2010)

Ahhhhhhhh *Baum vor Kopf wegnimmt*


----------



## scones (17. Jan 2010)

Nur aus Neugier um die SPrache etwas genauer zu verstehen:

Wieso genau ist die Zeile

```
this.n+r.n;
```
keine Anweisung?
Im Assembler der meisten Prozessoren wären das 2 bis 3 Anweisungen.
Der Fakt, dass es nicht ausgelesen wird ist dabei eigentlich egal.
Alternativ könnte man im Assembler die Zeit mit NOOP auffüllen und hätte das gleiche Ergebnis:
Eine gültige Anweisung ohne Effekt.


----------



## Ebenius (17. Jan 2010)

Noctarius hat gesagt.:


> private sagt doch gerade, dass der Zugriff auf diese Instanz beschränkt ist.


Ein weit verbreiteter Irrtum. Der Zugriff ist auf die Klasse beschränkt; eben nicht auf irgendwelche Instanzen.



scones hat gesagt.:


> Wieso genau ist die Zeile
> 
> ```
> this.n+r.n;
> ...


Kapitel 14 der JLS3 definiert wie eine Anweisung aussehen muss: JLS3 §14. A+B ist ein gültiger Ausdruck, aber keine Anweisung.

Ebenius


----------



## Noctarius (17. Jan 2010)

Ebenius hat gesagt.:


> Ein weit verbreiteter Irrtum. Der Zugriff ist auf die Klasse beschränkt; eben nicht auf irgendwelche Instanzen.



Wieso das? Eine private static wäre aus meiner Sicht auf die Klasse beschränkt, eine normale private hat (zwar theoretisch auch) die Klasse als Scope, ist praktisch aber nur inner halb der einzelnen Instanzen sinnvoll nutzbar (ohne Reflection).


----------



## Ebenius (17. Jan 2010)

Noctarius hat gesagt.:


> [...] eine normale private [...] ist praktisch aber nur inner halb der einzelnen Instanzen sinnvoll nutzbar (ohne Reflection).


Das sehen alle meine Java-Compiler anders: 
	
	
	
	





```
public class PrivateAccessTest {

  private int privateMember;

  @Override
  public boolean equals(Object obj) {
    return obj instanceof PrivateAccessTest
          && ((PrivateAccessTest) obj).privateMember == this.privateMember;
  }
}
```
Die Zugriffskontrolle prüft aus Sicht der Typen und kennt keine Instanzen.

Ebenius


----------



## Noctarius (17. Jan 2010)

Hu Tatsache --- überzeugt Meister, ich hab mal wieder nichts gesagt und streite alles ab ;-)


----------

