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.
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.
class
MyClass
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;
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).
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
.