Java Klassen/Methoden/Übergabeparameter

Hallo, um mein Verständnis bzgl Call by Value und Reference etwas zu festigen (bzw es mir erstmal praktisch anzueignen (xD)) hätte ich vlt eine bitte ein euch.

Ich will ein Programm schreiben welches die Grundrechenarten behandelt ( immer nur 2 Werte).
Ich will den SINN verstehen, wann Methoden ausgelagert werden und WIE...

Habe hier mal ein Code beispiel (funktioniert nicht)..

Könntet ihr mir zeigen, wie das aussehen würde? PS: Es ist keine Hausaufgabe oder dergleichen.


Java:
package methoden;
import java.util.Scanner;

public class grundRechnen {
	public static void main(String[]args) {
	
		lesen();
		auswahl(wahl);
	}
	
	public static void lesen() {
		Scanner scan1 = new Scanner(System.in);
		double a = 0;
		double b = 0; 
		
		a = scan1.nextDouble();
		b = scan1.nextDouble();
	}
	
	public static void auswahl(double wahl, double a, double b) {
		
		System.out.println("Zwei Werte miteinander...\n(1) addieren\n(2) subtrahieren\n(3) multiplizieren\n(4) dividieren\nBitte wählen: ");
		double wahl = 0;
		Scanner scan = new Scanner(System.in);
		wahl = scan.nextDouble();
		
		if(wahl == 1)
		{
			plus(a, b);
		}
		if(wahl == 2)
		{
			minus(a, b);
		}
		if(wahl == 3)
		{
			mal(a, b);
		}
		if(wahl == 4)
		{
			geteilt(a, b);
		}
	}

	public static double plus(double a, double b) {
		double e = 0;
		e = a+b;
		
		return e;
	}
	
	public static double minus(double a, double b) {
		double e = 0;
		e = a-b;
		
		return e;
	}
	
	public static double mal(double a, double b) {
		double e = 0;
		e = a*b;
		
		return e;
	}
	
	public static double geteilt(double a, double b) {
		double e = 0;
		e = a/b;
		
		return e;
	}
}
 
um mein Verständnis bzgl Call by Value und Reference etwas zu festigen
Es gibt in Java nur Call by Value (CbV)

Könntet ihr mir zeigen, wie das aussehen würde?
Den einen Weg, den gibt es nicht, deswegen ist Deine Frage schwierig zu beantworten.

Dein Code hat schon mal den Fehler, dass lesen() zwei lokale Variablen deklariert (a und b) und diese nach der Zuweisung nicht verwendet werden. Du müsstest sie z. B. zurückgeben. Im schlechtesten Fall nimmst Du dafür ein Array:
Java:
public static double[] lesen() {
    double[] result = new double[2];
    Scanner scan = new Scanner(System.in);
    result[0] = scan.nextDouble();
    result[1] = scan.nextDouble();
    return result;
}
Deine Methode auswahl(...) macht zu viel: Eingabe und Verarbeitung. Hier könnte nur die Auswahl erfolgen. Da es in Java nur CbV gibt, ist der Parameter wahl in der Methodensignatur auch unsinnig (und führt zu einem Fehler, weil Du in der Methode versuchst, wahl nochmals zu deklarieren).
 
Es gibt in Java nur Call by Value (CbV)


Den einen Weg, den gibt es nicht, deswegen ist Deine Frage schwierig zu beantworten.

Dein Code hat schon mal den Fehler, dass lesen() zwei lokale Variablen deklariert (a und b) und diese nach der Zuweisung nicht verwendet werden. Du müsstest sie z. B. zurückgeben. Im schlechtesten Fall nimmst Du dafür ein Array:
Java:
public static double[] lesen() {
    double[] result = new double[2];
    Scanner scan = new Scanner(System.in);
    result[0] = scan.nextDouble();
    result[1] = scan.nextDouble();
    return result;
}
Deine Methode auswahl(...) macht zu viel: Eingabe und Verarbeitung. Hier könnte nur die Auswahl erfolgen. Da es in Java nur CbV gibt, ist der Parameter wahl in der Methodensignatur auch unsinnig (und führt zu einem Fehler, weil Du in der Methode versuchst, wahl nochmals zu deklarieren).



Könntest du das programm evtl mal richtig schicken :x?
 
Also erst einmal möchte ich Dein "Call by Value" und "Call by Reference" etwas behandeln, indem ich kurz erläutere, was das bedeutet:

Dabei ist das Szenario, dass wir das sozusagen nachspielen. Du bist die Methode und ich rufe Dir den Aufruf zu. Desweiteren sind Variablen bei uns einfache Zettel.
a) Dann bedeutet Call by Value:
Ich habe auf dem Zettel etwas stehen und ich sage Dir lediglich, was auf dem Zettel steht. Du hast dann bei Dir einen eigenen Zettel und auf den schreibst Du den Wert, den ich Dir gesagt habe, dann auf.

Du kannst nun auf Deinem Zettel machen was Du willst: Das verändert den Inhalt meines Zettels nicht!

b) Nun machen wir ein Call by Reference:
Ich sage Dir nicht den Wert, sondern ich sage Dir, wo mein Zettel ist. Damit nutzt Du keinen eigenen Zettel sondern meinen Zettel. Wenn Du den Wert auf diesem Zettel nun veränderst, dann ist klar: Wenn ich mir meinen Zettel ansehe, dann habe ich da den veränderten Wert drauf.

