Java Klassen/Methoden/Übergabeparameter

Crawlix

Mitglied
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;
	}
}
 

mihe7

Top Contributor
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).
 

Crawlix

Mitglied
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?
 
K

kneitzel

Gast
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.
 

mihe7

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Wie finde ich passende Java Klassen & Methoden? Java Basics - Anfänger-Themen 4
B Klassen Java Taschenrechner mit Klassen und Methoden Java Basics - Anfänger-Themen 12
TimoN11 Java Klassen Global einbinden Java Basics - Anfänger-Themen 1
G Java Klassen und Instanzmethoden Java Basics - Anfänger-Themen 15
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
I Klassen Mehrere Java Klassen in einer .java Datei Java Basics - Anfänger-Themen 7
lonelywanderer Erste Schritte Wie wende ich "Klassen" in Java an? Java Basics - Anfänger-Themen 8
C Java Klassen Design? Java Basics - Anfänger-Themen 5
Thallius Klassen aus Classname programmatisch erzeugen. Wie geht das in java? Java Basics - Anfänger-Themen 5
M xml log4j überschreiben für/in Java Klassen Java Basics - Anfänger-Themen 4
M OOP Java Klassen Microedition vs. Java 2 Standard Edition Java Basics - Anfänger-Themen 5
S Innere Klassen in Java Java Basics - Anfänger-Themen 4
M Wie bilde ich folgende Java Klassen in UML ab Java Basics - Anfänger-Themen 2
J Java-Klassen außerhalb von Eclipse debuggen Java Basics - Anfänger-Themen 7
D Java Klassen Java Basics - Anfänger-Themen 8
K OOP Java import zwei gleichnamiger Klassen Java Basics - Anfänger-Themen 5
M java erkennt import-klassen nicht?! Java Basics - Anfänger-Themen 39
J In JSP Java-Klassen einbinden Java Basics - Anfänger-Themen 3
N Aufrufen von .java Klassen in einem Projekt Java Basics - Anfänger-Themen 2
I [Java] Umgang mit abstrakten Klassen, Interfaceklassen (BSP) Java Basics - Anfänger-Themen 12
M Problem mit dem Klassen aus dem java.io Paket Java Basics - Anfänger-Themen 9
M Aus wieviel Klassen darf in Java eine (Programm)besitzen? Java Basics - Anfänger-Themen 21
G Anzahl der Klassen in Java Java Basics - Anfänger-Themen 7
A von Java-Beans Klassen aufrufen Java Basics - Anfänger-Themen 3
G Frage zum Abspeichern von Java-Klassen Java Basics - Anfänger-Themen 9
G Aufruf von JAVA-Klassen aus XML-Dialekt, Java-Skript o. JSP Java Basics - Anfänger-Themen 3
N Java Klassen kommentieren? Java Basics - Anfänger-Themen 13
G Java Programm das Klassen Implementiert Java Basics - Anfänger-Themen 5
F Java Klassen finden Java Basics - Anfänger-Themen 3
I Java Applet mit Klassen Java Basics - Anfänger-Themen 5
T Java Klassen benennung? Java Basics - Anfänger-Themen 4
L Java applet und andere Klassen unauffindbar? Java Basics - Anfänger-Themen 2
O Java Kara geschweifte Klammern Java Basics - Anfänger-Themen 2
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
XWing Java Klssenproblem Java Basics - Anfänger-Themen 4
R Umgebungsvariable java -cp gibt immer Java-Hilfe... Java Basics - Anfänger-Themen 3
farbenlos Csv Datei in Java einlesen Java Basics - Anfänger-Themen 18
F TableModelListener: java.lang.ArrayIndexOutOfBoundsException: 132 Java Basics - Anfänger-Themen 3
G Java 8 - Support-Ende Java Basics - Anfänger-Themen 7
T Java Weihnachtsbaum + Rahmen Java Basics - Anfänger-Themen 1
N Will mit Java anfangen Java Basics - Anfänger-Themen 13
Ü Java Array - Buchstaben als Zahlen ausgeben Java Basics - Anfänger-Themen 22
M Java Iterator Verständnisfrage Java Basics - Anfänger-Themen 6
M Java Mail Programm Java Basics - Anfänger-Themen 4
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
JaZuDemNo Java im Studium Java Basics - Anfänger-Themen 7
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
I QR code in Java selber generieren Java Basics - Anfänger-Themen 5
V Java-Ausnahmebehandlung: Behandlung geprüfter Ausnahmen Java Basics - Anfänger-Themen 1
krgewb Java Streams Java Basics - Anfänger-Themen 10
A Überwältigt von der komplexen Java Welt Java Basics - Anfänger-Themen 29
O Mehrfachvererbung auf Spezifikations- und Implementierungsebene in Java. Interfaces Java Basics - Anfänger-Themen 19
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
R mit Java API arbeiten Java Basics - Anfänger-Themen 9
P JDK installieren Probleme bei der Java-Installation Java Basics - Anfänger-Themen 8
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
Timo12345 JNLP File mit Java öffnen Java Basics - Anfänger-Themen 2
S Video Editierung mit Java.._ Java Basics - Anfänger-Themen 2
F Einstelungen in Java - CursorBlinkRate Java Basics - Anfänger-Themen 10
A PHP $_POST["name"] in Java Java Basics - Anfänger-Themen 3
vivansai21 Is there a oneliner to create a SortedSet filled with one or multiple elements in Java? Java Basics - Anfänger-Themen 9
Athro-Hiro Weißes Bild in Java erstellen Java Basics - Anfänger-Themen 3
Arjunreddy Can someone please tell me how to use a debugger in BlueJ(a Java environment) Java Basics - Anfänger-Themen 1
M Java assoziationen (UML) Java Basics - Anfänger-Themen 8
H Excel-Tabellen mit Java erstellen Java Basics - Anfänger-Themen 4
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
xXGrowGuruXx Java einstieg, leichte sache 0 verstanden Java Basics - Anfänger-Themen 7
A java.sql.SQLException: Data type mismatch. Java Basics - Anfänger-Themen 1
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
N Java Spiel Figur auf dem Hintergrundbild bewegen. Java Basics - Anfänger-Themen 11
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
N Java Taschenrechner hat Jemand vlt einen Tipp dafür wie ich jetzt die buttons verbinden kann und das Ergebnis auf dem textfield anzeigen lassen kann Java Basics - Anfänger-Themen 13
A Lerngruppe Java Java Basics - Anfänger-Themen 2
G Help me in the Java Program Java Basics - Anfänger-Themen 2
L Java- Vererbung Java Basics - Anfänger-Themen 4
LimDul Suche Java Stream Tutorial Java Basics - Anfänger-Themen 2
_so_far_away_ Ich möchte Java lernen Java Basics - Anfänger-Themen 11
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
V Bild per Java Script austauschen Java Basics - Anfänger-Themen 7
MoxMorris this Keyword in Java Java Basics - Anfänger-Themen 14
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
wolei JAVA Zeitdifferenz feststellen. Java Basics - Anfänger-Themen 4
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
monsterherz Ablauf der Erstellung eines Java Programmes Java Basics - Anfänger-Themen 17
monsterherz Circle.java:5: error: <identifier> expected Java Basics - Anfänger-Themen 2
julian-fr Wie kann ich am besten Java lernen? Java Basics - Anfänger-Themen 17
A Java-Properties und -RessourceBundles Java Basics - Anfänger-Themen 5
lrnz22 Java-Basics-Aufgabe Java Basics - Anfänger-Themen 8
R Java kann nicht installiert werden Java Basics - Anfänger-Themen 8
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
G In ein java Dokument Ton einbinden Java Basics - Anfänger-Themen 1
C was heisst es wenn java ']' erwartet ? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben