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.
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.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"), . . } )
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ącint[5]
, mamy na myśli, że chcemy tablicyint
s, rozmiar 5. Tak więc JVM tworzy pamięć i przypisuje odniesienie do nowo przydzielonej pamięci do tablicy, której "odniesienie" typuint[]
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
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);
}
}
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 jakotoArray(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.
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:
-
Deklarowanie i tworzenie instancji (tworzenie pamięci do przechowywania '4' obiektów):
A[ ] arr = new A[4];
-
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);
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];
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