Erstellen eines Arrays von Objekten in Java

196

Ich bin neu in Java und habe für die Zeit eine Reihe von Objekten in Java erstellt.

Ich habe zum Beispiel eine Klasse A -

A[] arr = new A[4];

Dies erzeugt jedoch nur Zeiger (Verweise) auf Aund nicht auf 4 Objekte. Ist das richtig? Ich sehe, dass ich beim Versuch, auf Funktionen / Variablen in den erstellten Objekten zuzugreifen, eine Nullzeigerausnahme erhalte. Um die Objekte manipulieren / darauf zugreifen zu können, musste ich Folgendes tun:

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

Ist das richtig oder mache ich etwas falsch? Wenn dies richtig ist, ist es wirklich seltsam.

EDIT: Ich finde das seltsam, weil man in C ++ einfach neu sagt A[4]und es die vier Objekte erstellt.

user220201
quelle
17
Ich wollte nur sagen, dass dies eine außerordentlich hilfreiche Frage war. Danke, dass du es gefragt hast.
Pandorym

Antworten:

262

Das ist richtig.

A[] a = new A[4];

... erstellt 4 AReferenzen, ähnlich wie hier:

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

Jetzt könnten Sie nicht mehr a1.someMethod()auf Folgendes verzichten a1:

a1 = new A();

In ähnlicher Weise müssen Sie mit dem Array Folgendes tun:

a[0] = new A();

... bevor Sie es benutzen.

MeBigFatGuy
quelle
10
Diese Antwort hat mir eine Menge Verwirrung erspart, danke für ihre Existenz.
Pandorym
1
Ich hatte auch diese Verwirrung, da ich aus dem C ++ - Hintergrund stamme, habe ich immer angenommen, dass das newSchlüsselwort von Java wie in C ++ auch den Konstruktor aufruft und den I-Speicher zuweist. Ich denke, in Java werden newnur die Referenzen erstellt, nicht das eigentliche Objekt im Vergleich zu C ++. Danke für die Antwort.
Krishna Oza
1
@Krishna_Oza, hier gibt es keinen Unterschied zu C ++. Der erste newerstellt ein Array-Objekt. Dies sind dynamisch zugewiesene Objekte ("Heap"). Der analoge C ++ - Code wäre also A **a = new A*[4]; for (int i = 0; i < 4; ++i) { a[i] = new A(); }.
Vsevolod Golovanov
1
Ich bekomme, dass neu Referenzen erstellt, aber warum nicht auch Konstruktoren für jedes Element des Arrays wie in C ++ initialisieren. Das mag albern sein, aber ich möchte fragen, welche Probleme wir hätten, wenn wir das tun? @ MeBigFatGuy
Jasser
2
@Jasser - welchen Konstruktor für die Elemente würdest du nennen? Was ist, wenn der einzige Elementkonstruktor eine Reihe von Argumenten akzeptiert? Wie würden Sie diese Objekte erstellen?
MeBigFatGuy
77

Das ist richtig. Sie können auch tun:

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

Diese Syntax kann auch verwendet werden, um ein Array an einer beliebigen Stelle zu erstellen und zu initialisieren, z. B. in einem Methodenargument:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
Steve B.
quelle
34

Ja, es werden nur Referenzen erstellt, die auf den Standardwert null gesetzt sind. Aus diesem Grund erhalten Sie eine NullPointerException. Sie müssen Objekte separat erstellen und die Referenz zuweisen. Es gibt 3 Schritte zum Erstellen von Arrays in Java:

Deklaration - In diesem Schritt geben wir den Datentyp und die Abmessungen des Arrays an, das erstellt werden soll. Aber denken Sie daran, wir erwähnen die Größen der Abmessungen noch nicht. Sie bleiben leer.

Instanziierung - In diesem Schritt erstellen wir das Array oder weisen dem Array mit dem neuen Schlüsselwort Speicher zu. In diesem Schritt erwähnen wir die Größen der Array-Dimensionen.

Initialisierung - Das Array wird immer auf den Standardwert des Datentyps initialisiert. Aber wir können unsere eigenen Initialisierungen vornehmen.

Arrays in Java deklarieren

So deklarieren wir ein eindimensionales Array in Java -

int[] array;
int array[];

Oracle empfiehlt, dass Sie die frühere Syntax zum Deklarieren von Arrays verwenden. Hier sind einige andere Beispiele für rechtliche Erklärungen -

// 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[];

Und dies sind einige Beispiele für illegale Erklärungen -

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

Instanziierung

Auf diese Weise „instanziieren“ wir einen Array oder weisen ihm Speicher zu -

int[] array = new int[5];

