2016-04-26 13 views
1

aufgerufen werden Ich bin wenig verwirrt über static methods und Objekterstellung in Java.Wie Objekterstellung oder Konstruktoren implizit in Java

Wie wir wissen, können wir auf statische Mitglieder in der statischen Methode wie hier zugreifen.

public static void main(String[] args){ 
// only static method from outside (without any object) 
} 

Aber meine dumme Frage ist, warum Java dies zulassen?

Ich weiß, die obige Aussage ist ähnlich zu deklarieren lokale Variable in der statischen Methode.

public static void main(String[] args){ 
int a = 3; 
} 

Aber ich bin etwas verwirrt über Konstruktor.

+0

Der 'new' Operator erstellt das Objekt vor dem Aufruf der Konstruktor für das Objekt:

... new myClass(i, j, k); ... 

kann durch das folgende implementiert werden. Daher wird der Konstruktor für ein vorhandenes Objekt ausgeführt, nicht statisch für eine Klasse. –

+0

@AndreasFester dann, warum die meisten Leute sagen, wir rufen Konstruktor von diesem 'new Object();' –

+1

Aber das ist, was ich gesagt habe - Sie können die Objekterstellung als ein zweistufiger Prozess behandeln, der von 'new' durchgeführt wird. Siehe die Antwort von @PeterLawrey. –

Antwort

2

In Bytecode, Ihre main() Methode sieht wie folgt aus (Ergebnis der javap -c Main.class Befehl):

public static void main(java.lang.String[]); 
    Code: 
     0: new   #3     // class java/lang/Object 
     3: dup 
     4: invokespecial #8     // Method java/lang/Object."<init>":()V 
     7: astore_1 
     8: return 

Wie Sie sehen können, an der Stelle 0, die new Befehl ausgeführt wird. Dann wird der Konstruktor an Position 4 für das neu erstellte Objekt aufgerufen.

4.10.2.4:

Dies spiegelt sich auch in der Java Virtual Machine Specification angegeben. Instanzinitialisierungsmethoden und neu erstellte Objekte

Das Erstellen einer neuen Klasseninstanz ist ein mehrstufiger Prozess. Die Aussage:

... 
new #1   // Allocate uninitialized space for myClass 
dup    // Duplicate object on the operand stack 
iload_1   // Push i 
iload_2   // Push j 
iload_3   // Push k 
invokespecial #5 // Invoke myClass.<init> 
... 
+0

Wie kann ich diesen Code meiner Klasse sehen? irgendein Befehl in CMD? –

+1

Sie können auch sehen, dass der Konstruktor die interne Signatur '' mit dem Rückgabetyp 'void' hat. +1 –

+1

@LetDoit Verwenden Sie 'javap -c -v' Die meisten IDEs haben einen Bytecode-Viewer. –

2

Konstruktoren sind nicht statisch. Sie werden für die Instanz aufgerufen, die Sie gerade erstellt haben. In Byte Code was passiert.

  1. Ein neues Objekt wird erstellt, aber es wird nicht inilialisiert.
  2. Der Konstruktor wird für dieses Objekt aufgerufen. Im Konstruktor this wird das Objekt initialisiert.
+0

'Ein neues Objekt wird erstellt, aber es wird nicht inilialisiert. 'In Byte-Code? Objekt bereits erstellt? oder wenn wir 'neu' nennen? –

+2

ja, nein, ja. Wenn wir 'new' verwenden, wird ein neues Objekt erstellt, nachdem das Objekt erstellt wurde, wird es im Konstruktor initialisiert. –

+0

sind äußere Klassen implizit statisch? –

Verwandte Themen