web-dev-qa-db-fra.com

Comment créer un tableau d'objets en Java

J'essaie de créer un tableau d'objets tel que défini par une sous-classe (je pense que c'est la terminologie correcte). Je peux voir que la question est récurrente, mais la mise en œuvre reste problématique.

Mon 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;

    }       
}

Donne l'erreur 

Exception dans le fil "principal" Java.lang.NullPointerException.

Pour tenter de le rationaliser, je l'ai résumé en termes simples:

public class Test {

    private static int[] foo;

    public static void main(String args[]) {

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

    }       
}

Ce qui semble fonctionner. Je ne vois tout simplement pas la différence entre mes deux exemples. (Je comprends que mon premier est inutile, mais MyClass contiendra finalement plus de données.)

Je suis à peu près sûr que la question est posée ici et on y répond très bien. Je pense avoir implémenté la solution:

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

mais la deuxième ligne de ce qui précède génère l'erreur 

Aucune instance englobante de type Test n'est accessible.

Je comprends que ArrayList serait un moyen d'avancer, mais j'essaie de saisir les concepts sous-jacents.

NB - Il peut être utile de savoir que, bien que très à l'aise avec la programmation en général, Java est ma première immersion dans la programmation orientée objet.

5
KDM

La raison int fonctionne, mais MyClass ne le fait pas:

De ici :

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

Lorsque vous initialisez un tableau, tous les éléments prennent la valeur par défaut.

Ainsi, lorsque vous initialisez un int[], tous les éléments ont la valeur 0, aucun problème pour l’utiliser ou pour lui affecter une nouvelle valeur.

Toutefois, lorsque vous initialisez un MyClass[], tous les éléments sont null, ce qui pose un problème lorsque vous essayez d'accéder à un membre de l'un des éléments.

Si vous ne savez pas pourquoi l'accès aux membres d'un objet null ne fonctionnera pas, vous devrez probablement revenir en arrière et lire un livre Java.

Note complémentaire:

Techniquement, ceci:

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

est en fait plus comme ça:

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

ne pas:

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

puisque vous attribuez une nouvelle valeur à un élément, plutôt que d'accéder à un membre d'un élément.

Aucune instance englobante de type Test n'est accessible:

Les autres réponses couvrent très bien cela, et voici 3 questions connexes:

Aucune instance de type englobante n'est accessible.

Aucune instance englobante de type Server n'est accessible

Erreur "Aucune instance englobante de type" lors de l'appel de la méthode depuis une autre classe sous Android

3
Dukeling

classMyClass est un inner class et pas une sous-classe . On peut accéder aux classes internes non statiques en créant un objet de classe englobant la classe interne. Donc, si vous voulez accéder à la classe interne, vous devez d'abord créer un objet de classe externe. Vous pouvez le faire en:

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
6
Rahul Bobhate

Le problème que vous avez rencontré à la fin ("pas d'instance englobante") n'est pas du tout lié aux tableaux.

Essayez de remplacer votre dernier bloc de code par ceci:

 MyClass foo = new MyClass();

Vous obtiendrez exactement le même message d'erreur, même si aucun tableau n'est impliqué.

Le problème ici est qu'une classe interne non statique a une référence implicite à son instance externe. Puisque vous n'avez pas d'instance externe (vous êtes dans un contexte statique, il n'y a pas de this), aucune instance de MyClass ne peut être créée.

Vous probablement n'avez pas besoin/vous voulez d'une classe interne et pouvez simplement le rendre static:

private static class MyClass

De plus: la raison pour laquelle votre code a travaillé avec int et non avec MyClass est qu'un int[] détientint valeurs (int est un type primitif), tandis qu'un MyClass[] détientMyClass références (MyClass est un type de référence).

3
Joachim Sauer

Vous ne pouvez pas utiliser une classe interne non statique à partir de la méthode statique main.

La solution consiste à déclarer MyClass en tant que private static class.

0
Tony the Pony