Abfrage von Variablen in Unterklassen einer ArrayList

Renato

Mitglied
Hallo zusammen,

ich komme gerade nicht weiter mit einer Kontoverwaltung, die ich erst einmal ohne GUI realisieren möchte. Meine Idee: Ich speichere zwei Arten von Konto (Festgeldkonto und Girokonto) in einer ArrayList einer übergeordneten Klasse Konto (Elternklasse). Soweit klappt auch alles, ich schaffe es nur nicht, auf einzelne Werte der Unterklassen zuzugreifen. Die Objekte der Klasse Konto, die in die Liste kommt, kann ich abfragen.

Java:
Girokonto g = new Girokonto("G", (Konto.zaehler), "Meier, Udo", 200,1,1000,17);

Die Werte werden 2,3,4 werden über den Konstuktor in die Klasse Konto geschrieben.

Java:
super(kontoNummer, name, kontoStand);

mit
Java:
al.add(g);

füge ich dann das Objekt der
Java:
ArrayList<Konto> al
zu.

Ausgeben kann ich dann z. B. die Werte, indem ich iterativ durch die Liste gehe. Ich habe hier drei Werte zusammengefasst, kann sie einzeln ausgeben (z. B. über getKontoNummer()). Dafür nutze ich u. a. diese Methode:

