Gleichzeitiges Verarbeiten von Variablen 2er Obj. selber Kl.

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Folgendes Problem:
Anwender gibt Maße für 2 Boxen oder Quader ein, also Breite, Hoehe, Laenge.
Programm errechnet Mantelfläche und Volumen
und gibt darüber hinaus an, ob die 1. Box in die 2. Box passt und umgekehrt (jedoch werden nur die Hoehen, Breiten und Laengen miteinander verglichen, also keine Drehung der Box).

Dazu mein Code:


Code:
import java.io.*;

class Box5
{
  BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
  private String inData;
  private double breite, hoehe, laenge;

  Box5()
  {

  }

  public void breite() throws IOException
  {
    System.out.println("Breite:");
    inData=stdin.readLine();
    breite=Double.parseDouble(inData);
  }

  public void hoehe() throws IOException
  {
    System.out.println("Hoehe:");
    inData=stdin.readLine();
    hoehe=Double.parseDouble(inData);
  }

  public void laenge() throws IOException
  {
    System.out.println("Laenge:");
    inData=stdin.readLine();
    laenge=Double.parseDouble(inData); 
  }

  public double flaeche()
  {
    return 2*(breite*hoehe+breite*laenge+hoehe*laenge);
  }

  public double volumen()
  {
    return breite*hoehe*laenge;
  }

  public double getBreite()
  {
    return breite;
  }

  public double getHoehe()
  {
    return hoehe;
  }

  public double getLaenge()
  {
    return laenge;
  }


  public boolean apasstIn(Box5 boxb)
  {
    return ( boxa.getBreite() > boxb.getBreite()  &&  boxa.getHoehe() > boxb.getHoehe()  &&  boxa.getLaenge() > boxb.getLaenge() );
  }

  public boolean bpasstIn(Box5 boxa)
  {
    return ( boxa.getBreite() < boxb.getBreite()  &&  boxa.getHoehe() < boxb.getHoehe()  &&  boxa.getLaenge() < boxb.getLaenge() );
  }

}


class Kapitel335
{
  public static void main (String [] args) throws IOException
  {
    Box5 boxa = new Box5();

    System.out.println("Masse 1. Box");

    boxa.breite();
    boxa.hoehe();
    boxa.laenge();

    Box5 boxb = new Box5();

    System.out.println("Masse 2. Box");

    boxb.breite();
    boxb.hoehe();
    boxb.laenge();

    System.out.println("1. Box:\t\tFlaeche: "+ boxa.flaeche() + "\tVolumen: "+ boxa.volumen() );
    System.out.println("Breite: "+boxa.getBreite()+"\tHoehe: "+boxa.getHoehe()+"\tLaenge: "+boxa.getLaenge());

    System.out.println("\n2. Box:\tFlaeche: "+ boxb.flaeche() + "\tVolumen: "+ boxb.volumen() );
    System.out.println("Breite: "+boxb.getBreite()+"\tHoehe: "+boxb.getHoehe()+"\tLaenge: "+boxb.getLaenge());

    if( boxa.apasstIn(boxb) )
      System.out.println("Die 1. Box passt in die 2. Box hinein.");
    if( boxb.bpasstIn(boxa) )
      System.out.println("Die 2. Box passt in die 1. Box hinein.");
    if( !( boxa.apasstIn(boxb) || boxb.bpasstIn(boxa) ) )
      System.out.println("Keine Box passt in die andere.");

  }
}
[/code]


Ich habe es sicherlich äußerst verkompliziert, in dem ich den Input des Anwenders in Methoden gesteckt habe, aber gerade so wollte ich das mal testen.

Mein Problem ist jetzt das folgende:

Wie kann ich auf die einzelnen Instanzvariablen der beiden beiden ersten Objekte der Klasse Box5 zugreifen, um in einer Methode gleichzeitig mit ihnen zu arbeiten?


Damit ist folgender Versuchsabschnitt von mir gemeint:

Code:
  public boolean apasstIn(Box5 boxb)
  {
    return ( boxa.getBreite() > boxb.getBreite()  &&  boxa.getHoehe() > boxb.getHoehe()  &&  boxa.getLaenge() > boxb.getLaenge() );
  }

  public boolean bpasstIn(Box5 boxa)
  {
    return ( boxa.getBreite() < boxb.getBreite()  &&  boxa.getHoehe() < boxb.getHoehe()  &&  boxa.getLaenge() < boxb.getLaenge() );
  }


