2016-08-20 13 views
17
RealEstate v = new RealEstate(); 

Użyłem tego słowa kluczowego new z RealEstate(). Wiem, że new przydziela pamięć i inicjuje pamięć za pomocą konstruktora klasy RealEstate.Co robi maszyna JVM, gdy operator "nowy" inicjuje pamięć za pomocą konstruktora?

Co robi JVM tutaj?

+6

Nie mam ochoty, aby to pytanie miało 6 zniżek, najprawdopodobniej spadkowcy nie rozumieli, o co naprawdę prosił OP. Mamy nadzieję, że 6 użytkowników walczyło z przeciwnościami. –

+0

tak dokładnie @ Jean-FrançoisSavard –

+0

Twoje pytanie zawiera własną odpowiedź. Niejasne, o co pytasz. – EJP

Odpowiedz

13

new Operator nie korzysta z pomocy konstruktora do przydzielenia pamięci. Nie ma to nic wspólnego z konstruktorem. Basically Java's version of malloc is new.

new operatora:

  • przydziela pamięci dla obiektu
  • wywołuje konstruktora obiektu
  • powraca odniesienie do tej pamięci

konstruktor jest wykonywany oddzielnie, aby wykonać wszelkie czynności podczas inicjalizacji jak przydzielanie wartości do obiektów i zmiennych. Jeśli nie Konstruktor jest zdefiniowany, wówczas kompilator stworzy domyślnego konstruktora i przydzieli domyślne wartości:


Poniższa tabela zawiera zestawienie wartości domyślne dla różnych typów danych. source

Data Type Default Value (for fields) 
byte   0 
short   0 
int    0 
long   0L 
float   0.0f 
double   0.0d 
char   '\u0000' 
String   null 
any object  null 
boolean   false 

Więc new operator przydziela tylko pamięć i zwraca referencję do tej pamięci.

Zobacz documentation:

Nowy operator instancję klasy poprzez przydzielanie pamięci dla nowego obiektu i zwracanie odniesienie do tej pamięci. Nowy operator wywołuje również konstruktor obiektu.

+8

Nie, Java nie używa malloc dla każdego obiektu. W rzeczywistości jest to znacznie mniej narzut przez zasadniczo zwiększenie wskaźnika w regionie o nazwie TLAB (bufor lokalny wątku). To, co dzieje się dalej, jest określone w specyfikacji języka Java, włączając w to uruchamianie inicjalizatorów i konstruktorów hierarchii klas. Przed tym wszystkim konstruowana jest również klasa actuall dla obiektu. https://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5 – eckes

+1

Przydziela pamięć * pierwszy *, a następnie wywołuje konstruktor, a następnie zwraca odwołanie. Domyślny konstruktor jest tworzony przez kompilator, a nie przez JVM. Pominięto wartości domyślne dla pól całkowitych i nie ma potrzeby podawania wartości domyślnej dla 'String', który jest po prostu kolejnym obiektem. Cytowane stwierdzenie pochodzi z Samouczka języka Java, a nie z "dokumentacji". Właściwą rzeczą do przytoczenia jest specyfikacja języka Java. – EJP

+0

@EJP Chciałbym tylko wskazać główne operacje wykonywane podczas inicjalizacji. To nie była dokładna kolejność, w jakiej są wykonywane. W każdym razie, dzięki za powiadomienie, odpowiednio zaktualizowałem swoją odpowiedź. Jeśli chodzi o * domyślne zestawienie wykresu wartości *, to wie, że nie jest to żadna właściwa dokumentacja, ale mimo wszystko nadal pochodzi z [oracle] (http://docs.oracle.com/javase/tutorial/java) /nutsandbolts/datatypes.html). więc myślę, że można mu ufać. –