2013-05-06 19 views
5

Ich versuche, ein Array von Objekten wie von einer Unterklasse definiert zu erstellen (ich denke, das ist die richtige Terminologie). Ich kann sehen, dass die Frage wiederkehrend ist, aber die Umsetzung ist immer noch problematisch.So erstellen Sie ein Array von Objekten in Java

Mein Code

public class Test { 

    private class MyClass { 
     int bar = -1; 
    } 

    private static MyClass[] foo; 

    public static void main(String args[]) { 

     foo = new MyClass[1]; 
     foo[0].bar = 0; 

    }  
} 

Gibt den Fehler

Exception in thread "main" java.lang.NullPointerException.

In einem Versuch, sie zu rationalisieren, brach ich es einfach ausgedrückt unten:

public class Test { 

    private static int[] foo; 

    public static void main(String args[]) { 

     foo = new int[1]; 
     foo[0] = 0; 

    }  
} 

Welche scheint zu funktionieren. Ich sehe den Unterschied zwischen meinen beiden Beispielen einfach nicht. (Ich verstehe, dass meine erste ist sinnlos, aber MyClass wird letztlich mehr Daten enthalten.)

Ich bin ziemlich sicher, dass die Frage here gestellt wird und sehr gut beantwortet wird. Ich denke, dass ich die Lösung implementiert:

MyClass[] foo = new MyClass[10]; 
foo[0] = new MyClass(); 
foo[0].bar = 0; 

aber die zweite Zeile der oben genannten Fragen die Fehler

Keine umschließenden Instanz vom Typ-Test zugänglich ist.

Ich verstehe, dass ArrayList ein Weg nach vorne wäre, aber ich versuche, die zugrunde liegenden Konzepte zu begreifen.

NB - Es könnte nützlich sein, zu wissen, dass Java zwar sehr komfortabel mit der Programmierung ist, aber mein erster Einstieg in die objektorientierte Programmierung ist.

+1

Der Java-Tutorial Chapeter ab out [verschachtelte Klassen] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) könnte eine interessante Lektüre über die Grundlagen innerer Klassen sein. – Alderath

Antwort

3

Der Grund int funktioniert, aber MyClass nicht:

Von here:

Data Type    Default Value (for fields) 
byte     0 
short     0 
int      0 
long     0L 
float     0.0f 
double     0.0d 
char     '\u0000' 
String (or any object) null 
boolean     false 

Wenn Sie ein Array initialisieren, werden alle Elemente auf den Standardwert übernehmen.

Also, wenn Sie eine int[] initialisieren, sind alle Elemente 0, also kein Problem, das verwenden oder einen neuen Wert zuweisen. Wenn Sie eine MyClass[] initialisieren, sind alle Elemente null, was ein Problem ist, wenn Sie versuchen, auf ein Mitglied eines der Elemente zuzugreifen.

Wenn Sie nicht wissen, warum Zugriff auf null Objekt Mitglieder nicht funktionieren, müssen Sie wahrscheinlich 2 Schritte zurück und lesen Sie ein Java-Buch.

Zusätzlicher Hinweis:

Technisch ist diese:

int[] foo = new int[1]; 
foo[0] = 0; 

ist eigentlich mehr wie folgt aus:

MyClass[] foo = new MyClass[10]; 
foo[0] = new MyClass(); 

nicht:

MyClass[] foo = new MyClass[10]; 
foo[0].bar = 0; 

, da Sie einem Element einen neuen Wert zuweisen, anstatt auf ein Mitglied eines Elements zuzugreifen.

Keine umschließenden Instanz vom Typ-Test ist zugänglich:

Die anderen Antworten, die ziemlich gut abdecken, und hier sind drei Fragen:

No enclosing instance of type is accessible.

No enclosing instance of type Server is accessible

"No enclosing instance of type" error while calling method from another class in Android

+0

Alle fantastischen Antworten, alle nützlich, aber das ist der, der für mich in dieser Phase meiner Java-Karriere am sinnvollsten ist! – KDM

3

Das Problem, mit dem Sie am Ende konfrontiert wurden ("keine einschließende Instanz"), bezieht sich überhaupt nicht auf Arrays.

Versuchen Sie, Ihren letzten Codeblock mit diesem ersetzen:

MyClass foo = new MyClass(); 

Sie erhalten genau die gleiche Fehlermeldung, obwohl keine Arrays beteiligt ist.

Das Problem hier ist, dass eine nicht statische innere Klasse einen impliziten Verweis auf seine äußere Instanz hat. Da Sie keine äußere Instanz haben (Sie befinden sich in einem statischen Kontext, gibt es keine this), kann keine MyClass Instanz erstellt werden.

Sie wahrscheinlich nicht brauchen/eine innere Klasse wollen und können es einfach static machen:

private static class MyClass 

auch: der Grund, Ihren Code mit int gearbeitet und nicht mit MyClass ist, dass ein int[] hält int Werte (int ist ein primitiver Typ), während ein MyClass[] hält MyClassReferenzen (MyClass ist ein Referenztyp).

6

The classMyClass ist ein inner class und keine Unterklasse. Auf nicht statische innere Klassen kann zugegriffen werden, indem ein Objekt der Klasse erstellt wird, das die innere Klasse einschließt. Wenn Sie also auf die innere Klasse zugreifen möchten, müssen Sie zuerst ein Objekt der äußeren Klasse erstellen. Sie können es tun, indem:

Test t = new Test(); 
MyClass[] foo = new MyClass[10]; 
foo[0] = t.new MyClass(); 
foo.bar = 0; 
+0

Ich bin nicht sicher, ob das ist, was ich tun möchte: Test ist meine oberste Klasse und ich glaube nicht, dass ich eine Instanz davon erstellen möchte. Danke fürs schauen. – KDM

+0

@KDM Wenn Sie keine Instanz von 'Test' erstellen möchten, sollten Sie' MyClass' statisch machen. –

0

Sie können keine nicht-statische innere Klasse innerhalb der statischen main Methode verwenden.

Die Lösung besteht darin, MyClass als private static class zu deklarieren.

Verwandte Themen