爪哇缺省构造函数

缺省构造函数到底是什么ーー你能告诉我下面哪个是缺省构造函数,它与其他构造函数有什么区别吗?

public Module() {
this.name = "";
this.credits = 0;
this.hours = 0;
}


public Module(String name, int credits, int hours) {
this.name = name;
this.credits = credits;
this.hours = hours;
}
478917 次浏览

如果没有在类中定义任何构造函数,就会创建一个缺省构造函数。它只是一个什么都不做的无参数构造函数。编辑: 除了调用 super ()

public Module(){
}

都不是,如果你定义它,它就不是默认值。

缺省构造函数是自动生成的无参数构造函数,除非你定义了另一个构造函数。任何未初始化的字段将被设置为它们的默认值。对于您的示例,假设类型是 Stringintint,并且类本身是公共的,那么它看起来应该是这样的:

public Module()
{
super();
this.name = null;
this.credits = 0;
this.hours = 0;
}

这和

public Module()
{}

完全等同于没有构造函数。但是,如果您至少定义了一个构造函数,则不会生成缺省构造函数。

参考资料: Java 语言规范

如果一个类不包含构造函数声明,那么一个没有形式参数和没有 throw 子句的缺省构造函数就会被隐式声明。

澄清一下

从技术上讲,默认初始化字段的不是构造函数(默认或其他)。但是,我离开它的原因是什么呢

  • 这个问题把默认值搞错了
  • 无论是否包含它们,构造函数都具有完全相同的效果。

缺省构造函数不接受任何论点:

public class Student {
// default constructor
public Student() {


}
}

如果没有在类中显式定义至少一个构造函数,编译器会自动生成一个缺省构造函数。你定义了两个类所以你的类没有缺省构造函数。

每间 Java 语言规范第三版:

8.8.9缺省构造函数

如果类不包含构造函数 声明,然后是默认值 不接受任何参数的构造函数 自动提供..。

Java 提供了一个缺省构造函数,当没有提供显式的构造函数时,它不接受任何参数,也不执行任何特殊的操作或初始化。

隐式缺省构造函数所采取的唯一行动是使用 super ()调用来调用超类构造函数。构造函数参数为您提供了一种为对象的初始化提供参数的方法。

下面是一个包含2个构造函数(一个默认构造函数和一个参数化构造函数)的多维数据集类的示例。

public class Cube1 {
int length;
int breadth;
int height;
public int getVolume() {
return (length * breadth * height);
}


Cube1() {
length = 10;
breadth = 10;
height = 10;
}


Cube1(int l, int b, int h) {
length = l;
breadth = b;
height = h;
}


public static void main(String[] args) {
Cube1 cubeObj1, cubeObj2;
cubeObj1 = new Cube1();
cubeObj2 = new Cube1(10, 20, 30);
System.out.println("Volume of Cube1 is : " + cubeObj1.getVolume());
System.out.println("Volume of Cube1 is : " + cubeObj2.getVolume());
}
}

一般的术语是,如果你没有在你的对象中提供任何构造函数,一个无参数的构造函数会自动被放置,这个构造函数叫做缺省构造函数。

如果你定义了一个构造函数,如果你没有提供任何参数,它通常被称为无参数构造函数。这只是一个约定,尽管有些程序员更喜欢把这个明确定义的没有参数的构造函数叫做缺省构造函数。但是,如果我们通过命名,如果我们明确地定义了一个比它不使它默认。

根据 医生

如果一个类不包含构造函数声明,那么一个没有形式参数和没有 throw 子句的缺省构造函数就会被隐式声明。

例子

public class Dog
{
}

将自动修改(通过添加缺省构造函数)如下

public class Dog{
public Dog() {


}
}

当你创建它的对象时

 Dog myDog = new Dog();

这个缺省构造函数。

嗨,根据我的了解,让我来澄清一下缺省构造函数的概念:

