我只是想在这里澄清我的概念,所以我问......
如果我为我的类定义了一个显式的参数化构造函数,我是否仍然可以调用 java 编译器提供的默认构造函数(默认情况下为每个类提供)?
还是在这种情况下会导致编译时错误?请解释编译器调用的具体情况!
我只是想在这里澄清我的概念,所以我问......
如果我为我的类定义了一个显式的参数化构造函数,我是否仍然可以调用 java 编译器提供的默认构造函数(默认情况下为每个类提供)?
还是在这种情况下会导致编译时错误?请解释编译器调用的具体情况!
当且仅当 没有提供构造函数时,编译器才会创建无参数构造函数。
JLS 在第 8 章中指出:
如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有 throws 子句的默认构造函数。
一个“捕获”是:
如果隐式声明了默认构造函数但超类没有可访问的构造函数(第 6.6 节),该构造函数不接受任何参数并且没有 throws 子句,则这是编译时错误。
如果您只定义参数化构造函数,那么编译器将不会提供默认构造函数
它会打印一个错误
如果一个类不包含构造函数声明,则自动提供一个不带参数的默认构造函数:
- 如果声明的类是原始类 Object,则默认构造函数的主体为空。
- 否则,默认构造函数不带参数,只是调用不带参数的超类构造函数
.
Java 语言规范非常有用,而且实际上很容易阅读。
除此之外,这可能会导致一些额外的编译错误。测试这段代码。
class A{
A(int i){}
}
class B extends A{}
class Test{
PSVM{
B b = new B();
}
}
此代码给出编译错误。
B 类没有任何构造函数。所以java会把这样的东西作为默认构造函数。
B(){
super();
}
但是 A 类(B 类)的 Supper 类没有不带参数的构造函数。所以它会产生编译错误。
因此,最好在您编写的每个类中都有一个无参数构造函数。
Java 仅为那些没有为它们显式定义构造函数的类提供默认的无参数构造函数。一旦程序员定义了构造函数(即使它是无参数的构造函数),就不会提供默认构造函数。
现在你在问错误:
建议彻底阅读Java 语言规范
如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有 throws 子句的默认构造函数。
如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只是调用不带参数的超类构造函数。
如果隐式声明了默认构造函数,但超类没有可访问的构造函数,该构造函数不带参数且没有 throws 子句,则这是编译时错误。
在一个类类型中,如果该类被声明为public,那么默认构造函数被隐式地赋予访问修饰符public;如果该类被声明为受保护,则默认构造函数被隐式赋予访问修饰符保护;如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有;否则,默认构造函数具有没有访问修饰符隐含的默认访问权限。