Java默认构造函数

时间:2010-12-20 10:24:16

标签: 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;
}

13 个答案:

答案 0 :(得分:231)

他们两个都没有。如果你定义它,它不是默认值。

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

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

这与

完全相同
public Module()
{}

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

参考:Java Language Specification

  

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

澄清

从技术上讲,默认初始化字段不是构造函数(默认或其他)。但是,我正在给它答案,因为

  • 问题是默认错误,
  • 构造函数具有完全相同的效果,无论它们是否包括在内。

答案 1 :(得分:31)

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

public Module(){
}

答案 2 :(得分:19)

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

Per Java语言规范第三版

  

8.8.9默认构造函数

     

如果一个类不包含构造函数   声明,然后默认   不带参数的构造函数   自动提供......

答案 3 :(得分:17)

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

  

编译器自动提供无参数的默认构造函数   对于没有构造函数的任何类。这个默认构造函数将调用   超类的无参数构造函数。在这种情况下,   如果超类没有无参数,编译器会抱怨   构造函数,所以你必须验证它。如果你的班级没有   显式超类,然后它有一个隐式超类Object,   它有一个无参数的构造函数。

我从Java Tutorials

中读取了这些信息

答案 4 :(得分: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());
    }
}

答案 5 :(得分:6)

一般术语是如果你没有在你的对象中提供任何构造函数,那么会自动放置一个名为default constructor的无参数构造函数。

如果你确实定义了一个与放置的构造函数相同的构造函数,如果你不提供任何构造函数,它通常被称为无参数构造函数。虽然有些程序员喜欢调用这个显式定义的没有参数构造函数,但它只是一个约定。默认构造函数。但是如果我们通过命名,如果我们明确定义一个,那么它不会使它成为默认值。

根据docs

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

实施例

public class Dog
{
}

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

public class Dog{
    public Dog() {

    }
} 

当你创建它的对象时

 Dog myDog = new Dog();

调用此默认构造函数。

答案 6 :(得分:3)

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

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

E.g。

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

答案 7 :(得分:2)

如果一个类没有程序员提供的任何构造函数,那么java编译器将添加一个带有out参数的默认构造函数,这些参数将在内部使用super()调用调用超类构造函数。这称为默认构造函数。

在您的情况下,没有默认构造函数,因为您以编程方式添加它们。 如果您没有添加构造函数,那么编译器生成的默认构造函数将如下所示。

public Module()
{
   super();
}

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

添加默认构造函数的目的:

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

这就是为什么如果没有构造函数,java编译器将添加一个默认构造函数并调用超类构造函数。

答案 8 :(得分:1)

当我们没有为类明确定义构造函数时,java会为该类创建一个默认构造函数。它本质上是一个非参数化的构造函数,即它不接受任何参数。

默认构造函数的工作是调用超类构造函数并初始化所有实例变量。如果超类构造函数不存在,那么它会自动将实例变量初始化为零。因此,这有助于使用构造函数,即初始化对象的内部状态,以便创建实例的代码将具有完全初始化的可用对象。

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

答案 9 :(得分:0)

默认构造函数不带任何参数:

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

    }
}

答案 10 :(得分:0)

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

由于您已在类代码中定义了构造函数,因此编译器不会创建默认构造函数。创建对象时,您要调用默认代码,而默认代码在类代码中是不存在的。然后代码给出了编译错误。

答案 11 :(得分:0)

创建新的Module对象时,Java编译器会为您添加一个默认构造函数,因为根本没有构造函数。

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

如果您添加任何类型的构造函数,甚至是非arg构造函数,那么您都可以拥有Java以外的东西,并且不再添加默认构造函数。

这是一个非arg构造函数,即使您没有父构造函数,也可以从其父类内部调用super()构造函数。 (如果您的类没有父类,那么将调用Object.Class构造函数)

    class Module{

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

答案 12 :(得分:-2)

我希望你得到关于哪个是默认构造函数的答案。 但我在下面的陈述中更正给出的评论。

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

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

  •   

请参阅以下链接了解更多详情。

https://www.javatpoint.com/constructor