Tworzenie tablicy obiektów w Javie

Jestem nowy w Javie i na ten czas stworzyłem tablicę obiektów w Javie.

Mam klasę A na przykład -

A[] arr = new A[4];

Ale to tylko tworzenie wskaźników (referencji) do A, a nie 4 obiektów. Czy to prawda? Widzę, że gdy próbuję uzyskać dostęp do funkcji / zmiennych w utworzonych obiektach, dostaję wyjątek wskaźnika null. Aby móc manipulować / uzyskiwać dostęp do obiektów, musiałem to zrobić --

A[] arr = new A[4];
for( int i=0; i<4; i++ )
    arr[i] = new A();
Czy to prawda, czy robię coś nie tak? Jeśli to jest poprawne, to naprawdę dziwne.

EDIT: wydaje mi się to dziwne, ponieważ w C++ po prostu mówisz nowe A[4] i tworzy cztery obiekty.

Author: chamina, 2011-03-19

7 answers

To jest poprawne.

A[] a = new A[4];

Tworzy odniesienia 4 A, podobne do tego

A a1;
A a2;
A a3;
A a4;
Teraz nie mogłeś zrobić a1.someMethod() Bez przypisywania a1 jako
a1 = new A();

Podobnie z tablicą musisz zrobić

a[0] = new A();
Przed użyciem.
 215
Author: MeBigFatGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-30 19:27:51

To jest poprawne. Można też zrobić:

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

Ta składnia może być również używana do tworzenia i inicjalizacji tablicy w dowolnym miejscu, na przykład w argumencie metody:

someMethod( new A[] { new A("args"), new A("other args"), . . } )
 64
Author: Steve B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 18:33:38

Tak, tworzy tylko odwołania, które są ustawione na domyślną wartość null. Dlatego otrzymujesz wyjątek NullPointerException musisz tworzyć obiekty oddzielnie i przypisywać odniesienie. Istnieją 3 kroki tworzenia tablic w Javie -

Declaration - w tym kroku określamy typ danych oraz wymiary tablicy, którą zamierzamy utworzyć. Ale pamiętaj, nie wspominamy jeszcze o rozmiarach wymiarów. Pozostają puste.

Instancjacja – w tym kroku tworzymy tablicę lub przydzielamy pamięć dla tablicy, używając słowa kluczowego new. W tym kroku wymieniamy rozmiary wymiarów tablicy.

Inicjalizacja – tablica jest zawsze inicjalizowana na wartość domyślną typu danych. Ale możemy tworzyć własne inicjacje.

Deklarowanie Tablic W Javie

Tak deklarujemy jednowymiarową tablicę w Javie - {–10]}

int[] array;
int array[];

Wyrocznia zaleca używanie poprzedniej składni do deklarowania tablic. Oto kilka innych przykładów deklaracji prawnych -

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

A oto kilka przykładów nielegalnych deklaracji -

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

Instancja

W ten sposób "tworzymy instancję" lub przydzielamy pamięć dla tablicy -

int[] array = new int[5];

Kiedy JVM napotka słowo kluczowe new, rozumie, że musi przeznaczyć na coś pamięć. I określając int[5], mamy na myśli, że chcemy tablicy ints, rozmiar 5. Tak więc JVM tworzy pamięć i przypisuje odniesienie do nowo przydzielonej pamięci do tablicy, której "odniesienie" typu int[]

Inicjalizacja

Używanie pętli – używanie pętli for do inicjalizacji elementów tablicy jest najczęstszym sposobem uruchomienia tablicy. Nie ma potrzeby uruchamiania pętli for, jeśli chcesz przypisać samą wartość domyślną, ponieważ JVM robi to za Ciebie.

Wszystko W Jednym..! – możemy Zadeklaruj, Utwórz instancję i Zainicjalizuj naszą tablicę za jednym razem. Oto składnia -

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

Tutaj nie wspominamy o rozmiarze, ponieważ JVM widzi, że dajemy 5 wartości.

Tak więc, dopóki nie stworzymy instancji odwołania pozostają null. Mam nadzieję, że moja odpowiedź ci pomogła..! :)

Source - Arrays in Java

 28
Author: Vamsi Sangam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-20 17:18:20

Oto jasny przykład tworzenia tablicy 10 obiektów pracowniczych, z konstruktorem, który przyjmuje parametr:

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
Author: user1923551,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-05 10:14:53

Masz rację. Poza tym, jeśli chcemy stworzyć tablicę o określonym rozmiarze wypełnioną elementami dostarczonymi przez jakąś "fabrykę", od Javy 8 (która wprowadza stream API) możemy użyć tej jednowierszowej:

A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
  • Stream.generate(() -> new A()) jest jak Fabryka dla oddzielnych elementów a utworzonych w sposób opisany przez lambda, () -> new A(), która jest implementacją Supplier<A> - opisuje jak każda nowa instancja A powinna być tworzona.
  • limit(4) ustawia ilość elementów, które będą Wygeneruj
  • toArray(A[]::new) (może być również przepisana jako toArray(size -> new A[size])) - pozwala nam zdecydować/opisać typ tablicy, która ma zostać zwrócona.

Dla niektórych prymitywnych typów można użyć DoubleStream, IntStream, LongStream które dodatkowo zapewniają Generatory takie jak range rangeClosed i kilka innych.

 2
Author: Pshemo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 17:03:24

Tak jest poprawne w Javie istnieje kilka kroków, aby utworzyć tablicę obiektów:

  1. Deklarowanie i tworzenie instancji (tworzenie pamięci do przechowywania '4' obiektów):

    A[ ] arr = new A[4];
    
  2. Inicjalizacja obiektów (w tym przypadku można zainicjalizować 4 obiekty klasy A)

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

    Lub

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

Teraz możesz zacząć wywoływać istniejące metody z utworzonych obiektów itd.

Na przykład:

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

Lub

  arr[1].setNumber(x);
 0
Author: Jeremy Levett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-09 21:27:35

Dla klasy generic konieczne jest utworzenie klasy wrapper. Na Przykład:

Set<String>[] sets = new HashSet<>[10]
Nie można utworzyć tablicy generycznej.]}

Użyj zamiast:

        class SetOfS{public Set<String> set = new HashSet<>();}
        SetOfS[] sets = new SetOfS[10];  
 0
Author: SzB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-22 15:41:18