Und dieses Call by Reference gibt es in Java schlicht nicht. Ich kann Dir nicht meinen Zettel geben!

Was aber oft durcheinander gebracht wird: Natürlich gibt es Behälter mit Zetteln. Dann steht auf meinem Zettel: Aktentasche Nr. 17. Wenn ich nun den Call by Value mache, sage ich Dir natürlich: Aktentasche Nr. 17! Dann kannst Du diese Aktentasche nehmen und auf den Zetteln da drin was schreiben. Wenn Du dann mir sagst: "Ich bin fertig!", dann kann ich mir die Aktentasche nehmen und sehe deine Veränderungen. Das ändert aber nichts daran, dass es ein reines Call by Value war.

Jetzt wird in Java halt zwischen Zetteln und Behältern für mehrere Zettel unterschieden. Diese Zettel wären dann die sogenannten Value Types. Die Behälter wären dann die Objekte.

Jetzt etwas zu Deinem Code:
Ein Problem ist evtl. der Geltungsbereich, Sichtbarkeit und Lebensdauer von Variablen.

Eine Variable, welche in einer Methode erstellt wurde, ist nur in der Methode gültig. a und b in Deiner lesen Methode sind also Zettel, die erstellt werden, wenn die Methode aufgerufen wird und die sofort weg sind, wenn die Methode beendet wurde.
Somit musst du die Daten irgendwie zurück bekommen:
- Eine Methode ist oft, dass ein Ergebnis zurück gegeben wird. Also Du bist die Addier-Methode und ich rufe Dich an: "Gib mir das Ergebnis von 2 und 3!" - Du machst dann die Addition und sagst mir: 5! Das hat nur einen Haken: Du kannst mir nur ein Ergebnis nennen! Das Gute: Das könnte auch eine Aktentasche sein, aber diese muss vorab definiert worden sein (Also Instanzen von Klassen können auch zurück gegeben werden).
- Eine andere Möglichkeit ist, dass wir in Deiner Umgebung etwas schaffen, auf das Du zugreifen kannst. Wenn Du eine Methode bist, dann hast Du da eine Klasse (bei statischen Methoden) oder eine Instanz (so du nicht statisch bist) um dich herum. Also wenn wir uns geeinigt haben: Immer wenn man dir zwei Zahlen zuruft, dann schreibst du einfach das Ergebnis auf einen bestimmten, festgelegten Zettel in Deinem Raum, dann funktioniert das auch. (Dann muss ich nur eben auch Zugriff auf den Zettel bekommen. Aber evtl. gibt es ja einen Vorleser, den ich fragen kann (Wäre dann auch eine Methode, nennt sich dann im Java Umfeld Getter).

Also wenn wir auf deine Methode lesen zurück kommen:
- entweder Du veränderst die so, dass nur ein Wert gelesen wird. Dann würdest du die Methode zwei mal aufrufen und jedes Mal ein Ergebnis zurück bekommen. Dann hättest Du einen Methodenkopf wie z.B. public static double lesen().
- oder Du erstellst in deiner Klasse noch zwei statische Variablen. Dann kann deine lesen Methode da Werte rein schreiben. (Statisch, weil Deine Methode auch noch statisch ist!)

Das als eine hoffentlich hilfreiche Erläuterung bezüglich der Kernprobleme und wie dies etwas zusammen hängt. Hoffe, der Vergleich ist halbwegs verständlich. Natürlich hinkt so ein Vergleich immer etwas, aber es hilft hoffentlich eine konkreter Vorstellung zu haben, die dann beim Verständnis hilft.
 
Ich kann Dir Deinen Code umschreiben, so dass er läuft. Als "richtig" würde ich das nicht bezeichnen, hier mal in einer etwas gekürzten Fassung:
Java:
import java.util.Scanner;

public class GrundRechnen {
    public static void main(String[]args) {
  
        double[] operanden = lesen();
        int operation = auswahl();
        System.out.printf("Ergebnis: %f\n",
                berechne(operation, operanden[0], operanden[1]));
    }
  
    public static double[] lesen() {
        double[] result = new double[2];
        Scanner scan = new Scanner(System.in);
        result[0] = scan.nextDouble();
        result[1] = scan.nextDouble();
        return result;
    }
  
    public static int auswahl() {
        System.out.println("Zwei Werte miteinander...\n(1) addieren\n(2) subtrahieren\n(3) multiplizieren\n(4) dividieren\nBitte wählen: ");
        Scanner scan = new Scanner(System.in);
        return scan.nextInt();
    }

    public static double berechne(int operation, double a, double b) {  
        switch(operation) {
            case 1: return plus(a,b);
            case 2: return minus(a,b);
            case 3: return mal(a,b);
            case 4: return geteilt(a,b);
            default: throw new IllegalArgumentException("Operation " +
                    operation + " unbekannt.");
        }
    }

    public static double plus(double a, double b) { return a+b; }  
    public static double minus(double a, double b) { return a-b; }  
    public static double mal(double a, double b) { return a*b; }
    public static double geteilt(double a, double b) { return a/b; }
}
EDIT: neu eingefügt, wegen Formatierung.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben