Création d'un tableau d'objets en Java

196

Je suis novice en Java et pour l'instant créé un tableau d'objets en Java.

J'ai une classe A par exemple -

A[] arr = new A[4];

Mais cela ne fait que créer des pointeurs (références) vers Aet non 4 objets. Est-ce correct? Je vois que lorsque j'essaie d'accéder aux fonctions / variables dans les objets créés, j'obtiens une exception de pointeur nul. Pour pouvoir manipuler / accéder aux objets, je devais faire ceci:

A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
    arr[i] = new A();
}

Est-ce correct ou est-ce que je fais quelque chose de mal? Si c'est correct, c'est vraiment bizarre.

EDIT: Je trouve cela étrange parce qu'en C ++, vous dites juste nouveau A[4]et cela crée les quatre objets.

user220201
la source
17
Je voulais juste dire que c'était une question extrêmement utile; merci de le demander.
pandorym

Réponses:

262

C'est correct.

A[] a = new A[4];

... crée 4 Aréférences, similaires à cela:

A a1;
A a2;
A a3;
A a4;

Maintenant, vous ne pouvez pas vous a1.someMethod()passer de l'allocation a1comme ceci:

a1 = new A();

De même, avec le tableau, vous devez faire ceci:

a[0] = new A();

... avant de l'utiliser.

MeBigFatGuy
la source
10
Cette réponse m'a évité tout un tas de confusion, merci pour son existence.
pandorym
1
J'ai aussi eu cette confusion, car je viens du milieu C ++, j'ai toujours supposé que, comme dans le newmot clé C ++, Java appelle également le constructeur et alloue la mémoire I. Je suppose qu'en Java newne crée que les références et non l'objet réel par rapport à C ++. Merci de répondre.
Krishna Oza
1
@ Krishna_Oza, il n'y a pas de différence avec C ++ ici. Le premier newcrée un objet tableau. Ce sont des objets alloués dynamiquement ("tas"). Ainsi, le code C ++ analogue serait A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov
1
J'obtiens que le nouveau crée des références, mais pourquoi ne pas aussi initialiser le constructeur pour chaque élément du tableau comme en C ++. Cela peut être idiot, mais je veux demander, tous les problèmes que nous aurions, si nous le faisons ?? @MeBigFatGuy
Jasser
2
@Jasser - quel constructeur pour les éléments appelleriez-vous? Et si le seul constructeur d'élément prend un tas d'arguments? Comment créeriez-vous ces objets?
MeBigFatGuy
77

C'est correct. Vous pouvez également faire:

A[] a = new A[] { new A("args"), new A("other args"), .. };

Cette syntaxe peut également être utilisée pour créer et initialiser un tableau n'importe où, comme dans un argument de méthode:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
Steve B.
la source
35

Oui, il crée uniquement des références, dont la valeur par défaut est null. C'est pourquoi vous obtenez une NullPointerException. Vous devez créer des objets séparément et attribuer la référence. Il y a 3 étapes pour créer des tableaux en Java -

Déclaration - Dans cette étape, nous spécifions le type de données et les dimensions du tableau que nous allons créer. Mais rappelez-vous, nous ne mentionnons pas encore les tailles des dimensions. Ils sont laissés vides.

Instanciation - Dans cette étape, nous créons le tableau ou allouons de la mémoire au tableau à l'aide du nouveau mot clé. C'est dans cette étape que nous mentionnons les tailles des dimensions du tableau.

Initialisation - Le tableau est toujours initialisé à la valeur par défaut du type de données. Mais nous pouvons faire nos propres initialisations.

Déclaration de tableaux en Java

Voilà comment nous déclarons un tableau unidimensionnel en Java -

int[] array;
int array[];

Oracle vous recommande d'utiliser l'ancienne syntaxe pour déclarer des tableaux. Voici quelques autres exemples de déclarations légales -

// One Dimensional Arrays
int[] intArray;             // Good
double[] doubleArray;

// One Dimensional Arrays
byte byteArray[];           // Ugly!
long longArray[];

// Two Dimensional Arrays
int[][] int2DArray;         // Good
double[][] double2DArray;

// Two Dimensional Arrays
byte[] byte2DArray[];       // Ugly
long[] long2DArray[];

Et ce sont quelques exemples de déclarations illégales -

int[5] intArray;       // Don't mention size!
double{} doubleArray;  // Square Brackets please!

Instanciation

C'est ainsi que nous «instancions» ou allouons de la mémoire à un tableau -

int[] array = new int[5];

Lorsque la JVM rencontre le newmot - clé, elle comprend qu'elle doit allouer de la mémoire à quelque chose. Et en spécifiant int[5], nous voulons dire que nous voulons un tableau de ints, de taille 5. Ainsi, la JVM crée la mémoire et assigne la référence de la mémoire nouvellement allouée au tableau qui est une "référence" de typeint[]

