0

我只是想在这里澄清我的概念,所以我问......

如果我为我的类定义了一个显式的参数化构造函数,我是否仍然可以调用 java 编译器提供的默认构造函数(默认情况下为每个类提供)?

还是在这种情况下会导致编译时错误?请解释编译器调用的具体情况!

4

7 回答 7

11

当且仅当 没有提供构造函数时,编译器才会创建无参数构造函数。

JLS 在第 8 章中指出:

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

一个“捕获”是:

如果隐式声明了默认构造函数但超类没有可访问的构造函数(第 6.6 节),该构造函数不接受任何参数并且没有 throws 子句,则这是编译时错误。

于 2012-05-31T04:16:57.710 回答
2

如果您只定义参数化构造函数,那么编译器将不会提供默认构造函数

它会打印一个错误

于 2012-05-31T04:18:31.133 回答
2

8.8.9 默认构造函数

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

  • 如果声明的类是原始类 Object,则默认构造函数的主体为空。
  • 否则,默认构造函数不带参数,只是调用不带参数的超类构造函数

.

于 2012-05-31T04:19:39.717 回答
2

Java 语言规范非常有用,而且实际上很容易阅读。

于 2012-05-31T04:20:22.667 回答
2
  • 对于每个没有任何构造函数的类,java 将自动添加默认构造函数——没有参数。并且没有 args 超级电话。
  • 如果您向类添加至少一个构造函数,则 java 将不包含默认构造函数。
  • 因此,当您尝试不使用 args 构造函数时,会出现编译错误。

除此之外,这可能会导致一些额外的编译错误。测试这段代码。

class A{
  A(int i){}
}

class B extends A{}

class Test{
  PSVM{
    B b = new B();
  }
}

此代码给出编译错误。

B 类没有任何构造函数。所以java会把这样的东西作为默认构造函数。

B(){
  super();
}

但是 A 类(B 类)的 Supper 类没有不带参数的构造函数。所以它会产生编译错误。

因此,最好在您编写的每个类中都有一个无参数构造函数。

于 2012-05-31T04:34:04.147 回答
1

Java 仅为那些没有为它们显式定义构造函数的类提供默认的无参数构造函数。一旦程序员定义了构造函数(即使它是无参数的构造函数),就不会提供默认构造函数。

现在你在问错误:

  • 如果你为你的类定义了一个无参数的构造函数,那么你的类的构造函数的无参数调用将调用这个构造函数并且不会抛出编译器错误
  • 如果您只定义了接受参数的构造函数,那么对类的构造函数的无参数调用将引发编译器错误,因为将不存在无参数构造函数。

建议彻底阅读Java 语言规范

于 2012-05-31T04:34:20.313 回答
1

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

如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只是调用不带参数的超类构造函数。

如果隐式声明了默认构造函数,但超类没有可访问的构造函数,该构造函数不带参数且没有 throws 子句,则这是编译时错误。

在一个类类型中,如果该类被声明为public,那么默认构造函数被隐式地赋予访问修饰符public;如果该类被声明为受保护,则默认构造函数被隐式赋予访问修饰符保护;如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有;否则,默认构造函数具有没有访问修饰符隐含的默认访问权限。

于 2012-05-31T05:08:07.230 回答