Über jegliche Hilfen und Hinweise würde ich mich sehr freuen. Danke im Voraus.
 
S

shad0w

Gast
Du brauchst statt der beiden angegebenen Methoden nur eine Methode:

Code:
public boolean passtIn(Box5 box2) {
   return (this.breite < box2.breite && this.hoehe < box2.hoehe && this.laenge < box2.laenge);
}

Um festzustellen, ob box a in box b passt:

if (boxa.passtIn(boxb)) etc...

Um festzustellen, ob box b in box a passt:

if (boxb.passtIn(boxa)) etc...
 
G

Guest

Gast
danke shad0w für deine Antwort.

Dank dir ist mir die Geschichte mit dem this jetzt verständlicher. Wenn ich schreibe boxa.passtIn(boxb) dann habe ich automatisch die Instanzvariablen von boxa zur hand und kann diese direkt ansprechen. Will ich welche von boxb bekommen, muss ich sie speziell mit boxb.xxx aufrufen.


Allerdings bin ich mir nicht sicher, ob ich wirklich nur mit einer Methode auskomme, denn in dieser Methode kann ich einmal die Instanzvariablen des angesprochenen Objekts direkt ansprechen und einmal muss ich in der Methode diese speziell mit deren Objektnamen ansprechen, also z. B. boxb.laenge. Wenn ich dann aber im nächsten Schritt boxb als angesprochenes Objekt mir hole, muss ich in der Methode die Instanzvariablen von Objekt boxa separat mit boxa.laenge ansprechen.
Also, brauch ich doch wieder zwei Methoden hierfür, oder?


Mit meinen zwei Methoden klappt es jetzt dank dir, die jetzt wie folgt aussehen:

Code:
  public boolean apasstIn(Box5 boxb)
  {
    return (this.breite < boxb.breite && this.hoehe < boxb.hoehe && this.laenge < boxb.laenge);
  }

  public boolean bpasstIn(Box5 boxa)
  {
    return (this.breite < boxa.breite && this.hoehe < boxa.hoehe && this.laenge < boxa.laenge);
  }

und
Code:
    if( boxa.apasstIn(boxb) )
      System.out.println("Die 1. Box passt in die 2. Box hinein.");
    if( boxb.bpasstIn(boxa) )
      System.out.println("Die 2. Box passt in die 1. Box hinein.");
    if( !( boxa.apasstIn(boxb) || boxb.bpasstIn(boxa) ) )
      System.out.println("Keine Box passt in die andere.");


Jedoch wär ich auch daran interessiert zu sehen, wie das mit einer Methode funktionieren soll.

Müsste es nicht außerdem Probleme mit der Parameterliste geben, da man doch den Variablentyp und den Varibalennamen angeben muss, also

apasstIn(Box5 boxb)


Danke für deine Hilfe.
 
S

shad0w

Gast
Nein, du brauchst definitiv nur eine Methode. Deine beiden Methoden...

Code:
public boolean apasstIn(Box5 boxb)
{
    return (this.breite < boxb.breite && this.hoehe < boxb.hoehe && this.laenge < boxb.laenge);
}

public boolean bpasstIn(Box5 boxa)
{
    return (this.breite < boxa.breite && this.hoehe < boxa.hoehe && this.laenge < boxa.laenge);
}

... sind völlig identisch, bis auf die Namen, aber die Namen spielen hier überhaupt keine Rolle. Sie tun exakt dasselbe, deswegen kannst du eine weglassen.

Sonst müsstest du ja für jedes Objekt wieder eine neue Methode schreiben, nur weil die Variable anders heißt.

Also machen wir mal ein bisschen was Verrücktes, um das mit den Namen zu klären:

Code:
public boolean passtIn(Box5 ANGELAMERKEL) {
   return (this.breite < ANGELAMERKEL.breite && this.hoehe < ANGELAMERKEL.hoehe && this.laenge < ANGELAMERKEL.laenge);
}

Nun kannst du diese Methode aufrufen mit:

