Methoden Einlesen mehrerer Variablen beim Erstellen eines Objektes

alxndr

Mitglied
Servus Leute!

Könnt ihr mir bitte bei der folgenden Aufgabe helfen? Sitze nun schon stunden dran und komme absolut nicht weiter...

Ich muss eine Klasse "Rechteck" mit dazugehörigen Attributen und Methoden erstellen. Zu den methoden sollen unter anderem getter/setter sowie(!) eine Methode zum einlesen der Werte für die Instanzvariablen, die mir schwierigkeiten bereitet. Meine Überlegung war es, da man ja nicht mehrere Werte returnen kann, das ganze in ein Array zu packen, nur komme ich da irgendwie nicht voran. Wie erstelle ich in der main methode ein neues Rechteck-Objekt und lese die dazugehörigen daten per Scanner ein ?


Java:
/**
* Created by alexander on 01.12.2015.
*/
import java.util.Scanner;

public class Rechteck {

    int [] maße = new int[2];

    private int breite=maße[0];
    private int hoehe=maße[1];

    private int flaeche=flaecheBerechnen();
    Scanner input =new Scanner(System.in);

    public static void main(String[] args) {

        Rechteck neu = new Rechteck();


    }
    Rechteck(int dieBreite, int dieHoehe){
        breite=getFromKeyboard();
        hoehe=getFromKeyboard();
    }
    public int flaecheBerechnen(){
        flaeche=breite*hoehe;
        return flaeche;
    }
    public void print_flaeche(){
        System.out.println("Die Fläche beträgt: " + flaeche +"m²");
    }
    public int getFromKeyboard(){
        System.out.println("Geben Sie die Breite des Rechtecks ein >");
        breite =input.nextInt();
        return breite;
       // System.out.println("Geben Sie die Höhe des Rechtecks ein >");
       // hoehe =input.nextInt();
       
    }

}
 

Joose

Top Contributor
Zu den methoden sollen unter anderem getter/setter sowie(!) eine Methode zum einlesen der Werte für die Instanzvariablen, die mir schwierigkeiten bereitet.
Meine Überlegung war es, da man ja nicht mehrere Werte returnen kann, das ganze in ein Array zu packen, nur komme ich da irgendwie nicht voran.
Wie erstelle ich in der main methode ein neues Rechteck-Objekt und lese die dazugehörigen daten per Scanner ein ?

Mir ist nicht ganz klar was für eine Methode die Aufgabenstellung verlangt? Eine Methode in der Klasse Reckteck welche Daten von der Konsole einliest?
Warum willst du dabei ein Array zurückgeben? Wenn es um die "breite", "höhe" geht kannst das doch getrennt abfragen wie es bei deinem geposteten Code ist.

Aber trotzdem ist dein Code sehr komisch
Java:
int [] maße = new int[2];
   private int breite=maße[0];
   private int hoehe=maße[1];

Die Zuweisung von breite und hoehe sind sinnlos. Da dein Array nirgends initialisiert wird, daher wird der Defaultwert 0 genommen (da es sich um den primitiven Datentyp int handelt)
Außerdem solltest du "ß" vermeiden ;)

Java:
private int flaeche=flaecheBerechnen();

Ergibt ebenfalls wenig Sinn. Die Attribute einer Klasse werden initialisiert bevor der Konstruktor abgearbeitet wird.
Da breite und hoehe mit 0 initialisiert werden beträgt die Fläche ebenfalls 0.
Außerdem ist es nicht praktisch die Fläche als Attribut zu speichern.
Laut Aufgabenstellung sollst du auch getter/setter schreiben. Wenn du nun den Wert deiner Fläche änderst, dann müsstest du theoretisch auch deine Länge/Breite ändern aber du kannst nicht sicher sein in welche Werte.
Beispiel: Du willst Fläche (alter Wert 4) auf 12 setzen. Welchen Wert nehmen Breite und Höhe an? 2 und 6 oder 3 und 4 oder 1 und 12?

Speichere lieber nur Breite und Hoehe und anstatt die Fläche als Attribut zu speichern lasse "getFlaeche" immer die Fläche aus den Werten berechnen (setFleache wird nicht gebraucht).

Java:
public static void main(String[] args) {
   Rechteck neu = new Rechteck();
}

Dieser Code kann nicht kompilieren, da die Klasse Reckteck keinen parameterlosen Konstruktor (DefaultKonstruktor) hat.

Ich nehme an du sollst in der main Methode die beiden Werte für breite und hoehe einlesen und an den Konstruktor von Reckteck übergeben.
 

alxndr

Mitglied
Danke für deine Antwort :) Bin gerade dabei Java im 1. Semester zu lernen, habe also noch sogut wie keine Erfahrung mit programmieren. In der Aufgabe wird verlangt
1.Klasse Rechteck mit Höhe und Breite erstellen., und entsprechende getter/setter
2. getFromKeyboard methode um die Werte für Höhe und breite einzulesen
3. methode fläche berechnen und methode fläche ausgeben erstellen
4. Klasse rechteck soll eine main Methode besitzen
5. in der main methode der klasse ein neues Objekt erstellen.

Punkt 2. macht mir echt probleme weil ich es nicht hinbekomme in einer Methode die 2 Werte einzulesen und sie zu returnen... außerdem ist mir nicht ganz klar wie ich ein neues Objekt mit dem Konstruktor erstellen soll und in die Klammern die Parameter einlesen soll mit der getfrom_keyboard methode.
 

Joose

Top Contributor
1.Klasse Rechteck mit Höhe und Breite erstellen., und entsprechende getter/setter

Gut die getter/setter fehlen schon mal aber die sollten keine große Schwierigkeit sein

2. getFromKeyboard methode um die Werte für Höhe und breite einzulesen
....
Punkt 2. macht mir echt probleme weil ich es nicht hinbekomme in einer Methode die 2 Werte einzulesen und sie zu returnen

Meiner Meinung nach steht hier nur das du eine Methode schreiben sollst welche Werte einlesen können soll.
Nicht aber das du beide Werte gleichzeitig einlesen musst ;)
Sprich die Methode 2x aufrufen ... 1x für die Höhe, 1x für die Breite

3. methode fläche berechnen und methode fläche ausgeben erstellen

Wie schon gesagt, ich finde es unsinnig die Fläche als Attribut zu speichern (davon würde hier nichts stehen)
aber anders wäre es nicht möglich 2 Methoden zu schreiben (eine zum Berechnen und die andere für die Ausgabe).

5. in der main methode der klasse ein neues Objekt erstellen.
....
... außerdem ist mir nicht ganz klar wie ich ein neues Objekt mit dem Konstruktor erstellen soll und in die Klammern die Parameter einlesen soll mit der getfrom_keyboard methode.

Da die Methode "getFromKeyboard" wahrscheinlich statisch sein soll.
Also zuerst 2x getFromKeyboard aufrufen ... die Rückgabewerte in lokale Variablen speichern und diese dann an den Konstruktor von Reckteck übergeben.

Hier mal eine mögliche Lösung:
Java:
import java.util.Scanner;

public class MyRectangle {

   static Scanner input = new Scanner(System.in);

   public static int getFromKeyboard(String text) {
     System.out.println(text);
     return input.nextInt();    
   }

   public static int[] getFromKeyboard() {
     int[] dimensions = new int[2];
     System.out.println("Geben Sie die Breite des Rechtecks ein >");
     dimensions[0] =input.nextInt();

     System.out.println("Geben Sie die Höhe des Rechtecks ein >");
     dimensions[1] = input.nextInt();
     return dimensions;
   }

   public static void main(String[] args) {
     // Variante 1 - breite und hoeh getrennt einlesen
     int height = getFromKeyboard("Geben Sie die Höhe des Rechtecks ein >");
     int width = getFromKeyboard("Geben Sie die Breite des Rechtecks ein >");
     Rechteck neu1 = new Rechteck(width, height);
     
     // Variante 2 - beides mit einem Methodenaufruf einlesen und als array zurückliefern
     int[] dimensions = getFromKeyboard();
     Reckteck neu2 = new Reckteck(dimensions[0], dimensions[1]);
   }

   private int width;
   private int height;

   public MyRectangle(int width, int height) {
     this.width = width;
     this.height = height;
   }

   public int getArea(){
     return width * height;
   }

   public void printArea() {
     System.out.println("Die Fläche beträgt: " + getArea() +"m²");
   }
}
 

JStein52

Top Contributor
Zu 2.) warum willst du die zwei Werte denn returnen ? Du kannst doch in der Methode selber die zwei Instanzvariablen setzen.
 

alxndr

Mitglied
Gut die getter/setter fehlen schon mal aber die sollten keine große Schwierigkeit sein



Meiner Meinung nach steht hier nur das du eine Methode schreiben sollst welche Werte einlesen können soll.
Nicht aber das du beide Werte gleichzeitig einlesen musst ;)
Sprich die Methode 2x aufrufen ... 1x für die Höhe, 1x für die Breite



Wie schon gesagt, ich finde es unsinnig die Fläche als Attribut zu speichern (davon würde hier nichts stehen)
aber anders wäre es nicht möglich 2 Methoden zu schreiben (eine zum Berechnen und die andere für die Ausgabe).



Da die Methode "getFromKeyboard" wahrscheinlich statisch sein soll.
Also zuerst 2x getFromKeyboard aufrufen ... die Rückgabewerte in lokale Variablen speichern und diese dann an den Konstruktor von Reckteck übergeben.

Hier mal eine mögliche Lösung:
Java:
import java.util.Scanner;

public class MyRectangle {

   static Scanner input = new Scanner(System.in);

   public static int getFromKeyboard(String text) {
     System.out.println(text);
     return input.nextInt();   
   }

   public static int[] getFromKeyboard() {
     int[] dimensions = new int[2];
     System.out.println("Geben Sie die Breite des Rechtecks ein >");
     dimensions[0] =input.nextInt();

     System.out.println("Geben Sie die Höhe des Rechtecks ein >");
     dimensions[1] = input.nextInt();
     return dimensions;
   }

   public static void main(String[] args) {
     // Variante 1 - breite und hoeh getrennt einlesen
     int height = getFromKeyboard("Geben Sie die Höhe des Rechtecks ein >");
     int width = getFromKeyboard("Geben Sie die Breite des Rechtecks ein >");
     Rechteck neu1 = new Rechteck(width, height);
    
     // Variante 2 - beides mit einem Methodenaufruf einlesen und als array zurückliefern
     int[] dimensions = getFromKeyboard();
     Reckteck neu2 = new Reckteck(dimensions[0], dimensions[1]);
   }

   private int width;
   private int height;

   public MyRectangle(int width, int height) {
     this.width = width;
     this.height = height;
   }

   public int getArea(){
     return width * height;
   }

   public void printArea() {
     System.out.println("Die Fläche beträgt: " + getArea() +"m²");
   }
}

Danke dir, habe es nun mit den Arrays gelöst!

Zu 2.) warum willst du die zwei Werte denn returnen ? Du kannst doch in der Methode selber die zwei Instanzvariablen setzen.
Meinst du mit einer Void-Methode? Habe daran irgendwie nicht gedacht!
 

JStein52

Top Contributor
Ja, klar. Du fragst in deiner Methode nacheinander beide Werte vom Benutzer ab und schreibst dann:

Java:
this.breite = <eingelesener Weet für Breite>;
this.hoehe = <eingelesener Wert für Höhe>;

Und aufrufen kannst du das entweder im Default-Konstruktor bzw. wenn es keinen geben soll bei jeder Rechteck-Instanz. @Joose war ja oben davon ausgegangen dass die Methode static sein soll. Aber soll sie das denn ?
 

Joose

Top Contributor
Naja in der Aufgabenstellung stand nichts von static. Daher war ich mir nicht sicher ob sie nun statisch sein sollte/kann oder nicht.
Aber da ich es sehr unschön finden würde in der Klasse Rectangle diese Methode als non-static zu haben, habe ich sie in meinem Beispiel eben statisch gemacht.
 

Oben