Java:
public static void ausgeben(ArrayList<Konto> al){
        for (Konto n : al) {
            System.out.println(n.getKontoNummer() + "; " + n.getName() + "; " + n.getKontoStand());
        }

Dies funktioniert aber nur für die Klasse Konto. Um überhaupt die Werte der Unterklassen zu bekommen, hab ich dies in die Unterklassen eingefügt:

Java:
public String toString() {
        return "Name: "+ super.getName() + ". Kontotyp: " + kontoTyp + ". Zinssatz: " + zinssatz + ". Dispohöhe: " + dispo + ". Zinssatz des Dispos: " + zinssatzDispo + ".";

Damit bekomme ich dann z. B. eine solche Ausgabe:

Name: Meier, Udo. Kontotyp: G. Zinssatz: 1. Dispohöhe: 1000. Zinssatz des Dispos: 17.

wenn ich den Listeneintrag generell über

Java:
System.out.println(al.get(0));

ausgeben lasse.

Wie aber kann ich auf einzelne Werte der Unterklassen zugreifen? Wie kann ich z. B. nur den Zinssatz des Eintrags 0 der ArrayList ausgeben lassen?

Danke. Ich hoffe, ich habe das verständlich zusammengefasst. Braucht es mehr Code? Beste Grüße!
 

stg

Top Contributor
Deine konkrete Frage
Wie aber kann ich auf einzelne Werte der Unterklassen zugreifen?
zielt in die falsche Richtung hinsichtlich der Lösung deines Problems.

Wenn du eine Variable vom Typ Konto hast, aber auf Werte von Girokonto zugreifen musst, dann ist entweder dieser Wert an der falschen Stelle und sollte stattdessen in der Klasse Konto abgelegt werden, oder aber es ist falsch, dass du nur eine Referenz auf ein Konto hast und stattdessen sollte deine Variable vom Typ Girokonto sein. Du kannst aber unter Verwendung der Polymorphie ausnutzen, dass jedes Konto selbst weiß von welchem Typ es ist und all seine spezifischen Attribute kennt. Um bei deiner Ausgabe der Konto-Daten zu bleiben: Anstatt selbst auf die Daten des jeweiligen Kontos zuzugreifen kannst du das Konto selbst darum bitten die Ausgabe zu tätigen (oder alternativ einen ausgabefähigen String zurückzugeben).

Dein Code würde dann so aussehen, dass du im Client, der die Konto-Liste verwaltet, nur schreibst:
Java:
for (Konto konto : konten) {
    konto.ausgeben();
    // oder : System.out.println(konto.ausgabe());
}

Und in der Klasse Konto hast du eine Methode, die die Konto-Daten in die Konsole schreibt. Diese Methode überschreibst du bei Bedarf in den jeweiligen Unterklassen. Dort kannst du dann natürlich auch auf die spezifischen Unterklassenattribute zugreifen.
 

Renato

Mitglied
Erst einmal danke! Ich habe noch nicht so ganz verstanden, was du meinst, kann mir aber vorstellen, dass meine Herangehensweise nicht optimal ist. Ich möchte daher noch einmal fragen, ob ich generell falsch liege und zwar mit folgendem, einfacheren und codefreien Beispiel:

Ich möchte in einer ArrayList verschiedene Fahrzeuge ablegen. Hierzu erstelle ich eine ArrayList des Typs Fahrzeug. Fahrzeuge können Autos oder Fahrräder sein und untscheiden sich z. B. in der Anzahl der Räder. Diese Variable definiere ich in der Klasse Fahrzeug. Spezifischer werde ich in den Unterklassen. Dort halte ich in der Klasse Auto z. B. die Anzahl der Türen fest. Die Klasse Fahrrad ist logischweise frei von Türen. Ist es nicht möglich, die Anzahl an Türen, die mit Erstellen eines neuen Objekts festgelegt wird, einzeln über die ArrayList des Typs Fahrzeug abzurufen und auszugeben? Vorher müsste natürlich geprüft werden, ob die Stelle in der ArrayList überhaupt ein Auto enthält...
 

stg

Top Contributor
Vorher müsste natürlich geprüft werden, ob die Stelle in der ArrayList überhaupt ein Auto enthält...

Ja, das kannst du auch prüfen, etwa mitels instanceof.
Was ich aber meinte ist, dass es meistens auf ein Problem im Design schließen lässt, wenn du an der Stelle, an der du die Fahrzeuge ablegst, überhaupt an der Anzahl an Türen interessiert bist.
Oft sieht die Lösung so aus, dass du allgemein eine Frage an ein Fahrzeug stellst und das Fahrzeug selbst diese dann beantwortet. Das Auto braucht für die Beantwortung der Frage eventuell die Information über die Türen, aber die steht ihm ja auch zur Verfügung. Das ist also problemlos möglich. Du willst aber das Fahrzeug nach den benötigten Informationen fragen und diese Frage dann selbst beantworten, und das ist meist nicht im Sinne der OOP.
 

fhoffmann

Top Contributor
Du könntest auch in der Klasse Fahrzeug folgende Methode schreiben:
Java:
public int getAnzahlTueren() {
  return 0;
}
Diese Methode überschreibst du dann in der Klasse Auto (in der Klasse Fahrrad musst du nichts tun).
 

Renato

Mitglied
Was ich aber meinte ist, dass es meistens auf ein Problem im Design schließen lässt, wenn du an der Stelle, an der du die Fahrzeuge ablegst, überhaupt an der Anzahl an Türen interessiert bist.

Absolut einverstanden. Das Problem ist, dass ich hier die Vorgabe erfüllen muss, beide Arten Konto in einer Liste abzulegen, die wiederum in einer Datei gespeichert wird. All das läuft bereits, nur der Zugriff macht mir halt die Probleme. Dass ich dann irgendwann mal Kontostände addieren soll etc. kommt erschwerend hinzu, ist aber noch nicht Programm.

Du könntest auch in der Klasse Fahrzeug folgende Methode schreiben:
Java:
public int getAnzahlTueren() {
  return 0;
}
Diese Methode überschreibst du dann in der Klasse Auto (in der Klasse Fahrrad musst du nichts tun).

Ok, verstanden. Das sollte gehen. Muss ich mich mal ans Werk machen morgen. Ist das üblich, es so zu handeln? Ich frage aus reiner Ahnungslosigkeit ;) Leider. Danke euch beiden bis hierhin.
 

stg

Top Contributor
Das Problem ist, dass ich hier die Vorgabe erfüllen muss, beide Arten Konto in einer Liste abzulegen, die wiederum in einer Datei gespeichert wird

Das ist kein Problem und absolut normal, dass man so ein Konstrukt vorfindet. Es ist aber nicht normal und sicherlich auch nicht gefragt, dass du dort, wo diese Liste liegt auf die jeweiligen speziellen Daten des Kontotyps zugreifen musst, sondern du iterierst z.B. einfach über diese Liste und bittest das jeweilige Konto etwas (mit seinen eigenen Daten) zu tun.

Um das nochmal deutlich zu machen: Du musst die Struktur der jeweiligen speziellen Unterklassen nicht kennen, um diese auszugeben. Anlehnend an meine vorherige Antwort schau dir mal folgendes Beispiel an. Vielleicht ist dir dann etwas klarer, wie das gemeint ist:
Java:
public class Foo { 
    private String myFoo = "foo";

    @Override
    public String toString() {
        return "Foo{" + "myFoo=" + myFoo + '}';
    }          
}

public class Bar extends Foo {  
    private String myBar = "bar";

    @Override
    public String toString() {
        return super.toString() + " Bar{" + "myBar=" + myBar + '}';
    }     
}

public class FooClient {  
    public static void main(String [] args) {      
        Collection<Foo> c = new ArrayList<>();
        c.add(new Foo());
        c.add(new Bar());
        for(Foo foo : c) {
            System.out.println(foo);
        }              
    }
}

Ausgabe ist dann:
Code:
Foo{myFoo=foo}
Foo{myFoo=foo} Bar{myBar=bar}
 

lennero

Bekanntes Mitglied
hi. du musst zuerst prüfen ob das element in der liste ein girokonto oder nicht ist zb mit instanceof. dann typecast. anschließend kannst du auf die methoden zugreifen.
zb so

Java:
Student a = new Student("Karl","Heinz","male","12","232424");
        Professor b = new Professor("Hans","Mustermann","male","55","242424");

        LinkedList<Mensch> mrr = new LinkedList<Mensch>();
      
        mrr.add(a);
        mrr.add(b);
      
        for(Mensch elem : mrr){
            if(elem instanceof Student){
                System.out.println(((Student) elem).getMatrikeln()); 
            }
        }
 

Renato

Mitglied
hi. du musst zuerst prüfen ob das element in der liste ein girokonto oder nicht ist zb mit instanceof. dann typecast. anschließend kannst du auf die methoden zugreifen.
zb so

Java:
Student a = new Student("Karl","Heinz","male","12","232424");
        Professor b = new Professor("Hans","Mustermann","male","55","242424");

        LinkedList<Mensch> mrr = new LinkedList<Mensch>();
   
        mrr.add(a);
        mrr.add(b);
   
        for(Mensch elem : mrr){
            if(elem instanceof Student){
                System.out.println(((Student) elem).getMatrikeln());
            }
        }

Ok, ich verstehe den Code, aber nicht, was ich damit anfangen kann. Immerhin bin ich jetzt in der Lage, eine einzelne Variable einer Unterklasse auszulesen. Aber iterativ möchte ich das ja nicht. In diesem Beispiel werden alle Matrikelnummer der Liste ausgespuckt, die Einträge der Klasse Professor links liegen gelassen.

Sagen wir, ich möchte alle Matrikelnummern der Studenten addieren, oder etwas komplizierter, nur die Nummern derjenigen, deren Vorname "Heinz" ist.
 
Zuletzt bearbeitet:

lennero

Bekanntes Mitglied
Ok, ich verstehe den Code, aber nicht, was ich damit anfangen kann. Immerhin bin ich jetzt in der Lage, eine einzelne Variable einer Unterklasse auszulesen. Aber iterativ möchte ich das ja nicht. In diesem Beispiel werden alle Matrikelnummer der Liste ausgespuckt, die Einträge der Klasse Professor links liegen gelassen.

Sagen wir, ich möchte alle Matrikelnummern der Studenten addieren, oder etwas komplizierter, nur die Nummern derjenigen, deren Vorname "Heinz" ist.

auf die schnelle würde mir da sowas einfallen. geht sicher auch eleganter (vor allem wenn die matrikelnummer kein string ist)

matrikelnummern aufsummieren
Java:
Student a = new Student("Karl","Heinz","male","12","232");
        Student c = new Student("Gustaf","Muster","male","12","232");
        Professor b = new Professor("Hans","Mustermann","male","55","242424");

        LinkedList<Mensch> mrr = new LinkedList<Mensch>();
      
        mrr.add(a);
        mrr.add(b);
        mrr.add(c);
      
        int counter = 0;
        for(Mensch elem : mrr){
            if(elem instanceof Student){
                Student help = (Student)elem;
                counter += Integer.valueOf(help.getMatrikeln());
              
            }
        }

        System.out.println(counter);

nummern von bestimmten personen :

Java:
int counter = 0;
        for(Mensch elem : mrr){
            if(elem instanceof Student){
                Student help = (Student)elem;
               
                if(help.getFname().equals("Heinz")){
                counter += Integer.valueOf(help.getMatrikeln());
                }
               
            }
        }

        System.out.println(counter);
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Einlese Abfrage zweier Variablen in einem Fenster Java Basics - Anfänger-Themen 6
Q Variablen bei der If-abfrage Java Basics - Anfänger-Themen 11
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
L If Abfrage Java Basics - Anfänger-Themen 4
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
W if-Abfrage bei ArrayList-Methodenaufrufen - Wie löse ich das? Java Basics - Anfänger-Themen 6
B Automatisierte Ausgabe (Schleife, If-Abfrage?) Java Basics - Anfänger-Themen 24
I ResultSet aus meiner SQL-Abfrage in einem JTextfield ausgeben. Java Basics - Anfänger-Themen 1
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
G Taschenrechner ergibt Fehler in if-Abfrage Java Basics - Anfänger-Themen 6
S Interaktive Abfrage, Hilfe mit Schleifen! Java Basics - Anfänger-Themen 6
P Amazon SQS abfrage Java Basics - Anfänger-Themen 1
Marlena Bauer IBAN generieren (Deutschland) aus Abfrage von BLZ und Kontonummer? Java Basics - Anfänger-Themen 31
M Abfrage j/n und Bildschirm löschen Java Basics - Anfänger-Themen 3
S Und-Abfrage mit mehreren Ungleich-Operatoren Java Basics - Anfänger-Themen 17
O if Abfrage erkennt String nicht Java Basics - Anfänger-Themen 1
NeoLexx Abfrage mit instanceof führt zu unerwarteten Wert Java Basics - Anfänger-Themen 9
N Bedinugng If-Abfrage wird nie erfüllt Java Basics - Anfänger-Themen 4
L boolean-Abfrage enumeration Java Basics - Anfänger-Themen 3
Y Methoden Wie kann ich eine if-Abfrage bei Setters bauen? Java Basics - Anfänger-Themen 6
S Streams - Abfrage absteigend sortieren Java Basics - Anfänger-Themen 11
F If Abfrage gibt falsches Ergebnis.... Java Basics - Anfänger-Themen 6
F POST-Request mit json - Abfrage mit Java Java Basics - Anfänger-Themen 2
C Javafunktion zur Abfrage eines Quellcodes Java Basics - Anfänger-Themen 15
A JOPtionPaneOptionDialog Abfrage welcher Button gedrückt wurde? Java Basics - Anfänger-Themen 8
B Folgende Abfrage dynamisch programmieren? Java Basics - Anfänger-Themen 8
G if Abfrage: Nicht jeder Fall berücksichtigt Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
J Erste Schritte if Abfrage von JButton in 2. Klasse Java Basics - Anfänger-Themen 27
S If Abfrage nur mit bestimmter Initialisierung? Java Basics - Anfänger-Themen 8
Z Boolean Abfrage in einer for each Schleife Java Basics - Anfänger-Themen 2
deatzi Variable aus If Abfrage später nutzen Java Basics - Anfänger-Themen 4
C Instanz einer Klasse während if-Abfrage erzeugen und bei zweiter if-Abfrage wiederverwenden Java Basics - Anfänger-Themen 6
S Backspace Abfrage funktioniert nicht Java Basics - Anfänger-Themen 4
F Interface JFrame mit if-Abfrage automatisch schließen lassen? Java Basics - Anfänger-Themen 3
G Passwort und Passwort wiederholen in if-Abfrage vergleichen Java Basics - Anfänger-Themen 15
P Altklausur: Abfrage der Summe Java Basics - Anfänger-Themen 9
N Methoden Attribut Abfrage eines anderen Objektes Java Basics - Anfänger-Themen 36
D MySQL Abfrage in JTable speichern Java Basics - Anfänger-Themen 43
D SQL Abfrage anpassen Java Basics - Anfänger-Themen 17
H For-Schleife innerhalb If-Abfrage? Java Basics - Anfänger-Themen 3
F Abfrage ob Eingabe eine Zahl ist Java Basics - Anfänger-Themen 3
O Datentypen Volle 16 Bit eines Short für flags Abfrage nutzen Java Basics - Anfänger-Themen 11
S Input/Output Doppelte Input-Abfrage Java Basics - Anfänger-Themen 3
S Input/Output Programm läuft nach input-Abfrage nicht weiter. Java Basics - Anfänger-Themen 2
M Variablen Eine etwas andere if Abfrage ! Java Basics - Anfänger-Themen 10
H if-Abfrage, ungleich und falscher true Wert? Java Basics - Anfänger-Themen 11
F Ja Nein Abfrage und andere Probleme Java Basics - Anfänger-Themen 5
OlafHD Fehler Bei der if Abfrage Java Basics - Anfänger-Themen 5
quecksilver if-Abfrage in main ausführen Java Basics - Anfänger-Themen 4
D if-Abfrage Java Basics - Anfänger-Themen 12
J Abfrage für Programmwiederholung Java Basics - Anfänger-Themen 2
K Alternative zur If-Abfrage Java Basics - Anfänger-Themen 3
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
D Abfrage ob Variableninhalt korrekt Java Basics - Anfänger-Themen 5
W Vergleich mit If-Abfrage nur für Zahlen bis 07 möglich - Warum? Java Basics - Anfänger-Themen 7
D Operatoren IF Abfrage liefert falsches Ergebnis Java Basics - Anfänger-Themen 4
X Ja nein abfrage? Java Basics - Anfänger-Themen 9
A Erste Schritte Problem bei meiner if-Abfrage! Java Basics - Anfänger-Themen 5
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
S Java Counter: nur 1 mal hochzählen auch wenn Abfrage mehrmals zutrifft. Java Basics - Anfänger-Themen 1
E Erste Schritte [Noob-Frage] Meine If-Abfrage macht nicht, was sie soll... Java Basics - Anfänger-Themen 2
C Abfrage nach einem Bild im Array Java Basics - Anfänger-Themen 9
A Key Event - Abfrage von 2 gedrückten Tasten Java Basics - Anfänger-Themen 6
T Klasse für Google-Abfrage Java Basics - Anfänger-Themen 9
Z If abfrage - Minimum 0 Java Basics - Anfänger-Themen 9
J Abfrage versetzen Java Basics - Anfänger-Themen 2
D Methoden Abfrage ob ein Wert bereits vorhanden ist Java Basics - Anfänger-Themen 1
thet1983 if() Abfrage Java Basics - Anfänger-Themen 2
A charAt(x)-Abfrage lässt bei Strings<x das Pgrogramm abstürzen. Kann man das verhindern? Java Basics - Anfänger-Themen 4
Uzi21 if - else Abfrage Java Basics - Anfänger-Themen 6
T Index-Abfrage von Pi Java Basics - Anfänger-Themen 5
H Erste Schritte If Abfrage Java Basics - Anfänger-Themen 3
B If Abfrage mit Passwort und Username Java Basics - Anfänger-Themen 2
U einlesen, abfrage Java Basics - Anfänger-Themen 25
T SQL Abfrage Läuft nicht Java Basics - Anfänger-Themen 5
N Probleme mit ActionListener und Logischer Abfrage Java Basics - Anfänger-Themen 4
F Erste Schritte IF-Abfrage fehlerhaft Java Basics - Anfänger-Themen 9
O Downloaden: Trotz If Abfrage wird Datei heruntergeladen Java Basics - Anfänger-Themen 2
D jProgressBar soll bei 100% sein wenn sql Abfrage inkl. jTable schreiben fertig ist... Java Basics - Anfänger-Themen 5
H if-Abfrage double wert Java Basics - Anfänger-Themen 5
M Erstes Prog. OS Abfrage Java Basics - Anfänger-Themen 9
B Boolean abfrage Java Basics - Anfänger-Themen 3
D Variablen Rücksprung nach If Abfrage Java Basics - Anfänger-Themen 16
T If- Abfrage Java Basics - Anfänger-Themen 8
P Taschenrechner , IF-Abfrage Java Basics - Anfänger-Themen 12
D if-Abfrage Java Basics - Anfänger-Themen 6
G Einfache if-Abfrage der Main-Argumente Java Basics - Anfänger-Themen 3
C If abfrage zu getBackground Java Basics - Anfänger-Themen 2
T abfrage eines Integer Array s Java Basics - Anfänger-Themen 5
feardorcha boolean array false - true - Abfrage Java Basics - Anfänger-Themen 10
G Adminrechte abfrage Java Basics - Anfänger-Themen 5
S Abfrage Objekt-Array nach Datentypen Java Basics - Anfänger-Themen 6
R If-Abfrage, || funktioniert nicht Java Basics - Anfänger-Themen 4
S TabbedPane: nach Abfrage oldTab selektieren Java Basics - Anfänger-Themen 5
B Abfrage mittels Variable vereinfachen Java Basics - Anfänger-Themen 6
C Treffer Abfrage Java Basics - Anfänger-Themen 19
M nach jar export keine db abfrage möglich Java Basics - Anfänger-Themen 2
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
J Erste Schritte Im Tante-Emma-Laden mehrere Artikel kaufen mit if-Abfrage Java Basics - Anfänger-Themen 24

Ähnliche Java Themen

Neue Themen


Oben