Java默认构造函数

ant*_*nis 147 java constructor default-constructor

究竟什么是默认构造函数 - 你能告诉我以下哪一个是默认构造函数,以及它与其他构造函数的区别是什么?

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;
}
Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 239

他们都不是.如果您定义它,它不是默认值.

除非您定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数.任何未初始化的字段都将设置为其默认值.对于您的示例,它看起来像假设类型是String,intint,并且类本身是公共的:

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}
Run Code Online (Sandbox Code Playgroud)

这完全一样

public Module()
{}
Run Code Online (Sandbox Code Playgroud)

和根本没有构造函数完全相同.但是,如果定义至少一个构造函数,则不会生成默认构造函数.

参考:Java语言规范

如果类不包含构造函数声明,则隐式声明没有形式参数且没有throws子句的默认构造函数.

澄清

从技术上讲,默认初始化字段不是构造函数(默认或其他).但是,我留下答案是因为

  • 问题是默认错误,并且
  • 无论是否包含,构造函数都具有完全相同的效果.

  • 你的陈述**它将任何未初始化的字段初始化为默认值**听起来有点模棱两可.即使我们使用显式构造函数(使用args)或甚至提供no arg构造函数,实例变量也始终使用默认值进行初始化.我不认为它与默认构造函数有任何关系. (22认同)
  • @AniketThakur +1它不仅含糊不清,而且是假的; 默认构造函数不会初始化任何内容.正如这里给出的引用所说:"默认构造函数只调用不带参数的超类构造函数".未初始化的字段由本参考文献中描述的其他机制初始化.+1到OrangeDog提供了一个很好的参考. (10认同)
  • @OrangeDog你在规范中看到用户定义的没有参数的nullary构造函数的语句不被称为默认构造函数? (2认同)
  • 我实际上只是在OCA认证考试中遇到了"默认构造函数是否初始化类的实例成员"的问题,答案是否定的. (2认同)
  • @Gab是好人,它被称为"无争论"或"无争论"构造函数. (2认同)

Jim*_*Jim 33

如果未在类中定义任何构造函数,则会创建默认构造函数.它只是一个没有参数的构造函数.编辑:除了调用super()

public Module(){
}
Run Code Online (Sandbox Code Playgroud)

  • @Sergey这似乎与维基百科一样不同意http://download.oracle.com/javase/tutorial/java/javaOO/constructors.html. (8认同)
  • [与Java语言规范一样](http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.8.9)!我没有意识到术语中Java和C++之间存在这样的差异. (4认同)
  • 为了使它明确:如果你编写自己的构造函数,java将不会创建默认的构造函数.因此,如果你需要一个带参数的构造函数和一个没有参数的构造函数(比如默认的构造函数),那么你必须同时写两个! (3认同)
  • 还应该注意的是,如果超类*没有*无参数构造函数,则子类不能具有默认构造函数(因为Java不知道如何使用默认情况下存在的构造函数). (2认同)

小智 19

如果您没有在类中明确定义至少一个构造函数,则编译器会自动生成默认构造函数.你已经定义了两个,所以你的类没有默认的构造函数.

Java语言规范第三版:

8.8.9默认构造函数

如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数...


小智 18

你好.据我所知,让我清楚默认构造函数的概念:

编译器自动为没有构造函数的任何类提供无参数的默认构造函数.此默认构造函数将调用超类的无参数构造函数.在这种情况下,如果超类没有无参数构造函数,编译器将会抱怨,因此您必须验证它是否存在.如果你的类没有显式的超类,那么它有一个隐式的超类Object,它有一个无参数的构造函数.

我从Java教程中读到了这些信息.


小智 7

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你永远不应该这样做,而是在"默认"构造函数中编写这个`this(10,10,10);`它将在你的第一个构造函数中调用第二个构造函数,这将使你的代码更清晰,更容易理解,重构. (3认同)

Ani*_*kur 6

一般术语是,如果您不在对象中提供任何构造函数,则会自动放置一个名为default constructor的无参数构造函数.

如果你确实定义了一个与放置的构造函数相同的构造函数,如果你不提供它,它通常被称为无参数构造函数.虽然有些程序员喜欢将此显式定义的无参数构造函数称为默认构造函数,但这是一个约定.但是,如果我们通过命名,如果我们明确定义一个,而不是它默认.

按照文档

如果类不包含构造函数声明,则隐式声明没有形式参数且没有throws子句的默认构造函数.

public class Dog
{
}
Run Code Online (Sandbox Code Playgroud)

将自动修改(通过添加默认构造函数),如下所示

public class Dog{
    public Dog() {

    }
} 
Run Code Online (Sandbox Code Playgroud)

当你创建它的对象时

 Dog myDog = new Dog();
Run Code Online (Sandbox Code Playgroud)

调用此默认构造函数.


Yer*_*lem 5

默认构造函数是指在没有任何程序员定义的构造函数的情况下由编译器自动生成的构造函数。

如果程序员没有提供构造函数,编译器会隐式声明一个默认构造函数,该构造函数调用super(), ,没有 throws 子句,也没有形式参数。

例如

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
Run Code Online (Sandbox Code Playgroud)