2017-07-12 6 views
0

Lange Rede kurzer Sinn, ich kann nicht herausfinden, warum dieser Code nicht funktioniert.Verweise auf Variablen oder Methoden eines Objekts in einer ArrayList

import java.util.*; 

class sup{ 
    int a; 

    sup(){ 
    a = 1; 
    } 
} 

class subB extends sup{ 
    int b; 

    subB(){ 
    b = 2; 
    } 
} 

class subC extends sup{ 
    int c; 

    subC(){ 
    c = 3; 
    } 
} 

public class runMain{ 
    public static void main(String args[]){ 
    List<Object> classes = new ArrayList<Object>(); 

    classes.add(new sup()); 
    classes.add(new subB()); 
    classes.add(new subC()); 

    System.out.println(classes.get(0).a); //should print 1 
    System.out.println(classes.get(1).b); //should print 2 
    System.out.println(classes.get(2).c); //should print 3 

    } 
} 

Wie im Kommentar erwähnt, ich die letzten 3 Zeilen bin zu wollen, um die Werte von a, b und c in den verschiedenen Klassen zu drucken. Wenn stattdessen z.B. System.out.println (Klassen.get (0)); es druckt [email protected], was ich nehme, ist nur der Klassenname "@" der Speicherort, so scheint alles andere im Programm als beabsichtigt zu arbeiten.

+0

Ich weiß, warum sup @ 6d06d69c es Druck, wie ich in der angegebenen Text, das war nicht meine Frage. Ich frage, wie man eine bestimmte Variable, die Teil der Klasse ist, druckt oder darauf zugreift. – Dant

+0

Mein schlechtes. Hier ist ein Betrüger für das, was Sie eigentlich fragen: https://stackoverflow.com/questions/4512312/access-subclass-fields-from-a-base-class-in-java Sie müssen den Wert auf seine werfen entsprechende Unterklasse. –

+0

Das löst das Problem, wenn das Objekt nicht in einer ArrayList gespeichert wird, was ich vorher ausprobiert habe und gut funktioniert hat. Es ist nur so, dass die Referenzierung der Variablen eines Objekts in einer ArrayList nicht so funktioniert, wie es für mich zumindest in der Form, die ich in den ursprünglichen Codeblock eingefügt habe, intuitiv wäre. – Dant

Antwort

0

Die Vorteile der Vererbung umfassen die Wiederverwendung von Code und das Überladen von Methoden, von denen keiner Ihren Code ausnutzt. In Ihrem Fall kann es entweder:

  1. Wiederverwendung: der Super-Klasse Variable a, in welchem ​​Fall die Unterklassen nicht ihre eigenen Variablen haben würde b und c, sondern weisen Sie ihre jeweiligen Werte zu der Super-Klasse-Deklaration von a, vorausgesetzt, es ist entweder öffentlich oder geschützt. Ein besserer Codierungsstil würde eine geteilte Getter-Methode in der Super-Klasse beinhalten.

  2. Methodenüberladung: Jede der drei Klassen hat eine allgemein gebräuchliche Methode, die ihre jeweiligen Werte zurückgibt.

In diesem Beispiel sind die drei in der Vererbungsanteil beteiligten Klassen eine Variable, und ein Getter:

import java.util.ArrayList; 

public class MyClass{ 

static class sup{ 
    protected int a; 

    sup(){ 
    a = 1; 
    } 

    public int a() { 
     return a; 
    } 
} 

static class subB extends sup{ 


    subB(){ 
    a = 2; 
    } 
} 

static class subC extends sup{ 


    subC(){ 
    a = 3; 
    } 
} 

public static void main(String[] args) { 

    ArrayList<sup> classes = new ArrayList<sup>(); 

    classes.add(new sup()); 
    classes.add(new subB()); 
    classes.add(new subC()); 

    System.out.println(classes.get(0).a()); 
    System.out.println(classes.get(1).a()); 
    System.out.println(classes.get(2).a()); 
} 

}

+0

Entschuldigung, ich nehme an, dass mein Code hier mein Problem zu sehr vereinfacht hat. Ich beabsichtige, dass die Unterklassen viele verschiedene Methoden und Variablen enthalten, die nur für diese Unterklasse spezifisch sind. Daher würde das Definieren von allem in der Oberklasse den Zweck meiner Erstellung der Unterklassen für die Organisation an erster Stelle zunichte machen. – Dant

+0

Wenn Sie Code oder Variablen nicht teilen oder statische Bindungen verwenden, warum verwenden Sie Vererbung? – JohnG79

+0

Ich werde Code teilen, die Oberklasse wird immer noch viele Methoden haben, die von Unterklassen-Objekten verwendet werden, aber weitere spezialisierte Methoden werden in jeder der Unterklassen sein. – Dant

Verwandte Themen