java默认构造函数

gfttwv5a  于 2021-06-27  发布在  Java
关注(0)|答案(13)|浏览(506)

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

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;
}
mm5n2pyu

mm5n2pyu1#

如果在类中未显式定义至少一个构造函数,则编译器将自动生成默认构造函数。您已经定义了两个,所以您的类没有默认构造函数。
根据java语言规范第三版:
8.8.9默认构造函数
如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数。。。

mw3dktmi

mw3dktmi2#

你好。据我所知,让我澄清一下默认构造函数的概念:
编译器会自动为任何没有构造函数的类提供无参数的默认构造函数。此默认构造函数将调用超类的无参数构造函数。在这种情况下,如果超类没有无参数构造函数,编译器会抱怨,因此必须验证它是否有。如果你的类没有显式的超类,那么它有一个object的隐式超类,这个类没有参数构造函数。
我从java教程中阅读了这些信息。

nkoocmlb

nkoocmlb3#

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

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

如果你添加了任何类型的构造函数,甚至是非参数的,那么你就有了自己的java,不再添加默认的构造函数了。
这是一个非参数构造函数,即使没有父类,也会从父类内部调用super()构造函数(如果您的类没有父类,则将调用object.class构造函数)

class Module{

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

zy1mlcev4#

如果在类中没有定义任何构造函数,则会创建一个默认构造函数。它只是一个没有参数的构造函数,它什么也不做。编辑:除call super()

public Module(){
}
c3frrgcw

c3frrgcw5#

当我们没有为类显式定义构造函数时,java会为类创建一个默认构造函数。它本质上是一个非参数化的构造函数,即它不接受任何参数。
默认构造函数的工作是调用超类构造函数并初始化所有示例变量。如果超类构造函数不存在,那么它会自动将示例变量初始化为零。因此,使用构造函数的目的就是初始化对象的内部状态,这样创建示例的代码将拥有一个完全初始化的、可用的对象。
一旦我们为类定义了自己的构造函数,就不再使用默认构造函数。所以,它们实际上都不是默认的构造函数。

rsl1atfo

rsl1atfo6#

他们两个都不是。如果你定义它,它不是默认值。
默认构造函数是自动生成的无参数构造函数,除非您定义另一个构造函数。任何未初始化的字段都将设置为其默认值。对于您的示例,假设类型是 String , int 以及 int ,并且类本身是公共的:

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

这和

public Module()
{}

就像根本没有构造器一样。但是,如果至少定义一个构造函数,则不会生成默认构造函数。
参考:java语言规范
如果类不包含构造函数声明,则隐式声明没有形式参数和throws子句的默认构造函数。

澄清

从技术上讲,不是构造函数(默认或其他)默认初始化字段。不过,我留下答案是因为
这个问题把默认值搞错了
无论是否包含它们,构造函数都具有完全相同的效果。

eeq64g8w

eeq64g8w7#

一般术语是,如果在对象中不提供任何构造函数,则会自动放置一个无参数构造函数,称为默认构造函数。
如果您确实定义了一个与未提供任何参数时放置的构造函数相同的构造函数,则通常称为无参数构造函数。这只是一个惯例,尽管有些程序员更喜欢将此显式定义的无参数构造函数称为默认构造函数。但是如果我们通过命名,如果我们显式地定义一个,那么它不会使它成为默认值。
根据文件
如果类不包含构造函数声明,则隐式声明没有形式参数和throws子句的默认构造函数。
例子

public class Dog
{
}

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

public class Dog{
    public Dog() {

    }
}

当你创建它的对象

Dog myDog = new Dog();

将调用此默认构造函数。

6pp0gazn

6pp0gazn8#

默认构造函数是指编译器在没有任何程序员定义的构造函数的情况下自动生成的构造函数。
如果程序员没有提供构造函数,编译器将隐式声明一个默认构造函数,该构造函数调用 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
83qze16e

83qze16e9#

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());
    }
}
rvpgvaaj

rvpgvaaj10#

默认构造函数不接受任何参数:

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

    }
}
webghufk

webghufk11#

如果一个类没有程序员提供的任何构造函数,那么java编译器将添加一个带有out参数的默认构造函数,该构造函数将使用super()调用在内部调用超类构造函数。这称为默认构造函数。
在您的例子中,当您以编程方式添加它们时,没有默认的构造函数。如果您没有添加任何构造函数,那么编译器生成的默认构造函数将如下所示。

public Module()
{
   super();
}

注意:在默认构造函数中,它还将添加super()调用,以调用超类构造函数。
添加默认构造函数的目的:
构造函数的职责是初始化示例变量,如果没有示例变量,可以选择从类中删除构造函数。但是,当您继承某个类时,您的类负责调用超类构造函数,以确保超类正确初始化其所有示例变量。
这就是为什么若并没有构造函数,java编译器会添加一个默认构造函数并调用超类构造函数。

rqqzpn5f

rqqzpn5f12#

当您在类中没有定义任何构造函数时,编译器会为您定义一个默认的构造函数,但是当您声明任何构造函数(在您的示例中,您已经定义了一个参数化的构造函数)时,编译器不会为您这样做。
因为在类代码中定义了构造函数,所以编译器并没有创建默认的构造函数。在创建对象时,您调用的是默认对象,它在类代码中不存在。然后代码给出一个编译错误。

r55awzrz

r55awzrz13#

我希望你得到关于哪个是默认构造函数的答案。但我下面的陈述是为了纠正我的评论。
java不会将任何局部变量初始化为任何默认值。因此,如果您正在创建一个类的对象,它将调用默认构造函数并为该对象提供默认值。
默认构造函数根据类型为对象提供默认值,如0、null等。
请参阅下面的链接了解更多详细信息。
https://www.javatpoint.com/constructor

相关问题