Code:
    if( boxa.passtIn(boxb) )
      System.out.println("Die 1. Box passt in die 2. Box hinein.");
    if( boxb.passtIn(boxa) )
      System.out.println("Die 2. Box passt in die 1. Box hinein.");
    if( !( boxa.passtIn(boxb) || boxb.passtIn(boxa) ) )
      System.out.println("Keine Box passt in die andere.");

Der Name ANGELAMERKEL, den wir jetzt in der Methode verwendet haben, spielt nach außen hin überhaupt keine Rolle. Er ist einfach nur ein Bezeichner, für die lokale Variable, die innerhalb der Methode passtIn existiert.

Klären wir nochmal den genauen Ablauf des Programms:

Wir befinden uns in der Methode main.
boxa ist eine Referenz (ein "Zeiger") auf ein Objekt der Klasse Box5.
boxb ist eine Referenz (ein "Zeiger") auf ein Objekt der Klasse Box5.
Diese Variablen enthalten also nicht das Objekt selbst, sondern enthalten eine Information, WO im Speicher das Objekt sich tatsächlich befindet. Das musst Du unbedingt verstehen. Solche Referenzen sind von der Größe her ungefähr so klein wie ein int oder ein long, also 32 oder 64 bit. Das nur so als grobes Wissen.

Nun haben wir den Aufruf boxa.passtIn(boxb). Was genau passiert hier? Die Methode bekommt die Information in boxb übergeben, nämlich WO im Speicher das Objekt liegt, auf das boxb zeigt. Diese Information wird in die lokale Variable ANGELAMERKEL geschrieben. ANGELAMERKEL und boxb zeigen nun auf ein und dasselbe Objekt.

Daneben hat die Methode implizit ("heimlich") die Information, die in boxa steht, übergeben bekommen. Diese Information wird in den this-Zeiger geschrieben. this und boxa zeigen nun auf ein und dasselbe Objekt.

Die Methode passtIn gibt nun bei diesem Aufruf genau dann true zurück, wenn die Box, auf die this zeigt, in die Box passt, auf die ANGELAMERKEL zeigt. Für main ist es somit so: DIESER AUFRUF von passtIn gibt genau dann true zurück, wenn die Box, auf die boxa zeigt, in die Box passt, auf die boxb zeigt.

Beim nächsten Aufruf ist es umgekehrt: boxb.passtIn(boxa). Was passiert? Die Information in boxb wird in this kopiert. Die Information in boxa wird in ANGELAMERKEL kopiert. Und wie gesagt: Wir erhalten genau dann true, wenn die Box, auf die this zeigt, in die Box passt, auf die ANGELAMERKEL zeigt. Für main ist es somit so: DIESER AUFRUF von passtIn gibt genau dann true zurück, wenn die Box, auf die boxb zeigt, in die Box passt, auf die boxa zeigt.

Also passiert genau das, was du willst.

Übrigens nochwas: Solche Methoden designt man immer so, dass man den Code lesen kann wie einen (englischen) Satz:

if (boxa.passtIn(boxb)) übersetzt sich wortwörtlich mit: Wenn boxa passt in boxb
if (boxb.passtIn(boxa)) übersetzt sich wortwörtlich mit: Wenn boxb passt in boxa

Somit stimmt das Verhalten der Methode mit dem sprachlich erwarteten überein.

Hoffe, dir ist jetzt evtl einiges klar geworden.

byebye
shad0w
 
G

Gast

Gast
Wollen wir hier wirklich auf Angela Merkel rumreiten? ... Gut, wer will das schon. ... sorry das musste sein. Mittermeier wars.
 
G

Gast

Gast
Vielen Dank shad0w, das war eine super Erklärung. Jetzt habe ich es auch eindeutig verstanden. Der Punkt war, wie du gut erkannt hast, das ich mir bei der Referenzzuordnung nicht sicher war, also, dass in der parameterliste bei der Definition der Methode ein allgemeiner Typ steht, der dann die Referenz von dem Klassen-Objekt bekommt, den ich später in die Parameterliste eintrage, also z. B. boxb bei boxa.passtIn(boxb).
Referenzen sind mir im allgemeinen schon bekannt, nur hatte ich hier Schwierigkeiten mir das so zu denken. Aber mit deiner super Erklärung ist das jetzt kein Problem mehr.
Du hast außerdem recht, da sonst unmengen an ähnlichen Methoden geschrieben werden müssten, für ein und die selbe Aufgabe.

