wake-up-neo.com

Unterschied zwischen einem No-Arg-Konstruktor und einem Standardkonstruktor in Java

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?

17
amila isura

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. 

22
Elliott Frisch

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.

7
Abhishek

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.

5
Code Geek

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
2
blueberry

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.

0
Raman Keswani