Java Bin am verzweifeln... verstehe das return Schlüsselbegriff nicht, wofür soll das gut sein?

vram78

Lieutenant
Registriert
Dez. 2015
Beiträge
720
Hallo,

Bin momentan leider am durchdrehen weil ich etwas seit Monaten nicht verstehe. Es geht um Methoden in Java, genauer: Es geht um "return" und das ich nicht weiß wofür das gut sein soll.

Hier ein Codebeispiel:

Java:
public class MyClass {
        
    static int testMethode(int Zahl) {
        if(Zahl < 2) {
            System.out.println("kleiner");
        } else {
            System.out.println("Größer");
        }
        
        return Zahl;
    }
    
    public static void main(String[] args) {
         
        testMethode(1);
           
    }
}

Also, wofür soll das return gut sein!? Ich verstehe es immer noch nicht. Warum muss ich das angeben? Kann es mir jemand in Pseudocode erklären? Ich habe es bereits gegoogelt aber ich verstehe es einfach nicht, was man da zurückgeben will... WAS will man zurückgeben? WAS fürn Wert? Wohin will man was zurückgeben?!

Außerdem funktioniert das auch wunderbar ohne dieses return:

Java:
public class MyClass {
    
    static void testMethode(int Zahl) {
        if(Zahl < 2) {
            System.out.println("kleiner");
        } else {
            System.out.println("Größer");
        }
        
    
    }
    
    

    public static void main(String[] args) {

        testMethode(1);
            
    }
}

Das mit dem Parameter habe ich endlich verstanden, die Methode erwartet halt beim aufrufen Parameter, z.B Zahlen...

Aber return macht mich wahnsinnig, ich verstehe den Sinn nicht.

MFG
 
Also deine Funktion soll doch etwas machen und es ist so das es immer ein Ergebnis gibt entweder z.B. ein Mathematisches 3*3 = Ergebnis; return Ergebnis; dann kannst du mit dem Ergebnis übergreifend weiter rechnen z.b. in einer anderen Funktion als Parameter oder du lässt einfach eine true als return zurückgeben damit du weißt das die Funktion erfolgreich durchgeführt wurde.
 
In deinem Beispiel braucht man wirklich kein return. Return braucht man, wenn man das Ergebnis einer Funktion braucht z.b.:
public static int sum (int a, int b){
return a+b;}
Dann kann man schreiben system.out.println(sum(5,5)+5) . Ausgabe ist dann 15, weil der Term sum(5,5) zu dem Wert 10 ausgewertet wird. Hier brauchst du return um festzulegen welcher Wert zurückgegeben werden soll.
public static int sum2(int a, int b){
return a;}
System.out.println(sum2(5,5)+5) ist dann halt 10 weil sum2 immer zu dem Wert von a ausgewertet wird. Außerdem beendet return die Abarbeitung einer Funktion.
 
Methoden sind eine nützliche Struktur um den Code lesbarer zu gestalten, hier eine Beispiel mit return, welches auch Sinn macht. In deinem Beispiel macht die void Methode ohne Rückgabewert mehr Sinn.

Java:
import java.util.Scanner;

public class XmasTree {

    public int level;

    /**
     * Konstruktor fuer den Weihnachtsbaum
     * @param level Benutzerangabe der Baumhoehe als Integer
     */
    public XmasTree(int level){
        this.level = level;
    }

    /**
     * Main Methode mit Eingabemoeglichkeit des Benutzers
     * @param args Aufrufsparameter vom Benutzer
     */
    public static void main(String[] args){
        System.out.println("Seid gegruesst, weit her vom Nordpol komme ich her.\n" +
                "Auf meinem Schlitten habe ich zahlreiche Weihnachtsbaeume." +
                "\n" +
                "Wie groß soll denn deiner sein? Gib einfach die Höhe an: ");
        int hoehe = 0;
        try{
            Scanner sc = new Scanner(System.in);
            hoehe = sc.nextInt();
            sc.close();
            if(hoehe<=0){
                System.out.println("Hohohoho, da versucht mich ja jemand auszutricksen - so wird das aber nichts" +
                        " mit dem Weihnachtsbaum. Da hast du dieses Jahr leider Pech gehabt.");
            }else{
                System.out.println("Hier ist dein Weihnachtsbaum, viel Spaß beim dekorieren:\n");
                XmasTree tree = new XmasTree(hoehe);
                System.out.println(tree);
            }
        }catch(Exception e){
            System.out.println("Hohohoho, da versucht mich ja jemand auszutricksen - so wird das aber nichts" +
                    " mit dem Weihnachtsbaum. Da hast du dieses Jahr leider Pech gehabt.");
        }
    }

    /**
     * Erstellt einen huebschen String für die Ausgabe des Baumes aus Spitze, Mr. Baum hoechstpersoenlich und seinem Stamm
     * @return Baum als ansehlicher String
     */
    public String toString(){
        return treeTopper(level) + treeLevel(level) + treeTrunk(level);
    }

    /**
     * Erstellt die Spitze des Baumes
     * @param level Benutzerangabe der Baumhoehe als Integer
     * @return Spitze als ansehlicher String
     */
    public String treeTopper(int level){
        String topper = "";

        for(int i=0;i<=level;i++){
            topper = topper + " ";
        }

        topper = topper + "*";
        return topper;
    }

    /**
     * Erstellt den Stamm des Baumes
     * @param level Benutzerangabe der Baumhoehe als Integer
     * @return Stamm als ansehlicher String
     */
    private String treeTrunk(int level){
        String trunk = "";

        for(int i=0;i<level;i++){
            trunk = trunk + "^";
        }

        trunk = trunk + "[_]" + trunk;
        return trunk;
    }

    /**
     * Erstellt den Baum, alias Mr. Baum hoechstpersoenlich
     * @param level Benutzerangabe der Baumhoehe als Integer
     * @return Baum als ansehlicher String
     */
    private String treeLevel(int level){
        level = level * 2;
        String levels = "";
        int floorChecker = 0;
        int spaceToWall = level;


        for(int i=level;i>0;i--){

            levels = levels + "\n";

            if(floorChecker%2==0) {
                for (int j = 0; j < (spaceToWall / 2); j++) {
                    levels = levels + " ";
                }
            }else{
                for (int j = 0; j < (spaceToWall / 2); j++) {
                    levels = levels + " ";
                }
            }

            if((level%2)+1==0){
                levels = levels + "/,";
            }else{
                levels = levels + "/";
            }

            for(int k=0;k<=floorChecker;k++){

                if(floorChecker%2==0){
                    if(k%2==0){
                        levels = levels + ".";
                    }else{
                        levels = levels + ",";
                    }
                }else{
                    if(k%2==0){
                        levels = levels + ",";
                    }else{
                        levels = levels + ".";
                    }
                }

            }

            if(floorChecker%2!=0){
                levels = levels + ",";
            }


            if((level%2)+1==0){
                levels = levels + ",\\";
            }else{
                levels = levels + "\\";
            }

            floorChecker++;
            spaceToWall--;

        }

        levels = levels + "\n";
        return levels;
    }
}

Kopier dir bitte den Code mal in eine Datei und führe ihn aus, wenn alles klappt, was es sollte, dann solltest du nach einer Zahl in der Konsole gefragt werden und der Code generiert einen Ascii-Weihnachtsbaum mit der Zeilenhöhe der angegebenen Zahl.

Im Code werden die einzelnen Bestandteile des Baumes mit return an den Ursprungsort zurückgegeben und ermöglichen es hier, den Code flexibel zu werden. Egal welche Zahl man eingibt, der Baum sieht dennoch immer richtig aus. Ich bin mies im Erklären, daher bitte ich dich mal den Code genau zu studieren. Versuch ruhig mal, die gleiche Aufgabe ohne return Anweisungen - da wirst du recht schnell merken, dass es bei weitem nicht so elegant werden kann, wie diese Variante.

Für Stilfehler im Code hafte ich nicht, dieser stammt aus einer Zeit, als ich mit dem Programmieren angefangen habe.
 
Das Return ist dafür da eine Variable aus deiner Methode raus zubekommen, so wie Parameter dafür da sind Variablen in die Funktion rein zu bekommen.

In komplexerem Code als bei deinem Beispiel muss man ausgabelogik ggf. wonders machen als in der Funktion die die Prüflogik hat, daher kann man Ergebnisse über Return zurückgeben:
Java:
public class MyClass {
     
    static boolean testMethode(int Zahl) {
        boolean greaterThanTwo = false;
        greaterThanTwo = Zahl > 2;
     
        return greaterThanTwo;
    }
 
    public static void main(String[] args) {
     
//der zurückgegebene Wert kommt aus der Funktion und kann zugewiesen/verwendet werden
        boolean returnValueBool = testMethode(1);
        if (returnValueBool) {
            System.out.println("Größer");
        } else {
            System.out.println("kleiner");
        }
     
       
    }
}
 
Zuletzt bearbeitet:
Code läuft von oben nach unten durch. Wenn du in der main Methode eine andere aufrufst, so springst du kurz raus. Das return sorgt dafür, dass man wieder zurückspringt. Die main Methode selbst wird automatisch aufgerufen.

Nur weil man ein return nicht immer schreiben muss, heißt es nicht dass keines da ist - Java ergänzt gewisse Dinge, z.B. auch hat jede Klasse einen leeren Konstruktor, auch wenn du ihn nicht hinschreibst. Schau mal in die .class files rein, da siehst du was der Java Kompiler am Ende daraus gemacht hat. Kannst jede .jar einfach entzippen.

Deswegen sagt man auch oft, man solle erst C lernen. Da versteht man warum dies so ist, da die Programmiersprache nichts im Hintergrund versteckt. In C ist es sogar essentiell gescheite return Werte zu liefern, um außerhalb prüfen zu können ob eine Funktion erfolgreich war oder nicht. Üblich werden Werte wie 0,1, -1 genommen. In Java fällt dies weg, wenn dann benutzt man booleans dafür.
 
Zuletzt bearbeitet von einem Moderator:
Hallo,
"return" beendet nur die aktuell ausgeführte Methode und gibt ein Ergebnis in Form eine Objekts, eines primitiven Datentypen oder eben "void" zurück. Bei void ist die Angabe
des Rückgabetyps nicht notwendig/möglich.

greetz
hroessler
Ergänzung ()

rob- schrieb:
Nur weil man ein return nicht immer schreiben muss, heißt es nicht dass keines da ist - Java ergänzt gewisse Dinge, z.B. auch hat jede Klasse einen leeren Konstruktor, auch wenn du ihn nicht hinschreibst. Schau mal in die .class files rein, da siehst du was der Java Kompiler am Ende daraus gemacht hat. Kannst jede .jar einfach entzippen.

Deswegen sagt man auch oft, man solle erst C lernen. Da versteht man warum dies so ist, da die Programmiersprache nichts im Hintergrund versteckt. In C ist es sogar essentiell gescheite return Werte zu liefern, um außerhalb prüfen zu können ob eine Funktion erfolgreich war oder nicht. Üblich werden Werte wie 0,1, -1 genommen. In Java fällt dies weg, wenn dann benutzt man booleans dafür.
Hallo,
das jede Javaklasse einen Defaultkonstruktor besitzt ist einfach nur falsch. Der Compiler baut diesen nur automatisch ein, falls der Entwickler selbst keinen Konstruktor einbaut. Java ist eine zum lernen sehr gute geeignete Sprache, die auf viele fehlerträchtige Konstrukte aus C/C++ verzichtet (gerade deshalb!). Und...ob eine Funktion erfolgreich ist oder nicht wird in Java in der Regel NICHT mit einem returncode sonder mittels Exceptions gehandelt, die im Fehler- bzw. Ausnahmefall geworfen wird und vom Aufrufer gefangen und behandelt werden kann/muss.

Verbreitet doch bitte nicht solche Halbwahrheiten.

greetz
hroessler
 
Zuletzt bearbeitet von einem Moderator:
  • Gefällt mir
Reaktionen: p4cx
Zurück
Oben