Also, vielen Dank noch mal für deine Hilfe.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Gleichzeitiges ersetzen mehrerer Strings Java Basics - Anfänger-Themen 7
S gleichzeitiges Ansprechen vieler Textfelder Java Basics - Anfänger-Themen 2
C Ist gleichzeitiges Lesen und Schreiben einer ArrayList möglich Java Basics - Anfänger-Themen 2
T 3D Objekte verarbeiten Java Basics - Anfänger-Themen 2
A CSV-Datei Verarbeiten Java Basics - Anfänger-Themen 8
D Events verarbeiten Java Basics - Anfänger-Themen 1
J CSV-Datei verarbeiten Java Basics - Anfänger-Themen 27
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S Datein auslesen und verarbeiten Java Basics - Anfänger-Themen 1
R txt Einlesen und Verarbeiten Java Basics - Anfänger-Themen 15
M Erste Schritte CSV-File einlesen und Daten verarbeiten Java Basics - Anfänger-Themen 5
G csv datei verarbeiten Java Basics - Anfänger-Themen 18
Z Textdateien einlesen und verarbeiten Java Basics - Anfänger-Themen 3
V Excel Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 4
J CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 10
A Auslesen, verarbeiten und ausgeben Java Basics - Anfänger-Themen 22
B große jpeg verarbeiten Java Basics - Anfänger-Themen 8
H Daten einlesen und verarbeiten Java Basics - Anfänger-Themen 4
M Datentypen Strings nach Muster auslesen und verarbeiten Java Basics - Anfänger-Themen 5
D CSV Datei einlesen und verarbeiten Java Basics - Anfänger-Themen 23
N Fragen zu String durchsuchen und verarbeiten Java Basics - Anfänger-Themen 23
D Eingelesene Datei verarbeiten Java Basics - Anfänger-Themen 11
R Daten aus Datenbank lesen, verarbeiten und schreiben. Java Basics - Anfänger-Themen 1
C Problem mit Lesen und Speichern und Verarbeiten von großen Text Dateien Java Basics - Anfänger-Themen 5
S utf-8 codierte Strings verarbeiten Java Basics - Anfänger-Themen 2
X mehrere Dateien lesen/verarbeiten Java Basics - Anfänger-Themen 3
A Textfile verarbeiten. Java Basics - Anfänger-Themen 15
G setValueAt Rückgabewert verarbeiten? Java Basics - Anfänger-Themen 12
M Letzte Zeille einer Datei verarbeiten Java Basics - Anfänger-Themen 3
T longs binär verarbeiten Java Basics - Anfänger-Themen 4
G dateien verarbeiten Java Basics - Anfänger-Themen 7
zilti String verarbeiten Java Basics - Anfänger-Themen 4
M HTML Seite die Daten in JavaApplet dynamisch verarbeiten Java Basics - Anfänger-Themen 2
G Gleiche Aktionen verarbeiten (aber nur einmal Code)? Java Basics - Anfänger-Themen 2
T Bei Struts Beans updaten ohne ein Request zu verarbeiten Java Basics - Anfänger-Themen 4
M Daten eingeben und verarbeiten Java Basics - Anfänger-Themen 8
C Html-Seite aus dem Internet verarbeiten Java Basics - Anfänger-Themen 10
G Dateiliste verarbeiten Java Basics - Anfänger-Themen 13
O Welcher Object-Lock-Pool bei static Variablen? Java Basics - Anfänger-Themen 3
T variablen klassen übergreifend Java Basics - Anfänger-Themen 12
T Variablen Java Basics - Anfänger-Themen 1
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
M Aufsummieren von variablen Wertegrößen Java Basics - Anfänger-Themen 17
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
J Speichern von zwei Variablen durch Auslesen aus einem Numberfield Java Basics - Anfänger-Themen 2
ashi Variablen aufrufen Java Basics - Anfänger-Themen 17
U Warum kann ich, auf private Variablen zugreifen, wenn ich ein Objekt in der Klasse, die private Variablen hat erstelle und dort drauf zugreifen will? Java Basics - Anfänger-Themen 7
B Konkatenieren eines Strings und inkremtierenden Zahl zu einer INT Variablen Java Basics - Anfänger-Themen 7
A 2 Strings vergleichen in einer methode wenn man mit Globalen variablen arbeitet Java Basics - Anfänger-Themen 12
C Konstruktoren und Variablen Java Basics - Anfänger-Themen 42
F Auf Variablen eines Konstruktors zugreifen Java Basics - Anfänger-Themen 4
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Wie kann ich bei int-Variablen im exception handler auf bestimmte Strings reagieren? Java Basics - Anfänger-Themen 5
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
B Variablen Variablen übertragen ohne Klassen Java Basics - Anfänger-Themen 5
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
T Java Swing - Dreieck zeichnen mit verschiedenen Variablen Java Basics - Anfänger-Themen 8
Arif Vererbung Methodenvererbung mit finalen Variablen Java Basics - Anfänger-Themen 1
M Wie kann ich ein Objekt erstellen, wenn sich der Klassenname in einer Variablen befindet? Java Basics - Anfänger-Themen 10
S Variablen Variablen in einer Schleife erstellen lassen Java Basics - Anfänger-Themen 11
J Ich brauche Hilfe bei einem Code (Variablen speichern) Java Basics - Anfänger-Themen 29
F Variablen Werte einer Klasse überschreiben Java Basics - Anfänger-Themen 4
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
M Java Instanz-Variablen ? Java Basics - Anfänger-Themen 3
B Variablen von Methoden übertragen Java Basics - Anfänger-Themen 2
M Variablen umbenennen Java Basics - Anfänger-Themen 1
T Körper Brechnung - Lokale Variablen in Methoden übergeben Java Basics - Anfänger-Themen 10
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
mars90 Fehler in der Variablen Deklaration Java Basics - Anfänger-Themen 8
E Variablen in formatierter Ausgabe Java Basics - Anfänger-Themen 15
V Schleife für das Einlesen von Werten für int Variablen, die Bestandteil von Arrays sein sollen Java Basics - Anfänger-Themen 16
M Komisches Verhalten der Variablen Java Basics - Anfänger-Themen 6
H Variablen Multiplikation einer inkrementierten Variablen Java Basics - Anfänger-Themen 5
scratchy1 Variablen vertauschen wenn Bedingung "umgedreht" wird Java Basics - Anfänger-Themen 40
J Variablen mit einer anderen Klasse bekannt machen Java Basics - Anfänger-Themen 7
C Methoden Problem beim Speichern von Variablen Java Basics - Anfänger-Themen 1
A Übergreifende Variablen Java Basics - Anfänger-Themen 17
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
H Variablen Methode zum Abfragen von Variablen aus Subklassen Java Basics - Anfänger-Themen 9
P Variablen Variablen voneinander abhängig Java Basics - Anfänger-Themen 54
F Liste nach einer Variablen sortieren Java Basics - Anfänger-Themen 6
L Variablen in anderen Klassen nutzen Java Basics - Anfänger-Themen 6
M For-Schleife durch zwei versch. Variablen begrenzen Java Basics - Anfänger-Themen 27
J Klassen Variablen in andere Klassen oder Methoden übernehmen Java Basics - Anfänger-Themen 1
P Liste auslesen und in Variablen speichern Java Basics - Anfänger-Themen 7
temi Redundante Variablen Java Basics - Anfänger-Themen 29
Aprendiendo Zweifel mit versteckter Variablen Java Basics - Anfänger-Themen 16
L Variablen einmal nur zu weisen Java Basics - Anfänger-Themen 62
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
R Abfrage von Variablen in Unterklassen einer ArrayList Java Basics - Anfänger-Themen 9
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
S Vererbung Variablen klassenübergreifend nutzen Java Basics - Anfänger-Themen 42
R Auf Variablen einer anderen Klasse zugreifen? Java Basics - Anfänger-Themen 1
D Fehlermeldung obwohl Variablen bereits deklariert sind? Java Basics - Anfänger-Themen 14
E 2 Probleme - Datum & private finale Variablen Java Basics - Anfänger-Themen 5
Aruetiise Variablen JFrame und Variablen Java Basics - Anfänger-Themen 3
L Variablen dekleration + reset Java Basics - Anfänger-Themen 16
T Übernahme einer Variablen im ActionListener/ActionEvent Java Basics - Anfänger-Themen 2
D Kapselung final Variablen mit Getter? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben