Methodenaufrufe

RalfBerlin

Mitglied
Hallo,

ich muss nächste Woche Mittwoch eine Präsentation über Methodenaufure in Java vortragen. Nur leider finde ich Internet keine verständliche Seite, der mir den callbyvalue vorgang gut erläutert. Kann mir einer beim folgenden Szenario die methodenaufrue mit hilfe der Begriffe Aktuelle Paraemter, FormalParameter und ÜBergabeParaemter erläutern. Ihr seid meine letzte Hoffnung. Ich bedanke mich schon vielmals.

Szenario:

Java:
Class Auto
{

String bez1;

setBEzeichnung(String bez)
{
bez1=bez;
}



getBezeichnung
{
return bez1;
}
}
 
 Class Reifen

{

void setReifen(Auto aref, String xyz,int x, double w)
{
Hier wird was gemacht;

}

     Public Auto machwas( String xyz)
 {
  AUto aref2 = new Auto();
 Mach was;
 return  aref2;

}}

Class Test
{
public static void main(String []args)
{
Reifen rref=  new Reifen();
String t=“xyz“;
int p=5;
double x= 25.0d;
Auto aref ;
rref.setReifen (aref,t,p,x);       //Nr1
rref.setReifen (aref,“Hallo“,6,50.0);   //Nr.2       
String xyz= aref.getBezeichnung ;  //Nr3
aref= rref.machwas(xyz);  //Nr4

}
}

Was passiert bei Nr1 bis Nr.4 Kann mir das einer Zeile für Zeile mithilfe der Begriffe AKtueller Parameter, Formaler Paramter und Übergabeparameter erklären. Hoffentlich kann einer mir helfen :(. Ihr seid meine letzte Hoffnung :(

PS: ich weiss was bei nr 1-4 passiert , aber ich muss es wie gesagt objektorientiert mit den begriffen aktueller Paraemter und Formaler Parameter erläutern :( .

Grüsse

Ralf
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Formaler parameter ist der Name der Variable, so wie er in der Methodendefinition steht
Aktueller Parameter ist der Wert, der dann beim Aufruf übergeben wird.

Aber das beispiel eignet sich nicht um CallByValue zu erklären, denn dazu müsste man den Unterschied zu CallByReference zeigen und mit "mach was" lässt sich nichts erklären.
Des weiteren ist es ein recht verbreitetes Thema, d.h. die Forumsuchen müsste etwas ausspruchen.
 

Andi_CH

Top Contributor
Das in der Vorlesung gehörte hilft dir das was unten passiert zu verstehen.
übrigens ist es Schei..... äh Piepegal ob es sich um static oder oo Funktionen handelt.

Java:
public class CallValueCallRefDemo {

	private static void demoCallByValue(int pValue) {
		System.out.println("demoCallByValue: Parameter vor dem Setzen = " + pValue);
		pValue = 5;
		System.out.println("demoCallByValue: Parameter nach dem Setzen = " + pValue);
	}

	private static void demoCallByReference(int [] pValue) {
		System.out.println("demoCallByReference: Parameter vor dem Setzen = " + pValue[0]);
		pValue[0] = 5;
		System.out.println("demoCallByReference: Parameter nach dem Setzen = " + pValue[0]);
	}

	public static void main(String[] args) {
		{
			int i = 0;
			System.out.println("Call by Value");
			System.out.println("I vor dem Aufruf von demoCallByValue = " + i);
			demoCallByValue(i);
			System.out.println("I nach dem Aufruf von demoCallByValue = " + i);
		}
		System.out.println("=============================================");
		{
			int[] i = {0};
			System.out.println("Call by reference");
			System.out.println("I vor dem Aufruf von demoCallByReference = " + i[0]);
			demoCallByReference(i);
			System.out.println("I nach dem Aufruf von demoCallByReference = " + i[0]);
		}
	}
}

[output:

Code:
Call by Value
I vor dem Aufruf von demoCallByValue = 0
demoCallByValue: Parameter vor dem Setzen = 0
demoCallByValue: Parameter nach dem Setzen = 5
I nach dem Aufruf von demoCallByValue = 0
=============================================
Call by reference
I vor dem Aufruf von demoCallByReference = 0
demoCallByReference: Parameter vor dem Setzen = 0
demoCallByReference: Parameter nach dem Setzen = 5
I nach dem Aufruf von demoCallByReference = 5
 

RalfBerlin

Mitglied
Hallo,

ihr habt meine Frage nicht verstanden. Ich weiss das bei Call by Value bei primitiven Datentypen der Wert des Aktuellen Parameters beim Formal Parameter während des Ausrufens kopiert wird. Und das bei Referenzen der Zugriffspfad auf das Objekt kopiert wird. Wird der Variablenwert innerhalb der Methode geändert, so ändert dies nicht den Wert ausserhalb der Methode.

Das habe ich so verstanden mir geht es nur darum wie ich die 4 zeilen beschreiben soll:

rref.setReifen (aref,t,p,x); //Nr1
rref.setReifen (aref,“Hallo“,6,50.0); //Nr.2
String xyz= aref.getBezeichnung ; //Nr3
aref= rref.machwas(xyz); //Nr4

Das Coding im Posting 1 habe ich auch angepasst:
Java:
Class Auto
{

String bez1;

setBEzeichnung(String bez)
{
bez1=bez;
}



 getBezeichnung
 {
 return bez1;
 }
 }

 Class Reifen


 {
 String abc;
  double w2;
  Auto aref2;
  
   void setReifen(Auto aref, String xyz,int x, double w)
  {

     abc=xyz;
     int k=x;
     w2=w*w;
     aref2=aref;
     aref2.setBezeichnung(abc);

   }

     Public Auto machwas( String xyz)
   {
       Auto aref2 = new Auto();
       aref2.setBezeichnung(xyz);

       return  aref2;

     }

}

  Class Test
 {
  public static void main(String []args)
  {
  Reifen rref=  new Reifen();
  String t=“xyz“;
  int p=5;
  double x= 25.0d;
  Auto aref ;
  rref.setReifen (aref,t,p,x);       //Nr1
  rref.setReifen (aref,“Hallo“,6,50.0);   //Nr.2
  String xyz= aref.getBezeichnung ;  //Nr3
  aref= rref.machwas(xyz);  //Nr4

}
}

Erläuterung der 4 Methoden:

rref.setReifen (aref,t,p,x); //Nr1
rref.setReifen (aref,“Hallo“,6,50.0); //Nr.2
String xyz= aref.getBezeichnung ; //Nr3
aref= rref.machwas(xyz); //Nr4

Wie gesagt ich muss das richtig erläutern mit den richtigen Begriffen und die Methodenaufrufe Zeile für Zeile. Könnt ihr schauen ob ich das so richtig erläuter und es dann verbessern :):

Nr1: setReifen (aref,t,p,x);

die methode setReifen der Klasse Reife bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch t von typ eines Strings, p typ von einem int und x von typ von double.

Ist das so Richtig ? das ist doch der aktuelle Parameter oder? wie kann ich den aufruf beschreiben.

Variante 2 für nr1:

Die methode setReifen der Klasse bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch die Zeichenkette „xyz, den wert 5 von typ int, den wert 25.0 von typ double

Wie ist das so? beschreibe ich das richtig?

Nr2: rref.setReifen (aref,“Hallo“,6,50.0);
Ist das gleiche wie Variante 2 Nr 1 oder?

Nr 3: String xyz= aref.getBezeichnung ;

Die referenzvariable aref ruft die Methode getBezeichnung auf. Als Rückgabetyp gibt die Methode getBezeichnung einen String zurück. Die Zeichenkette wird der Lokalen Variable xyz von typ String zugeordnet.

So richtig?

Nr: 4: aref= rref.machwas(xyz); //Nr4

die referenzvariable rref ruft die methode machwas der Klasse Reifen auf. Der Methode machwas wird als Aktueller parameter eine Zeichenkette übergeben. Die methode machwas gibt zurück ein Zugriffspfad auf ein Objekt der Klasse Auto. Der Zugriffspfad wird der referenzvariable aref zugewiesen.

Wie siehts hier aus?
Könnt ihr mir für nr1-4 eure Erläuterung schreiben. Ich hoffe einer kann mir bei meiner Problematik helfen. Wie sieht das in der Methode eigentlich aus:

Java:
Public Auto machwas( String xyz)
   {
       Auto aref2 = new Auto();
       aref2.setBezeichnung(xyz);

       return  aref2;
}

Die Methode machwas erwartet als FormalerParameter eine Zeichenkette ist das so richtig? Oder bei referenzen die methode xyz erwatet als Formalparameter einen Zugriffspfad auf ein Objekt der klasse zzz.

Wie gesagt was call by value macht weiss ich :) ich weiss nur nicht wie ich den methodenaufruf siehe Nr. 1-4 objektorientiert erläutern soll.

Ich hoffe ihr könnt mir helfen.

Grüsse
Ralf
 

VfL_Freak

Top Contributor
Moin,

ich habe mir mal die Freiheit genommen, Deinen Code etwas leserlicher zu formatieren ;)
Zudem habe ich einige kleine Änderungen/Erweiterungen vorgenommen (vgl. meine Kommentare)

Java:
public Class Auto  // !!
{
    String bez1;
    void setBEzeichnung(String bez)  // !!
    {
        bez1=bez;
    }
 
    String getBezeichnung  // !!
    {
       return bez1;
    }
} // Class Auto

 
public Class Reifen  // !!
{
    String abc;
    double w2;
    Auto aref2;
  
    void setReifen(Auto aref, String xyz,int x, double w)
    {
        abc=xyz;
        int k=x;
        w2=w*w;
        aref2=aref;
        aref2.setBezeichnung(abc);
    }
 
    public Auto machwas( String xyz)  // !!
    {
        Auto aref2 = new Auto();
        aref2.setBezeichnung(xyz);
        return aref2;
    }
} // Class Reifen
 

public Class Test  // !!
{
    public static void main(String []args)
    {
        Reifen rref = new Reifen();
        String t=“xyz“;
        int p=5;
        double x= 25.0d;
        Auto aref;
        rref.setReifen (aref,t,p,x);
        rref.setReifen (aref,“Hallo“,6,50.0);  // überschreibt die Werte aus der vorherigen Zeile,
                                               // da das gleiche Objekt aref benutzt wird !!
        String xyz= aref.getBezeichnung;       // die Bezeichung wurde noch nicht gesetzt !!
        aref= rref.machwas(xyz);               // vermutlich solltest Du diese Zeile mit der 
                                               // darüberliegenden tauschen !!
    }
} // Class Test

Gruß
Klaus
 

VfL_Freak

Top Contributor
ok, da hast Du nicht ganz unrecht, aber im Original wohl auch :D

dann eben sowas :
Java:
String sReifenBez = "MeinReifen";
aref= rref.machwas( sReifenBez );
String xyz= aref.getBezeichnung;       // 'xyz' sollte jetzt "MeinReifen" enthalten ...

Gruß
Klaus
 
B

bone2

Gast
es ist so oder so eine nullpointer exception.

edit: öfter f5 drücken^^
 
Zuletzt bearbeitet von einem Moderator:

RalfBerlin

Mitglied
Vielen Dank VFL Freak das du Coding benutzerfreundlicher angepasst hast :)

Mir gehts es um Zeile 49 - 53

rref.setReifen (aref,t,p,x);
rref.setReifen (aref,“Hallo“,6,50.0);
String xyz= aref.getBezeichnung;
aref= rref.machwas(xyz);

Sind meine Erläuterungen die ich in 2.Post so geschrieben habe richtig ? :) ich glaube es nicht :( .

Zeile 49:

setReifen (aref,t,p,x);

die methode setReifen der Klasse Reife bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch t von typ eines Strings, p typ von einem int und x von typ von double.

Ist das so Richtig ? das ist doch der aktuelle Parameter oder? wie kann ich den aufruf beschreiben.

2. Lösung für Zeile 49:

Die methode setReifen der Klasse bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch die Zeichenkette „xyz, den wert 5 von typ int, den wert 25.0 von typ double


Zeile 50:

ref.setReifen (aref,“Hallo“,6,50.0);
Erläutering wie die 2.Lösung für Zeile 49.



Zeile 52:
String xyz= aref.getBezeichnung ;

Die referenzvariable aref ruft die Methode getBezeichnung auf. Als Rückgabetyp gibt die Methode getBezeichnung einen String zurück. Die Zeichenkette wird der Lokalen Variable xyz von typ String zugeordnet.

So richtig?

Zeile 53:

aref= rref.machwas(xyz); //Nr4

die referenzvariable rref ruft die methode machwas der Klasse Reifen auf. Der Methode machwas wird als Aktueller parameter eine Zeichenkette übergeben. Die methode machwas gibt zurück ein Zugriffspfad auf ein Objekt der Klasse Auto. Der Zugriffspfad wird der referenzvariable aref zugewiesen.
 
B

bone2

Gast
ein problem ist, das es dein auto nicht gibt. aref ist null, es referenziert auf nichts.

[c]Auto aref = new Auto();[/c] müsste es heißen
 

RalfBerlin

Mitglied
Java:
public Class Auto  // !!
{
    String bez1;
    void setBEzeichnung(String bez)  // !!
    {
        bez1=bez;
    }
 
    String getBezeichnung  // !!
    {
       return bez1;
    }
} // Class Auto
 
 
public Class Reifen  // !!
{
    String abc;
    double w2;
    Auto aref2;
  
    void setReifen(Auto aref, String xyz,int x, double w)
    {
        abc=xyz;
        int k=x;
        w2=w*w;
        aref2=aref;
        aref2.setBezeichnung(abc);
    }
 
    public Auto machwas( String xyz)  // !!
    {
        Auto aref2 = new Auto();
        aref2.setBezeichnung(xyz);
        return aref2;
    }
} // Class Reifen
 
 
public Class Test  // !!
{
    public static void main(String []args)
    {
        Reifen rref = new Reifen();
        String t=“xyz“;
        int p=5;
        double x= 25.0d;
        Auto aref = new Auto();
        Auto aref3= new Auto();
        rref.setReifen (aref,t,p,x);                // nr.1
        rref.setReifen (aref3,“Hallo“,6,50.0);  // nr.2                                       
        String xyz= aref.getBezeichnung;      // nr. 3   
        aref= rref.machwas(xyz);                // nr.4  
                                               
    }
} //

Ich habe das Coding nochmals angepasst. Hoffentlich ist es jetz in Ordnung.

Also es geht mir um Erläuterung der Aufrufe Nr.1 bis Nr. 4 . Wie Call by value funktioniert weiss, und das es kein Call by Referenz gibt.

Erläuterung von 1-4

Nr1: rref.setReifen (aref,t,p,x);

DIe Referenzvariable rref ruft die Methode setReifen auf. Die methode setReifen der Klasse Reife bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch t von typ eines Strings, p typ von einem int und x von typ von double.


Variante 2 für nr1:

Die methode setReifen der Klasse bekommt als Aktuelle Parameter einen Zugriffspfad auf ein Objekt der Klasse Auto, dazu noch die Zeichenkette „xyz, den wert 5 von typ int, den wert 25.0 von typ double

Wie ist das so? beschreibe ich das richtig?

Nr2: rref.setReifen (aref3,“Hallo“,6,50.0)

Erläuterung wie Variante 2 von Nr.1 ab nur das die Methode einen anderen Zugriffpfad auf eiN objekt der Klasse Auto bekommt.

Nr 3: String xyz= aref.getBezeichnung ;

Die referenzvariable aref ruft die Methode getBezeichnung auf. Als Rückgabetyp gibt die Methode getBezeichnung einen String zurück. Die Zeichenkette wird der Lokalen Variable xyz von typ String zugeordnet.

So richtig?

Nr: 4: aref= rref.machwas(xyz);


die referenzvariable rref ruft die methode machwas der Klasse Reifen auf. Der Methode machwas wird als Aktueller parameter eine Zeichenkette übergeben. Die methode machwas gibt zurück ein Zugriffspfad auf ein Objekt der Klasse Auto. Der Zugriffspfad wird der referenzvariable aref zugewiesen.
 

RalfBerlin

Mitglied
Will mir keiner helfen :( ?


noch ne andere Frage....erhält ein dekalierte Variable String auch einen Zugriffspfad auf ein Objekt der Klasse String oder nur die Zeichenkette zurück.

z.b

Klasse Name:

Objekt methode getName liefert einen String zurück. xzy ist referenzvaraible der Klasse Name

String k= xzy.getName(); //6

6: wird der Variablen k von Typ String der Zugriffspfad auf ein Stringobjekt zurückgegeben? oder wird hier nur der Wert(die Zeichenkette) zurückgegeben ?
 

Ähnliche Java Themen

Neue Themen


Oben