我们都知道,如果不专门定义构造函数,则编译器会插入一个不可见的零参数构造函数。我以为它的访问修饰符是公开的,但是在处理内部类问题时,我发现我可能是错的。这是我的代码:
public class Outer {
protected class ProtectedInner {
// adding a public constructor will solve the error in SubOuterInAnotherPackage class
//public ProtectedInner() {}
}
}
Outer
在另一个包中有一个子类:
public class SubOuterInAnotherPackage extends Outer {
public static void main(String[] args) {
SubOuterInAnotherPackage.ProtectedInner protectedInner
= new SubOuterInAnotherPackage().new ProtectedInner(); // Error!! Can't access the default constructor
}
}
您将在该main()
方法中得到一个错误,但是如果您将一个公共构造函数添加到ProtectedInner
该类中,则可以解决该错误。这就是为什么我认为默认构造函数的修饰符不是公共的!那么谁能告诉我默认构造函数的访问修饰符是什么?
我以为它的访问修饰符是公共的,但是当我处理一个内部类问题时,我发现我可能是错的。
对。的确,几年前我发现自己处在相同的境地。我对一个错误感到惊讶(通过Guice注入,这使它很难找到)。
关键是检查规格,在本例中为8.8.9节:
在类类型中,如果将该类声明为public,则默认构造函数将隐式赋予访问修饰符public(第6.6节);如果该类被声明为受保护的,则默认构造函数将隐式给予访问修饰符保护(第6.6节);如果该类被声明为私有,则默认构造函数被隐式赋予访问修饰符私有(第6.6节);否则,默认构造函数具有无访问修饰符暗含的默认访问权限。
因此,在这种情况下,构造函数是隐式的protected
。
另一个包中有的子类: 您将在方法中得到一个错误,但如果您将公共构造函数添加到类中,则该错误将得到解决。这就是为什么我认为默认构造函数的修饰符不是public的原因!那么谁能告诉我缺省构造函数的访问修饰符是什么吗?
问题内容: 谁能解释一个 明确的无参数构造函数 (和其他构造函数)的默认访问修饰符是什么? 问题答案: 构造函数在这方面与方法相同-如果您未提供显式的public,private或protected,则构造函数将获得默认的“ package private”可见性。可以从同一类或同一包中的任何其他类中调用它,但不能从不同包中的子类中调用(因此,如果一个类仅具有包可见的构造函数,则任何子类都必须位于
问题内容: 如果我没有明确声明,方法或实例变量的默认访问修饰符是什么? 例如: 此构造函数的访问修饰符是受保护的还是打包的?同一包(即)中的其他类可以调用此构造函数吗? 问题答案: 如果一个类没有修饰符(默认值,也称为),则它仅在其自己的包中可见(包被命名为相关类的组,你将在以后的课程中对其进行了解。) 在,你也可以像顶级类一样使用修饰符或(),并且含义相同。
问题内容: 抽象类只能用作由其他类扩展的基类,对吗?抽象类的构造函数可以具有常用的访问修饰符(公共,保护和私有(供内部使用))。其中和是使用正确的访问修饰符,因为抽象类型似乎表明技术上的公共构造将起到非常保护?我应该在所有构造函数上使用protected吗? 问题答案: 因为抽象类型似乎表明从技术上讲,公共构造函数将在很大程度上受到保护 这是不正确的。抽象类不能通过调用其构造函数直接实例化,但是,
问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数