Boolean in einer erstellten Klasse verwenden

Hallo,

bin bin absoluter Neuling im Bereich Java und arbeite mich gerade durch ein Tutorial. Aktuell bin ich beim Kapitel "Eigene Klassen definieren".
In einer Übungsaufgabe komme ich aber einfach nicht weiter.
Hier das Programm:

Code:
import java.util.Scanner;
class Objekt // Klasse erstellt

{
      // Instanzvariablen
      double startMeilen;   // Anfangsstand Tachometer
      double endMeilen;     // Endstand Tachometer
      double gallonen;      // verbrauchte Gallonen Benzin
    
      // Konstruktor
      Objekt(  double startTacho, double endTacho, double galls  )
      {
        startMeilen = startTacho;
        endMeilen   = endTacho;
        gallonen    = galls;
        
      }

      // Methoden
      double berechneMPG()
      {
        return (endMeilen - startMeilen) / gallonen;
      }
    }     
      
    class Ausgabe
    {
      public static void main( String[] args )
      {
        double beginn, ende, sprit;
        
        Scanner scan = new Scanner(System.in);
        
        System.out.println("Geben sie den Startkilometer ein");
        beginn = scan.nextDouble();
        
        System.out.println("Geben sie den letzten Kilometer ein");
        ende = scan.nextDouble();
        
        System.out.println("Geben Sie die Gallonen ein");
        sprit = scan.nextDouble();
        
        
          
        Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG());
      }
    }
Jetzt ist die nächste Aufgabe eine neue Methode boolean spritschwein() (ergibt true wenn zb. berechneMPG() <15.0 ist) hinzuzufügen. Diese soll dann von der main methode verwendet werden um dem Anwender eine Meldung "Spritschwein" auszugeben.
Mein bisheriger Versuch sieht so aus:
Java:
boolean schwein()
      {
          if (berechneMPG() <= 15.0);
          System.out.println("Benzinschwein");
          
          return true;
          }
Das funktioniert aber nicht richtig. Die Meldung "Benzinschwein" wird immer ausgegeben auch wenn die if Abfrage nicht erfüllt ist. Außerdem gibt er auch immer "true" aus, was ich eigentlich nicht will.
Ich gehe davon aus, dass ich hier irgendwas grundlegendes nicht verstehe. Boole´sche Ausdrücke in selbst erstellten Klassen wurde aber bisher auch noch nicht extra behandelt.
 
Du musst die Klammerung beachten.
Dein if-Block wird durch das folgende Semikolon direkt beendet. Die Ausgabe und das return-Statement liegen also außerhalb des if-Blocks und werden deswegen immer ausgeführt.
 
Du hast natürlich Recht. Blöder Fehler der aber leider noch nicht ganz mein Problem löst.
Hier mal das was das Programm tut:

Geben sie den Startkilometer ein
10000 (Benutzer Eingabe)
Geben sie den letzten Kilometer ein
10400 (Benutzer Eingabe)
Geben Sie die Gallonen ein
40 (Benutzer Eingabe)
Benzinschwein
Meilen pro Gallone: 10.0true

Die If Abfrage klappt jetzt aber aus mir unbekannten Gründen wird die Ausgabe "Benzinschwein" vor der Ausgabe
"Meilen pro Gallone: "+ auto.berechneMPG() ausgegeben. Und er gibt auch"true" aus, was ich eigentlich nicht will.
 
Man sieht nicht, wo du die Methode "schwein" aufrufst. Poste doch mal deinen aktuellen Code.

Wenn du einen String konkatenierst und ausgibst, dann wird die Methode innerhalb der Konkatenation zuerst ausgeführt:
Java:
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG());
Bevor das System.out.println ausgeführt wird, wird die Methode "auto.berechneMPG" ausgeführt. Wenn du in der Methode dann wiederum Ausgaben erzeugst, dann werden diese entsprechend zuerst angezeigt. Das wird vermutlich das Problem bei deiner neuen "benzinschwein"-Methode sein, dafür müsste man den aktuellen Code aber mal sehen.
 
wird die Ausgabe "Benzinschwein" vor der Ausgabe
"Meilen pro Gallone: "+ auto.berechneMPG() ausgegeben. Und er gibt auch"true" aus, was ich eigentlich nicht will.
Stimmt das <= bei
"if (berechneMPG() <= 15.0);" von der Logik überhaupt ?

Edit(h): <= passt, es macht immerhin einen Unterschied ob man z.B. für 400 Meilen 2 oder 200 Gallonen braucht
 
Zuletzt bearbeitet:
Hier der aktuelle Code

Java:
import java.util.Scanner;
class Objekt // Klasse erstellt

{
      // Instanzvariablen
      double startMeilen;   // Anfangsstand Tachometer
      double endMeilen;     // Endstand Tachometer
      double gallonen;      // verbrauchte Gallonen Benzin
      
      
      // Konstruktor
      Objekt(  double startTacho, double endTacho, double galls  )
      {
        startMeilen = startTacho;
        endMeilen   = endTacho;
        gallonen    = galls;
        
      }

      // Methoden
      double berechneMPG()
      {
        return (endMeilen - startMeilen) / gallonen;
      }
      
      boolean schwein()
      {
          if (berechneMPG() <= 15.0)
          System.out.println("Benzinschwein");
          
          return true;
          }
     }     
      
    
    class Ausgabe
    {
      public static void main( String[] args )
      {
        double beginn, ende, sprit;
        
        Scanner scan = new Scanner(System.in);
        
        System.out.println("Geben sie den Startkilometer ein");
        beginn = scan.nextDouble();
        
        System.out.println("Geben sie den letzten Kilometer ein");
        ende = scan.nextDouble();
        
        System.out.println("Geben Sie die Gallonen ein");
        sprit = scan.nextDouble();
        
        Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG() + auto.schwein() );
      }
    }
 
Java:
System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG() + auto.schwein() );
Das ist dein Problem. Die Methoden werden halt zuerst aufgerufen bevor die Ausgabe erfolgt. Außerdem gibt deine "schwein"-Methode ein boolean zurück, dass dann immer mit an die Ausgabe konkateniert wird.

Und die nicht-vorhandene Klammerung in der schwein-Methode passt immer noch nicht. Am besten immer Klammern setzen ;)
 
Jetzt bin ich echt verwirrt.
Dieser Teil ist unter anderem aus dem Tutorial und nicht von mir selbst:
Java:
Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG());
Er funktioniert und gibt die Meldung "Meilen pro Gallone" und die richtige Berechnung aus. Auch in der richtigen Reihenfolge. Erst die Ausgabe, dann das Ergebnis.

Warum wird denn dann meine Methode "schwein()" und deren Ausgabe auf einmal vor die Ausgabe "Meilen pro Gallone" gesetzt obwohl im Code die Methode nach der berechneMPG() Methode steht?

Java:
Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG() + auto.schwein() );
Außerdem gibt deine "schwein"-Methode ein boolean zurück, dass dann immer mit an die Ausgabe konkateniert wird.
Die Aufgabe ist es eine boolean Methode zu schreiben. Ich kenne bisher keine andere Möglichkeit in einer neuen Klasse so etwas ohne "return true" zu tun. Alle anderen Versuch enden immer in einer Fehlermeldung bzw. funktionieren nicht.
Ich kann auch gerne mal den Link für die Programmieraufgabe hier reinstellen. Vielleicht überlese ich einfach was bestimmtes.
 
Zuletzt bearbeitet:
Jetzt bin ich echt verwirrt.
Das lässt sich hoffentlich ändern ;)

Warum wird denn dann meine Methode "schwein()" und deren Ausgabe auf einmal vor die Ausgabe "Meilen pro Gallone" gesetzt obwohl im Code die Methode nach der berechneMPG() Methode steht?
System.out.println erwartet in Deinem Fall als Parameter einen String. Diesen baust Du aktuell zwischen den Klammern zusammen. D. h.
Java:
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG() + auto.schwein() );
ist äquivalent zu
Java:
String s = "Meilen pro Gallone: " + auto.berechneMPG() + auto.schwein();
System.out.println(s);
Um den String s zusammenbauen zu können, müssen die Ergebnisse der Methodenaufrufe bekannt sein. Es werden also zuerst die Methoden auto.berechneMPG() und auto.schwein() aufgerufen und dann der String zusammengebaut. Der Code ist also äquivalent zu:
Java:
double mpg = auto.berechneMPG();
boolean schwein = auto.schwein();
String s = "Meilen pro Gallone: " + mpg + schwein;
System.out.println(s);
Da Du in auto.schwein() etwas ausgibst, erfolgt die Ausgabe folglich bevor s ausgegeben wird.
 
Ich könnte dich noch ein wenig mehr verwirren :cool:.

Anhand von:
Jetzt ist die nächste Aufgabe eine neue Methode boolean spritschwein() (ergibt true wenn zb. berechneMPG() <15.0 ist) hinzuzufügen. Diese soll dann von der main methode verwendet werden um dem Anwender eine Meldung "Spritschwein" auszugeben.
und
Die Aufgabe ist es eine boolean Methode zu schreiben.
Denke ich, dass du die Methode "schwein()" falsch verwendest.

Die Ausgabe soll nicht innerhalb der Methode stattfinden, sondern in der main(). In dieser Art:
Java:
if (auto.spritschwein()) {
   System.out.println("Spritschwein");
}
In der Methode sollst du nur herausfinden, ob es so ist und entsprechend true oder false zurückgeben.[/code]
 
Denke ich, dass du die Methode "schwein()" falsch verwendest.

Die Ausgabe soll nicht innerhalb der Methode stattfinden, sondern in der main(). In dieser Art:
In der Methode sollst du nur herausfinden, ob es so ist und entsprechend true oder false zurückgeben.
Ah, ja. Das scheint der Denkfehler zu sein. Das macht dann für mich schon mehr Sinn.
Ich hab jetzt den Code soweit geändert aber bekomme leider nicht das gewünschte Ergebnisse. Obwohl ich in der auto.schwein() Methode die Bedingung stehen habe, bekomme ich trotzdem die Ausgabe "Spritschwein" auch wenn die Bedingung nicht erfüllt ist.

