【问题标题】:Will the compiler-generated default constructor be public?编译器生成的默认构造函数会公开吗?
【发布时间】:2014-03-12 02:48:34
【问题描述】:
当我写课时Widget.java
public class Widget {
int data;
String name;
}
编译器生成的构造函数是public还是default?
公众会喜欢
public class Widget {
int data;
String name;
public Widget() {}
}
而默认类似于
public class Widget {
int data;
String name;
Widget() {}
}
【问题讨论】:
标签:
java
default-constructor
member-access
compiler-generated
【解决方案1】:
取决于类的可见性。因为你的类默认构造函数将是公开的。
在类类型中,如果该类被声明为 public,则默认构造函数被隐式赋予访问修饰符 public(第 6.6 节);如果该类被声明为受保护,则默认构造函数被隐式赋予访问修饰符 protected(第 6.6 节);如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符 private(第 6.6 节);否则,默认构造函数具有没有访问修饰符隐含的默认访问权限。
来自here。
【解决方案3】:
如果您的类是公共的,那么默认构造函数将是公共的,因此在您的情况下,由于 Widget 类是公共的,因此编译器提供的默认构造函数也将是公共的。
See this
【解决方案4】:
它将是public,因为类可见性是公开的
public Widget() {}
【解决方案5】:
如JLS中所说
如果类不包含构造函数声明,则自动提供不带参数的默认构造函数:
- 如果类被声明为 public,那么默认构造函数是
隐式给出访问修饰符 public;
- 如果类被声明为受保护,则默认构造函数为
隐式给定访问修饰符 protected;
- 如果类声明为私有,则默认构造函数为
隐式给出访问修饰符 private;
- 否则,默认构造函数具有隐含的默认访问权限
没有访问修饰符
【解决方案6】:
由于类的可见性是公开的,所以它始终是一个公开的构造函数。
【解决方案7】:
这取决于您的类可见性。编译器使用类可见性并生成具有可见性相同
的无参数默认构造函数