Wenn die JVM auf das newSchlüsselwort stößt , versteht sie, dass sie Speicher für etwas zuweisen muss. Und mit Angabe int[5]meinen wir, dass wir ein Array von ints der Größe 5 wollen. Die JVM erstellt also den Speicher und weist dem Array die Referenz des neu zugewiesenen Speichers zu, das eine „Referenz“ vom Typ istint[]

Initialisierung

Verwenden einer Schleife - Die Verwendung einer for-Schleife zum Initialisieren von Elementen eines Arrays ist die häufigste Methode, um das Array zum Laufen zu bringen. Es ist nicht erforderlich, eine for-Schleife auszuführen, wenn Sie den Standardwert selbst zuweisen möchten, da JVM dies für Sie erledigt.

Alles in einem..! - Wir können unser Array auf einmal deklarieren, instanziieren und initialisieren. Hier ist die Syntax -

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

Hier erwähnen wir die Größe nicht, da JVM sehen kann, dass wir 5 Werte angeben.

Bis wir instanziieren, bleiben die Referenzen also null. Ich hoffe meine Antwort hat dir geholfen ..! :) :)

Quelle - Arrays in Java

Vamsi Sangam
quelle
5

Hier ist das klare Beispiel für das Erstellen eines Arrays von 10 Mitarbeiterobjekten mit einem Konstruktor, der Parameter akzeptiert:

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
quelle
3

Du hast Recht. Abgesehen davon können wir diesen Einzeiler verwenden, wenn wir ein Array mit einer bestimmten Größe erstellen möchten, das mit Elementen gefüllt ist, die von einer "Fabrik" bereitgestellt werden, da Java 8 (das die Stream-API einführt ):

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A())ist wie eine Fabrik für separate A-Elemente, die auf eine von Lambda beschriebene Weise erstellt wurde. Dies ist () -> new A()die Implementierung von Supplier<A>- es beschreibt, wie jede neue A-Instanz erstellt werden soll.
  • limit(4)Legt die Anzahl der Elemente fest, die der Stream generiert
  • toArray(A[]::new)(kann auch umgeschrieben werden als toArray(size -> new A[size])) - damit können wir den Typ des Arrays bestimmen / beschreiben, der zurückgegeben werden soll.

Für einige primitive Typen , die Sie verwenden können DoubleStream, IntStream, LongStreamdie zusätzlich Generatoren liefern wierange rangeClosed und einige andere.

Pshemo
quelle
0

Ja, es ist richtig, in Java gibt es mehrere Schritte, um ein Array von Objekten zu erstellen:

  1. Deklarieren und dann instanziieren (Speicher zum Speichern von '4'-Objekten erstellen):

    A[ ] arr = new A[4];
  2. Initialisieren der Objekte (In diesem Fall können Sie 4 Objekte der Klasse A initialisieren.)

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

    oder

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

Jetzt können Sie vorhandene Methoden von den gerade erstellten Objekten usw. aufrufen.

Beispielsweise:

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

oder

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

Für generische Klassen muss eine Wrapper-Klasse erstellt werden. Beispielsweise:

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

führt zu: "Generisches Array kann nicht erstellt werden"

Verwenden Sie stattdessen:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  
SzB
quelle
Bedeutet diese Zeile, dass Sie versuchen, ein Array von Sets zu erstellen, wobei der Set-Typ String ist?
sofs1
0

Die allgemeine Form zum Deklarieren eines neuen Arrays in Java lautet wie folgt:

type arrayName[] = new type[numberOfElements];

Wobei Typ ein primitiver Typ oder ein Objekt ist. numberOfElementsist die Anzahl der Elemente, die Sie im Array speichern, und dieser Wert kann sich nicht ändern da Java keine dynamischen Arrays unterstützt (wenn Sie eine flexible und dynamische Struktur zum Objekten benötigen, möchten Sie möglicherweise einige der Java-Sammlungen verwenden).

Initialisieren Sie ein Array, um die Gehälter aller Mitarbeiter in einem kleinen Unternehmen mit 5 Mitarbeitern zu speichern:

int salaries[] = new int[5];

Der Typ des Arrays (in diesem Fall int ) gilt für alle Werte in dem Array. Sie können keine Typen in einem Array mischen.

Nachdem wir unser Gehaltsarray initialisiert haben, möchten wir einige Werte hinzufügen. Wir können dies entweder während der Initialisierung wie folgt tun:

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

Oder um es zu einem späteren Zeitpunkt so zu machen:

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

Visuelleres Beispiel für die Array-Erstellung: Geben Sie hier die Bildbeschreibung ein

Weitere Informationen zu Arrays finden Sie in der Anleitung .

Johnny
quelle