Java:
import java.util.Scanner;
class Objekt // Klasse erstellt

{
      // Instanzvariablen
      double startMeilen;   // Anfangsstand Tachometer
      double endMeilen;     // Endstand Tachometer
      double gallonen;      // verbrauchte Gallonen Benzin
      
      // Konstruktor
      Objekt(  double startTacho, double endTacho, double galls  )
      {
        startMeilen = startTacho;
        endMeilen   = endTacho;
        gallonen    = galls;
        
      }

      // Methoden
      double berechneMPG()
      {
        return (endMeilen - startMeilen) / gallonen;
      }
      
      boolean schwein()
      {
          if (berechneMPG() <= 15.0);
          return true;
     }
    }     
    
    class Ausgabe
    {
      public static void main( String[] args )
      {
        double beginn, ende, sprit;
        
        Scanner scan = new Scanner(System.in);
        
        System.out.println("Geben sie den Startkilometer ein");
        beginn = scan.nextDouble();
        
        System.out.println("Geben sie den letzten Kilometer ein");
        ende = scan.nextDouble();
        
        System.out.println("Geben Sie die Gallonen ein");
        sprit = scan.nextDouble();
        
        Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: "
            + auto.berechneMPG());
        
        if (auto.schwein())
        {
               System.out.println("Spritschwein");
        }
    
      }
    }
 
Tarrew hat gesagt.:


Du musst die Klammerung beachten.
Dein if-Block wird durch das folgende Semikolon direkt beendet.
Du hast wieder das gleiche Problem.
Ah jetzt habe ich es. Das Semikolon war falsch wie du sagst aber außerdem hat noch der "return false;" Zusatz gefehlt, wenn die if Bedingung nicht erfüllt ist. Code sieht jetzt wie folgt aus und funktioniert.
Java:
import java.util.Scanner;
class Objekt // Klasse erstellt

{
      // Instanzvariablen
      double startMeilen;   // Anfangsstand Tachometer
      double endMeilen;     // Endstand Tachometer
      double gallonen;      // verbrauchte Gallonen Benzin
      
      // Konstruktor
      Objekt(  double startTacho, double endTacho, double galls  )
      {
        startMeilen = startTacho;
        endMeilen   = endTacho;
        gallonen    = galls;
        
      }

      // Methoden
      double berechneMPG()
      {
        return (endMeilen - startMeilen) / gallonen;
      }
      
      boolean schwein()
      {
          if (berechneMPG() <= 15.0)
              return true;
          return false;
      }
      
      boolean spar()
      {
          if (berechneMPG() >= 30.0)
              return true;
          return false;
      }
    
    }     
    
    class Ausgabe
    {
      public static void main( String[] args )
      {
        double beginn, ende, sprit;
        
        Scanner scan = new Scanner(System.in);
        
        System.out.println("Geben sie den Startkilometer ein");
        beginn = scan.nextDouble();
        
        System.out.println("Geben sie den letzten Kilometer ein");
        ende = scan.nextDouble();
        
        System.out.println("Geben Sie die Gallonen ein");
        sprit = scan.nextDouble();
        
        Objekt auto = new Objekt(beginn, ende, sprit);
        System.out.println( "Meilen pro Gallone: " + auto.berechneMPG());
        
        if (auto.schwein())
        {
        System.out.println("Spritschwein");
        }
        if (auto.spar())
        {
        System.out.println("Sparauto");   
        }
    
      }
    }
Vielen Dank für eure Hilfe.
 
Ah jetzt habe ich es. Das Semikolon war falsch
Ich empfehle dir generell immer geschweifte Klammern zu setzen, auch, wenn nur eine Anweisung darauf folgt.

Edit:

Außerdem noch ein Tipp. Schau dir mal deine Methode "berechneMPG()" an. Da machst du eine Berechnung, die einen double-Wert ergibt und den verwendest du direkt als return-Wert der Methode:
Java:
double berechneMPG() {
   return (endMeilen - startMeilen) / gallonen;
}
Genau das gleiche kannst du auch bei "schwein()" machen. Der Ausdruck in der if-Bedingung ergibt einen boolean-Wert, den du direkt als return-Wert verwenden kannst:
Java:
boolean schwein() {
   return berechneMPG() <= 15.0;
}
 
Zuletzt bearbeitet:
Ich empfehle dir generell immer geschweifte Klammern zu setzen, auch, wenn nur eine Anweisung darauf folgt.
Werde versuchen dran zu denken.
Außerdem noch ein Tipp. Schau dir mal deine Methode "berechneMPG()" an. Da machst du eine Berechnung, die einen double-Wert ergibt und den verwendest du direkt als return-Wert der Methode:

Java:

double berechneMPG() {
return (endMeilen - startMeilen) / gallonen;
}

Genau das gleiche kannst du auch bei "schwein()" machen. Der Ausdruck in der if-Bedingung ergibt einen boolean-Wert, den du direkt als return-Wert verwenden kannst:
Ah sehr gut. Danke für den Tipp. Habe es angepaßt.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben