Java默认构造函数
什么是一个默认的构造函数 – 你能告诉我哪一个是一个默认的构造函数,以及与其他构造函数有什么不同?
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; }
他们都不是。 如果你定义它,这不是默认的。
默认的构造函数是自动生成的无参构造函数,除非您定义了另一个构造函数。 它将任何未初始化的字段初始化为默认值。 对于你的例子,它将看起来像这样,假设types是String
, int
和int
:
public Module() { super(); this.name = null; this.credits = 0; this.hours = 0; }
这完全一样
public Module() {}
和完全没有构造函数一样。 但是,如果至less定义了一个构造函数,则不会生成默认的构造函数。
参考: Java语言规范
澄清
从技术上讲,它不是构造函数(默认或其他),默认初始化字段。 但是,我将这个答案留作答案
- 问题得到了默认错误和
- 包括他们或不,构造函数具有完全相同的效果。
如果您没有在类中定义任何构造函数,则会创build一个默认的构造函数。 它只是一个没有任何参数的构造函数。 编辑:除了调用super()
public Module(){ }
如果你没有在你的类中至less定义一个构造函数,那么默认的构造函数是由编译器自动生成的。 你已经定义了两个,所以你的类没有默认的构造函数。
根据Java语言规范第三版 :
8.8.9默认构造函数
如果一个类不包含构造函数声明,那么将自动提供一个不带参数的默认构造函数。
你好。 根据我的知识,让我清除默认构造函数的概念:
编译器自动为任何没有构造函数的类提供一个无参数的默认构造函数。 这个默认构造函数将调用超类的无参构造函数。 在这种情况下,如果超类没有没有参数的构造函数,编译器会报错,所以你必须validation它是否有效。 如果你的类没有显式的超类,那么它有一个Object的隐式超类,它有一个无参数的构造函数。
我从Java教程中阅读这些信息。
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()); } }
一般的术语是,如果你没有在你的对象中提供任何构造函数,那么就会自动放置一个叫做默认构造函数的无参数构造函数。
如果你确实定义了一个构造函数,如果你不提供任何构造函数,那么它通常被称为没有参数构造函数。只是一个约定,尽pipe一些程序员喜欢把这个显式定义的没有参数构造函数作为默认构造函数来调用。 但是,如果我们明确地定义一个,而不是默认的。
根据文档
如果一个类不包含构造函数声明,那么隐式声明一个没有forms参数和没有throws子句的默认构造函数。
例
public class Dog { }
会自动被修改(通过添加默认构造函数)如下
public class Dog{ public Dog() { } }
当你创build它的对象
Dog myDog = new Dog();
这个默认的构造函数被调用。
如果一个类没有任何由程序员提供的构造函数,那么java编译器会添加一个带有out参数的默认构造函数,这个参数将在super()调用的内部调用超类构造函数。 这被称为默认构造函数。
在你的情况下,没有默认的构造函数,因为你正在以编程方式添加它们。 如果你没有添加构造函数,那么编译器生成的默认构造函数将如下所示。
public Module() { super(); }
注意 :在默认的构造函数中,它也会添加super()调用,来调用超类的构造函数。
添加默认构造函数的目的:
构造函数的职责是初始化实例variables,如果没有实例variables,您可以select从类中移除构造函数。 但是当你inheritance一些类时,你需要调用超类的构造函数来确保超类正确地初始化所有的实例variables。
这就是为什么如果没有构造函数,java编译器将添加一个默认构造函数并调用超类构造函数。
默认的构造函数不带任何参数:
public class Student { // default constructor public Student() { } }
当我们没有明确定义一个类的构造函数时,java为这个类创build一个默认的构造函数。 它本质上是一个非参数化的构造函数,即它不接受任何参数。
默认构造函数的工作是调用超类构造函数并初始化所有实例variables。 如果超类构造函数不存在,那么它会自动初始化实例variables为零。 所以,这就是使用构造函数的目的,即初始化对象的内部状态,以便创build实例的代码将具有完全初始化的可用对象。
一旦我们为类定义了我们自己的构造函数,就不再使用默认的构造函数。 所以,他们都不是一个默认的构造函数。
我希望你得到你的答案是哪个是默认的构造函数。 但是我在下面给出的陈述来纠正给出的意见。
Java不会将任何局部variables初始化为任何默认值。 所以,如果你正在创build一个类的对象,它会调用默认的构造函数,并提供默认值的对象。
默认构造函数根据types提供默认值,如0,null等。
请参阅下面的链接了解更多详情。
默认构造函数指的是在没有任何程序员定义的构造函数的情况下由编译器自动生成的构造函数。
如果程序员没有提供构造函数,编译器会隐式声明一个调用super()
的默认构造函数,没有throws子句,也没有forms参数。
例如
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