Eigentlich kann ich nicht verstehen, was der Unterschied zwischen einem No-Arg-Konstruktor und einem Standardkonstruktor ist.
import javax.swing.*;
public class Test extends JFrame {
public Test() {
super();
this.setSize(200,200);
this.setVisible(true);
}
public static void main(Sting[] arg) {
Test cFrame = new Test();
}
}
Ruft dies den Standardkonstruktor dieser Klasse auf, während das Testobjekt namens cFrame erstellt wird?
Der default
-Konstruktor ist ein No-Args-Konstruktor, den der Java-Compiler in Ihrem Namen einfügt. Es enthält einen default
-Aufruf an super();
(nicht supper()
), was das Standardverhalten ist. Wenn Sie einen Konstruktor implementieren, erhalten Sie keinen Standardkonstruktor mehr.
JLS-8.8.9. Default Constructor sagt (teilweise),
Wenn eine Klasse keine Konstruktordeklarationen enthält, wird implizit ein Standardkonstruktor ohne formale Parameter und ohne throws-Klausel deklariert.
Wenn die deklarierte Klasse die ursprüngliche Klasse Object ist, hat der Standardkonstruktor einen leeren Körper. Andernfalls ruft der Standardkonstruktor den Superklassenkonstruktor einfach ohne Argumente auf.
default constructor
ist ein Konstruktor, den der Java-Compiler Ihrem Code hinzufügt, wenn kein expliziter Konstruktor verfügbar ist .. Der Standardkonstruktor ruft den Konstruktor der übergeordneten Klasse ohne Argumente auf.
Wenn Sie einen eigenen Konstruktor hinzugefügt haben (unabhängig davon, ob es sich um Parameter oder um Parameter handelt), fügt der Compiler in diesem Fall keinen Standardkonstruktor hinzu.
Was ist ein Standardkonstruktor?
Es ist ein Konstruktor, der vom Compiler hinzugefügt wird, wenn Sie keinen Konstruktor definiert haben.
Wenn Ihre Klasse bereits über einen Konstruktor verfügt, wird der Standardkonstruktor nicht vom Compiler hinzugefügt.
In Ihrem Fall haben Sie also den Konstruktor,
public Test(){
super();
this.setSize(200,200);
this.setVisible(true);
}
Daher gibt es jetzt keinen Standardkonstruktor, der von der JVM aufgerufen werden kann.
Antwort ist Nein. Referenzvariable cFrame ruft den Konstruktor Test () ohne Argon auf, nicht den Standardkonstruktor. Während der Test () - Konstruktor den Nicht-Argon-Konstruktor der JFrame-Klasse (Parent) usw. auffindet, ruft er auf. Wenn nicht explizit deklariert, stellt der Java-Compiler einen nicht parametrisierten Konstruktor bereit, d. H. Einen Standardkonstruktor. Dieser Standardkonstruktor ruft den nicht parametrisierten Konstruktor seiner übergeordneten Klasse auf. Er initialisiert Klassenvariablen mit ihren Standardwerten.
Z.B:
Class Base {}
Class Derived extends Base {} // Default constructor of class "Derived" will automatically calls non-arg constructor of class "Base" and intialzes value to the variables
Ein Konstruktor, der kein Argument ist, wird nur von einem Programmierer definiert. Es kann auch die Variablen initialisieren. Ein weiterer Punkt, der hier hinzugefügt werden muss, ist, dass der Aufruf von super () automatisch vom Java-Compiler hinzugefügt wird, wenn in abgeleiteter Klasse Super () nicht gefunden wird.
Z.B:
Class Base {
int y;
public Base() {
}
public int getY() {
return y;
}
}
public class Derived extends Base {
private int x;
public Derived() { //super() will be automatically used
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
}
Derived d = new Derived();
System.out.println("Base x value => " + d.getX());
System.out.println("Base y value => " + d.getY());
Result:
Base x value => 0 // Default value to its primitive datatype(In this case: int)
Base y value => 0
Antwort auf Ihre Frage ist Nein. Java stellt keinen Standardkonstruktor bereit, wenn Sie irgendeine Art Konstruktor in die Klasse schreiben.
Ein Unterschied besteht darin, dass der Körper des Standardkonstruktors immer leer ist, wohingegen wir unseren eigenen Code in den Konstruktor no-arg einfügen können.