# Methoden + Übergabeparameter



## paco89 (13. Nov 2011)

hi, ich lerne seit kurzem wie man programmiert und bin beim Thema Methoden bzw. Methodenaufruf, Übergabeparameter usw.
zu diesen themen gab es ein beispielcode in dem buch, was ich gerade lese:


```
class RefTyp
{
 int x;
}

public class Parameter
{

    public static void methode1 (int par)
    {
        par = 2;
    }
    
    public static void methode2(RefTyp refPara)
    {
        refPara.x = 2;
    }
    
    public static void main (String [] args)
    {
    
        int var  = 1;
        RefTyp ref = new RefTyp();
        ref.x = 1;
        
        System.out.println("Übergabeparameter ist von einem " 
                            + "einfachen Datentyp");
        System.out.println("aktueller Parameter vor Aufruf: " + var);
        methode1 (var);
        System.out.println("aktueller Parameter nach Aufruf: " + var);
        System.out.println("Übergabeparameter ist ein Referenztyp");
        System.out.println("Datenfeld vor Aufruf : " + ref.x);
        methode2 (ref);
        System.out.println("Datenfeld nach Aufruf : " + ref.x);
       
    }

}
```



ich wollte hier nur mal schreiben, ob ich den code richtig verstanden habe:
der formale paramater der methode "methode1" (par) ist von einem einfachen Datentyp. der formale paramater der Methode "methode2" (refPara) ist eine Referenz auf ein Objekt vom Typ Reftyp.
in der main-Methode wird zunächst einmal der variablen var der Wert 1 zugewiesen. anschließend wird eine neue Referenzvariable ref erzeugt, die auch auf ein Objekt vom Typ RefTyp zeigen kann.
danach zeigt die referenzvariable auf das datenfeld x und weist dem x den wert 1 zu.

was in den System.out.println-befehlen passiert, weiß ich. Dass man also mit dem Plus-Operator Strings miteinander verbinden kann usw. das ist schon klar. 
was mir allerdings nicht klar ist, was die Zeile 29 bedeuten soll. da wird doch der methode1 der wert von der variablen, also die 1 übergeben, oder etwa nicht? aber darf man auf diese weise methoden aufrufen? ich dachte mir immer dass man eine referenzvariable braucht, um mit dem punktoperator die methode aufzurufen. ist das etwa nicht so?

und in der zeile passiert genau dasselbe spiel: der methode2 wird die in der main-methode erzeugte referenzvariable übergeben, was ja auf die 1 zeigt.


habe ich den code richtig verstanden? wenn ja, kann mir jmd. dann die stellen erklären, die mir noch nicht so klar sind?


vielen dank schonma im voraus


----------



## Sunchezz (13. Nov 2011)

an sich alles richtig 



paco89 hat gesagt.:


> was mir allerdings nicht klar ist, was die Zeile 29 bedeuten soll. da wird doch der methode1 der wert von der variablen, also die 1 übergeben, oder etwa nicht?


richtig, mehr passiert da einfach nicht!



paco89 hat gesagt.:


> aber darf man auf diese weise methoden aufrufen? ich dachte mir immer dass man eine referenzvariable braucht, um mit dem punktoperator die methode aufzurufen. ist das etwa nicht so?



wird die Methode in der selben klasse implementiert, wird der "punkt" nicht gebraucht.
Der Compiler sucht erst innerhalb der Klasse ob die gegebene Methode drin enthalten ist.
Wenn ja, ist ein solcher Methodenaufruf völlig normal.


----------



## faetzminator (13. Nov 2011)

Bei statischen Methoden braucht man das sowieso nicht. Wenn eine externe, statische Methode aufgerufen werden soll, kann man dies mit [c]Klasse.methode()[/c] machen, also z.B. [c]Parameter.methode1(int)[/c]. Wenns eine nicht-statische Methode wär, dann könne man [c]this.methode()[/c] schreiben.


----------



## paco89 (13. Nov 2011)

Sunchezz hat gesagt.:


> wird die Methode in der selben klasse implementiert, wird der "punkt" nicht gebraucht.




das heißt also: wenn die methode, die ich aufrufe, in der klasse drinsteckt, in der auch die main-methode ist, kann ich beim aufrufen der methode auf den punktoperator verzichten, oder was?
habe ich dich richti verstanden?


edit: ich habe folgende ausgabe auf meiner Konsole:


Übergabeparameter ist von einem einfachen Datentyp
aktueller Parameter vor Aufruf:1
aktueller Parameter nach Aufruf:1
Übergabeparameter ist ein Referenztyp
Datenfeld vor Aufruf:1
Datenfeld nach Aufruf:2



eine frage noch dazu:

warum mein Datenfeld x nach dem aufruf den wert 2 hat, versteh ich. vor dem aufruf zeigt die referenzvariable auf den wert 1. nach dem aufruf der methode2 zeigt die referenzvariable "ref" wie die referenzvariable "refPara" auch auf die 2. 
falls das richtig sein sollte, dann freue ich mich und komme zum eigentlich punkt:
warum hat aber der aktuelle Parameter nach dem parameter nach dem aufruf der der methode1 wieder den wert 1 ? ich erklär mir das folgendermaßen: der formale parameter "par" bekommt nach dem aufruf den wert von der lokalen variable "var" , was 1 ist. wird also der wert von "par" , was vorher innerhalb der methode mit 2 initialisiert wurde, einfach überschrieben?


----------



## Sunchezz (13. Nov 2011)

Nein, nicht wenn die Methode in der gleichen klasse ist wie die main Methode.
Wenn die Methode in der gleichen klasse ist, von wo du sie auch aufrufst.
(Du hast ja in späteren Projekten mehrere Klasses)
dann hast du folgende Möglichkeiten:


```
methodeTueDies(wert);

this.methodeTueDies(wert); //("this" ist ein Verweis auf die aktuelle Klasse);
```

sollte die zu benutzende Methode jedoch statisch sein:


```
Klassenname.methodeTueDies(wert);
```


gaaanz banal gesehen ist das objekt in zeile 16 ein link (oder auch richtig genannt eine Referenz)
auf das Objekt in Zeile 23.
Das x daran nun aber eine refferenz auf ein Objekt innerhalb der Klasse RefTyp die wir ja nicht sehen.
Also veränderst du werte über refferenzen


----------



## Sunchezz (13. Nov 2011)

methode1 & und 2 haben untereinander ja garnichts miteinander zu tun,
weiß grad nich wie du darauf kommst!

die eine variable heist "par", die eines anderen objekts "rePara".
die beiden haben nichts miteinander zu tun

du übergibst beim aufruf von methode1 den inhalt von "var" (=1)
dadurch wird innerhalb der methode im formalen parameter 1 ankommen.
das ist aber völlig wurscht, da "par" danach sofort wieder mit derm wert 2 überschrieben wird.

also hast du letztendlich an der variable "var" nichts verändert.
und die wird unten in den prints nur ausgelesen, also bleibt die ausgabe 1.


----------



## paco89 (13. Nov 2011)

okay, danke. habs jetzt endlich gerafft.


----------



## Sunchezz (13. Nov 2011)

freut  mich 
und viel spaß weiterhin!


----------