Initialisation

Utilisation d'une boucle - L'utilisation d'une boucle for pour initialiser les éléments d'un tableau est le moyen le plus courant de démarrer le tableau. Il n'est pas nécessaire d'exécuter une boucle for si vous allez attribuer la valeur par défaut elle-même, car JVM le fait pour vous.

Tout en un..! - Nous pouvons déclarer, instancier et initialiser notre tableau en une seule fois. Voici la syntaxe -

int[] arr = {1, 2, 3, 4, 5};

Ici, nous ne mentionnons pas la taille, car JVM peut voir que nous donnons 5 valeurs.

Donc, jusqu'à ce que nous instancions les références restent nulles. J'espère que ma réponse vous a aidé..! :)

Source - Tableaux en Java

Vamsi Sangam
la source
5

Voici l'exemple clair de la création d'un tableau de 10 objets employés, avec un constructeur qui prend un paramètre:

public class MainClass
{  
    public static void main(String args[])
    {
        System.out.println("Hello, World!");
        //step1 : first create array of 10 elements that holds object addresses.
        Emp[] employees = new Emp[10];
        //step2 : now create objects in a loop.
        for(int i=0; i<employees.length; i++){
            employees[i] = new Emp(i+1);//this will call constructor.
        }
    }
}

class Emp{
    int eno;
    public Emp(int no){
        eno = no;
        System.out.println("emp constructor called..eno is.."+eno);
    }
}
user1923551
la source
3

Vous avez raison. En plus de cela, si nous voulons créer un tableau de taille spécifique rempli d'éléments fournis par une certaine «usine», depuis Java 8 (qui introduit l' API de flux ), nous pouvons utiliser ce one-liner:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())est comme une usine pour les éléments A séparés créés d'une manière décrite par lambda, () -> new A()qui est l'implémentation de Supplier<A>- il décrit comment chaque nouvelle instance A doit être créée.
  • limit(4)définit la quantité d'éléments que le flux va générer
  • toArray(A[]::new)(peut également être réécrit comme toArray(size -> new A[size])) - il nous permet de décider / décrire le type de tableau qui doit être retourné.

Pour certains types primitifs que vous pouvez utiliser DoubleStream, IntStream, LongStreamqui fournissent en outre des générateurs comme range rangeClosedet quelques autres.

Pshemo
la source
0

Oui c'est correct en Java il y a plusieurs étapes pour faire un tableau d'objets:

  1. Déclarer puis instancier (créer de la mémoire pour stocker des objets «4»):

    A[ ] arr = new A[4];
  2. Initialisation des objets (dans ce cas, vous pouvez initialiser 4 objets de classe A)

    arr[0] = new A();
    arr[1] = new A();
    arr[2] = new A();
    arr[3] = new A();

    ou

    for( int i=0; i<4; i++ )
      arr[i] = new A();

Vous pouvez maintenant commencer à appeler des méthodes existantes à partir des objets que vous venez de créer, etc.

Par exemple:

  int x = arr[1].getNumber();

ou

  arr[1].setNumber(x);
Jeremy Levett
la source
0

Pour la classe générique, il est nécessaire de créer une classe wrapper. Par exemple:

Set<String>[] sets = new HashSet<>[10]

résulte en: "Impossible de créer un tableau générique"

Utilisez plutôt:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  
SzB
la source
Est-ce que cette ligne signifie que vous essayez de créer un tableau d'ensembles, où le type d'ensemble est String?
sofs1
0

La forme générale pour déclarer un nouveau tableau en java est la suivante:

type arrayName[] = new type[numberOfElements];

Où type est un type ou un objet primitif. numberOfElementsest le nombre d'éléments que vous stockerez dans le tableau et cette valeur ne peut pas changer car Java ne prend pas en charge les tableaux dynamiques (si vous avez besoin d'une structure flexible et dynamique pour contenir des objets, vous souhaiterez peut-être utiliser certaines des collections Java).

Permet d'initialiser un tableau pour stocker les salaires de tous les employés dans une petite entreprise de 5 personnes:

int salaries[] = new int[5];

Le type du tableau (dans ce cas int) s'applique à toutes les valeurs du tableau. Vous ne pouvez pas mélanger les types dans un seul tableau.

Maintenant que notre tableau des salaires est initialisé, nous voulons y ajouter des valeurs. Nous pouvons le faire soit lors de l'initialisation comme ceci:

int salaries[] = {50000, 75340, 110500, 98270, 39400};

Ou pour le faire plus tard, comme ceci:

salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;

Exemple plus visuel de création de tableau: entrez la description de l'image ici

Pour en savoir plus sur les tableaux, consultez le guide .

Johnny
la source