编译器会自动提供一个没有参数的缺省构造函数 对于任何没有构造函数的类,这个缺省构造函数将调用 超类的无参数构造函数。在这种情况下, 如果超类没有无参数,编译器就会报警 构造函数,所以必须验证它是否存在。如果类没有 显式的超类,那么它有一个对象的隐式的超类, 它有一个无参数的构造函数。

我从 Java 教程上读到了这个信息。

如果一个类没有任何由程序员提供的构造函数,那么 java 编译器将添加一个没有 out 参数的缺省构造函数,这个参数将通过 super ()调用在内部调用 super class 构造函数。这叫做缺省构造函数。

在您的例子中,没有缺省构造函数,因为您是以编程方式添加它们的。 如果你没有添加任何构造函数,那么编译器生成的缺省构造函数就是这样的。

public Module()
{
super();
}

注意 : 在缺省构造函数中,它还会添加 super ()调用,以调用 super 类构造函数。

增加缺省构造函数的目的:

构造函数的职责是初始化实例变量,如果没有实例变量,您可以选择从类中删除构造函数。但是,当您继承某个类时,调用超类构造函数以确保超类正确地初始化其所有实例变量是您的类的责任。

这就是为什么如果没有构造函数,java 编译器会添加一个缺省构造函数并调用 super 类构造函数。

如果我们没有为一个类明确定义一个构造函数,那么 java 就会为这个类创建一个缺省构造函数。它本质上是一个非参数化的构造函数,也就是说,它不接受任何参数。

缺省构造函数的工作是调用 super 类构造函数并初始化所有实例变量。如果超类构造函数不存在,那么它会自动将实例变量初始化为零。因此,这就达到了使用构造函数的目的,即初始化对象的内部状态,以便创建实例的代码将拥有一个完全初始化的、可用的对象。

一旦我们为类定义了自己的构造函数,缺省构造函数就不再使用了。所以他们都不是缺省构造函数。

缺省构造函数是指编译器在没有程序员定义的构造函数的情况下自动生成的构造函数。

如果没有程序员提供的构造函数,编译器就会隐式地声明一个调用 super()的缺省构造函数,它没有 throw 子句,也没有形式参数。

例如。

class Klass {
// Default Constructor gets generated
}


new Klass();  // Correct
-------------------------------------


class KlassParameterized {


KlassParameterized ( String str ) {   //// Parameterized Constructor
// do Something
}
}


new KlassParameterized(); //// Wrong  - you need to explicitly provide no-arg constructor. The compiler now never declares default one.




--------------------------------


class KlassCorrected {


KlassCorrected (){    // No-arg Constructor
/// Safe to Invoke
}
KlassCorrected ( String str ) {   //// Parameterized Constructor
// do Something
}
}


new KlassCorrected();    /// RIGHT  -- you can instantiate

我希望你已经知道哪个是缺省构造函数了。 但是,我在下面的发言中更正了这些评论。

  • Java 不会将任何局部变量初始化为任何默认值 如果您正在创建类的 Object,它将调用 default 构造函数,并向对象提供默认值。

  • 缺省构造函数为对象提供默认值,如0, 等等,这取决于类型。

详情请参阅以下连结。

Https://www.javatpoint.com/constructor

当您没有在类中定义任何构造函数时,编译器会为您定义默认构造函数,但是当您声明任何构造函数(在您的示例中您已经定义了参数化构造函数)时,编译器不会为您定义默认构造函数。

因为您已经在类代码中定义了构造函数,所以编译器没有创建默认构造函数。在创建对象时,您调用的是默认对象,而默认对象在类代码中不存在。然后代码给出一个编译错误。

当你创建一个新的 Module 对象时,java 编译器会为你添加一个缺省构造函数,因为根本没有构造函数。

class Module{} // you will never see the default constructor

如果你添加任何类型的构造函数 even 和 non-arg one,比 java 的东西你有你自己的,不再添加一个缺省构造函数。

这是一个非 arg 构造函数,它在内部调用父类中的 super ()构造函数,即使您没有这样的构造函数。(如果类的父类不是 Object。将调用类构造函数)

    class Module{


Module() {} // this look like a default constructor but in not.
}