it-swarm.com.de

Erstellen eines Arrays von Objekten in Java

Ich bin neu in Java und habe vorerst ein Array von Objekten in Java erstellt. 

Ich habe zum Beispiel eine Klasse A - 

A[] arr = new A[4];

Hierbei werden jedoch nur Zeiger (Verweise) auf A und nicht auf 4 Objekte erstellt. Ist das richtig? Ich sehe, wenn ich versuche, auf Funktionen/Variablen in den erstellten Objekten zuzugreifen, bekomme ich eine Nullzeiger-Ausnahme. Um die Objekte manipulieren zu können, musste ich dies 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 merkwürdig.

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

164
user220201

Das ist richtig.

A[] a = new A[4];

erstellt 4 A-Referenzen, ähnlich wie dies geschieht

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

jetzt können Sie a1.someMethod () nicht ausführen, ohne a1 als zuzuweisen

a1 = new A();

in ähnlicher Weise mit dem Array, das Sie tun müssen

a[0] = new A();

bevor Sie es verwenden.

230
MeBigFatGuy

Das ist richtig. Sie können auch tun:

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

Diese Syntax kann auch zum Erstellen und Initialisieren eines Arrays verwendet werden, beispielsweise in einem Methodenargument:

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

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

Deklaration - In diesem Schritt geben wir den Datentyp und die Abmessungen des Arrays an, das wir erstellen werden. Denken Sie jedoch daran, dass wir die Größengrößen noch nicht erwähnen. Sie bleiben leer.

Instantiation - In diesem Schritt erstellen Sie das Array oder weisen Speicher für das Array zu, indem Sie das neue Schlüsselwort verwenden. In diesem Schritt erwähnen wir die Größen der Array-Abmessungen.

Initialisierung - Das Array wird immer mit dem Standardwert des Datentyps initialisiert. Wir können jedoch eigene Initialisierungen vornehmen.

Arrays in Java deklarieren

So deklarieren wir ein eindimensionales Array in Java -

int[] array;
int array[];

Oracle empfiehlt, dass Sie die vorherige Syntax zum Deklarieren von Arrays verwenden. Hier einige weitere Beispiele für gesetzliche 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!

Instantiation

So „instanziieren“ oder Speicher für ein Array zuweisen -

int[] array = new int[5];

Wenn die JVM auf das Schlüsselwort new stößt, erkennt sie, dass sie Speicher für etwas reservieren muss. Und mit 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, die eine "Referenz" vom Typ int[] ist.

Initialisierung

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

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

Die Größe wird hier nicht erwähnt, da JVM erkennen kann, dass wir 5 Werte angeben.

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

Source - Arrays in Java

29
Vamsi Sangam

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

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);
    }
}
5
user1923551

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

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 Weise erstellt wurden, die von Lambda, () -> new A(), der Implementierung von Supplier<A>, beschrieben wird, und beschreibt, wie jede neue A-Instanz erstellt werden soll. 
  • limit(4) legt die Anzahl der Elemente fest, deren Stream generieren wird
  • toArray(A[]::new) (kann auch als toArray(size -> new A[size]) umgeschrieben werden) - Hiermit können wir den Typ des Arrays festlegen/beschreiben, der zurückgegeben werden soll.

Für einige Grundtypen können Sie DoubleStream, IntStream, LongStream verwenden, die zusätzlich Generatoren wie rangerangeClosed und einige andere bereitstellen. 

3
Pshemo

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

  1. Deklarieren und dann Instantiieren (Speicher erstellen, um '4'-Objekte zu speichern):

    A[ ] arr = new A[4];
    
  2. Objekte initialisieren (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();
    

Nun können Sie mit den soeben erstellten Objekten bereits vorhandene Methoden aufrufen usw.

Zum Beispiel:

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

oder

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

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

type arrayName[] = new type[numberOfElements];

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

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 im Array. Sie können keine Typen in einem Array mischen.

Nachdem wir nun unsere Gehaltsliste 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;

Mehr visuelles Beispiel für die Array-Erstellung:  enter image description here 

Um mehr über Arrays zu erfahren, lesen Sie die Anleitung .

0
Stas

Für eine generische Klasse ist es erforderlich, eine Wrapper-Klasse zu erstellen.

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];  
0
SzB