2016-04-04 22 views
0

Wenn ich keinen Konstruktor zur Verfügung stelle, wird der Compiler einen Standardkonstruktor für die Klasse erstellen.Standardkonstruktor in Klassendatei

Wird dieser Standardkonstruktor in der Klassendatei vorhanden sein?

Wenn es nicht vorhanden ist, dann wie die VM die Klassendatei ausführen und Objekt für die Klasse erstellen?

Update 1:

ich eine Klassendatei erstellt haben

public class ConstructorExp { 
    public static void main(String[] args){ 
    ConstructorExp e = new ConstructorExp(); 
    } 
} 

Mit Hilfe von Decompiler ich die Klassendatei dekompilierten,

/* 
* Decompiled with CFR 0_114. 
*/ 
public class ConstructorExp { 
    public static void main(String[] arrstring) { 
    ConstructorExp constructorExp = new ConstructorExp(); 
    } 
} 

Wie Sie sehen, gibt es kein Standardkonstruktor!

+0

es ist in Klassendatei – silentprogrammer

+0

es ausprobieren, eine Klasse ohne Konstruktor erstellen, kompilieren, dann ein externam-Programm verwenden, um es zu dekompilieren. –

+0

@All: Bitte lesen Sie mein Update – Lathy

Antwort

3

Wird dieser Standardkonstruktor in der Klassendatei vorhanden sein?

Ja wird es.

Sie können dies selbst überprüfen, indem Sie eine Klasse mit einem Standardkonstruktor erstellen, kompilieren und dann mit dem javap Dienstprogramm untersuchen, das in Ihrem JDK enthalten ist.

Folgendes passiert, wenn ich es mache.

[[email protected] tmp]$ cat Test.java 
public class Test {} 
[[email protected] tmp]$ javac Test.java 
[[email protected] tmp]$ javap -c Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 
} 
[[email protected] tmp]$ 

QED


Mit Hilfe von Decompiler, dekompilierten ich die Klassendatei [und es gibt keinen Standard-Konstruktor in der Ausgabe]

Interessant. Das beweist aber nichts .

Was tatsächlich passiert ist, dass die Decompiler:

  • die mit einem Körper nicht-args Konstruktor in der .class-Datei sieht, die super();
  • entspricht sieht es gibt keinen anderen Konstruktor
  • erkennt, dass der Konstruktor als Standardkonstruktor dargestellt werden könnte
  • gibt keinen Quellcode für den Konstruktor ... aus, weil der Code redundant wäre.

1 - ... abgesehen davon, dass der Decompiler ein bisschen schlau ist.

+0

Ich habe deinen Kommentar gelesen, konnte ihn aber nicht verstehen: P – Lathy

+0

Kannst du es jetzt verstehen? –

+0

Stephen: hmmmm Danke! – Lathy

0

Es ist, das ist eines dieser Dinge, die Java tut, wenn es eine .java-Datei in eine .class-Datei kompiliert. Das Gleiche passiert, wenn Sie kein "F" hinter einem Float oder ein "D" hinter einem Double platzieren.

0

Ja wird es.Suchen Sie nach der Antwort unten und kompilieren Sie eine Klasse a ohne Arg-Konstruktor. Sie werden die Antwort finden. Auf jeden Fall wird eine Erklärung gegeben unter

Standardkonstruktoren Wenn Sie eine Klasse ohne Konstruktoren deklarieren, erstellt der Compiler automatisch einen Standardkonstruktor für die Klasse. Ein Standardkonstruktor nimmt keine Parameter (es ist ein Nicht-Arg-Konstruktor) und hat einen leeren Körper. Da der Compiler automatisch einen Standardkonstruktor generiert, wenn Sie keine Konstruktoren explizit deklarieren, haben alle Klassen garantiert mindestens einen Konstruktor. Zum Beispiel, wenn Sie eine CoffeeCup Klasse deklarieren, ohne einen Konstruktor explizit erklärt:

// In Quellpaket in der Datei init/ex6/CoffeeCup.java

class CoffeeCup { 

    private int innerCoffee; 

    public void add(int amount) { 
     innerCoffee += amount; 
    } 
    //... 
} 

Der Compiler wird die gleiche Klassendatei als ob erzeugen Sie hatte erklärt ausdrücklich eine nicht-arg Konstruktor mit einem leeren Körper:

// in Quellpaket in init/EX7 Datei/CoffeeCup.java

class CoffeeCup { 

    private int innerCoffee; 
     public CoffeeCup() { 
    } 

    public void add(int amount) { 
     innerCoffee += amount; 
    } 
    //... 
} 

Der Compiler gi ves Standardkonstruktoren haben die gleiche Zugriffsstufe wie ihre Klasse. Im obigen Beispiel ist die Klasse CoffeeCup öffentlich, daher ist der Standardkonstruktor öffentlich. Wenn CoffeeCup den Paketzugang erhalten hätte, würde dem Standardkonstruktor auch der Paketzugang gewährt werden.

-Link: https://www.artima.com/designtechniques/initializationP.html

+0

Dies beantwortet die Frage nicht wirklich. Die Frage ist sehr spezifisch - schreibt der Compiler Code für den Standardkonstruktor in die ".class" -Datei. –

Verwandte Themen