2013-05-06 19 views
5

Sto provando a creare una matrice di oggetti come definito da una sottoclasse (penso che sia la terminologia corretta). Posso vedere che la domanda è ricorrente, ma l'implementazione è ancora problematica.Come creare una matrice di oggetti in Java

Il mio codice

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; 

    }  
} 

dà l'errore

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

Nel tentativo di razionalizzare, ho rotto giù a termini più semplici:

public class Test { 

    private static int[] foo; 

    public static void main(String args[]) { 

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

    }  
} 

che sembra funzionare. Non vedo la differenza tra i miei due esempi. (Capisco che il mio primo è inutile, ma MyClass alla fine conterrà più dati.)

Sono abbastanza sicuro che la domanda è stata chiesta here ed è molto ben risposto. Credo di aver implementato la soluzione:

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

ma la seconda linea delle questioni di cui sopra l'errore

Nessuna istanza allegando del tipo di test è accessibile.

Capisco che ArrayList sarebbe una soluzione, ma sto cercando di cogliere i concetti sottostanti.

NB - Potrebbe essere utile sapere che, pur essendo molto a proprio agio con la programmazione in generale, Java è il mio primo tuffo nella programmazione orientata agli oggetti.

+1

Il chapeter ab di java tutorial out [classi annidate] (http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html) potrebbe essere una lettura interessante sulle basi delle classi interne. – Alderath

risposta

3

La ragione int opere, ma non lo fa MyClass:

Da 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 

Quando si inizializza un array, tutti gli elementi assumono il valore di default.

Quindi, quando si inizializza uno int[], tutti gli elementi sono 0, quindi nessun problema l'utilizzo o l'assegnazione di un nuovo valore ad esso.

Tuttavia, quando si inizializza uno MyClass[], tutti gli elementi sono null, che è un problema quando si tenta di accedere a un membro di uno degli elementi.

Se non si sa perché l'accesso ai membri di un oggetto null non funzioni, è probabile che sia necessario eseguire 2 passaggi indietro e leggere un libro Java.

nota complementare:

Tecnicamente, questo:

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

è in realtà più simile a questo:

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

:

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

poiché si assegna un nuovo valore a un elemento, anziché accedere a un membro di un elemento.

Nessuna istanza allegando del tipo di test è accessibile:

Le altre risposte copertura che abbastanza bene, e qui ci sono 3 domande relative:

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

Tutte le risposte fantastiche, tutte utili, ma questo è quello che ha più senso per me in questa fase della mia carriera in Java! – KDM

3

Il problema affrontato alla fine ("nessuna istanza di inclusione") non è in realtà correlato agli array.

provare a sostituire il vostro blocco di codice ultima con questo:

MyClass foo = new MyClass(); 

si otterrà il messaggio di errore esattamente lo stesso, anche se non gli array sono coinvolti.

Il problema qui è che una classe interna non statica ha un riferimento implicito alla sua istanza esterna. Poiché non hai istanze esterne (sei in un contesto statico, non c'è this), non è possibile creare alcuna istanza MyClass.

È probabilmente non ha bisogno/vogliono una classe interna e può semplicemente rendere static:

private static class MyClass 

anche: il motivo per il vostro codice ha lavorato con int e non con MyClass è che un int[] detiene int valori (int è un tipo primitivo), mentre un MyClass[] detiene MyClassriferimenti (MyClass è un tipo di riferimento).

6

Il classMyClass è un inner class, e non una sottoclasse. È possibile accedere alle classi interne non statiche creando un oggetto di classe che racchiuda la classe interna. Quindi, se vuoi accedere alla classe interna, dovresti prima creare un oggetto di classe esterna. Puoi farlo da:

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

Non sono sicuro se questo è quello che voglio fare: Test è la mia classe più alta e non credo di voler creare un'istanza di esso. Grazie per aver guardato. – KDM

+0

@KDM Se non si desidera creare un'istanza di 'Test', è possibile che si desideri rendere' MyClass' statico. –

0

Non è possibile utilizzare una classe interna non statica dall'interno del metodo statico main.

La soluzione è dichiarare MyClass come private static class.

Problemi correlati