Boolean in einer erstellten Klasse verwenden

Diskutiere Boolean in einer erstellten Klasse verwenden im Java Basics - Anfänger-Themen Bereich.
K

Krischan

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

Tarrew

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

Krischan

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

Tarrew

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

M.L.

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:
K

Krischan

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() );
      }
    }
 
Tarrew

Tarrew

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 ;)
 
K

Krischan

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:
mihe7

mihe7

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

temi

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]
 
K

Krischan

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");
        }
    
      }
    }
 
K

Krischan

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

temi

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:
K

Krischan

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.
 
Thema: 

Boolean in einer erstellten Klasse verwenden

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben