为了账号安全,请及时绑定邮箱和手机立即绑定

默认的访问修饰符是什么?

/ 猿问

默认的访问修饰符是什么?

holdtom 2019-09-21 15:30:59

我刚开始读一本Java书籍,就纳闷了。如果未指定,哪个访问修饰符是默认的?



查看完整描述

3 回答

?
波斯汪

默认可见性称为“私有包”(尽管您不能显式使用它),这意味着可以从该类所属的同一包内部访问该字段。


正如mdma指出的那样,接口成员的情况并非如此,其默认值为“ public”。



查看完整回答
反对 回复 2019-09-21
?
慕沐林林

默认说明符取决于上下文。


对于类和接口声明,默认值为包私有。这介于受保护和私有之间,仅允许同一包中的类访问。(受保护就是这样,但也允许访问包外部的子类。)


class MyClass   // package private

{

   int field;    // package private field


   void calc() {  // package private method


   }

}

对于接口成员(字段和方法),默认访问权限为public。但是请注意,接口声明本身默认为私有包。


interface MyInterface  // package private

{

   int field1;         // static final public


   void method1();     // public abstract

}

如果我们有声明


public interface MyInterface2 extends MyInterface

{


}

然后,使用MyInterface2的类可以从超级接口查看field1和method1,因为它们是公共的,即使它们看不到MyInterface本身的声明。


查看完整回答
反对 回复 2019-09-21
?
万千封印

这取决于事物是什么。


默认情况下,顶级类型(即未在另一种类型内部声明的类,枚举,接口和注释类型)是程序包专用的。(JLS§6.6.1)


在类中,默认情况下,所有成员(表示字段,方法和嵌套类型声明)和构造函数都是程序包私有的。(JLS§6.6.1)


当类没有显式声明的构造函数时,编译器将插入一个默认的零参数构造函数,该构造函数具有与class相同的访问说明符。(JLS§8.8.9)默认构造函数通常总是公开地被遗忘,但是在极少数情况下并不等效。

在枚举中,构造函数默认为私有。确实,枚举构造器必须是私有的,并且将它们指定为公共或受保护是错误的。枚举常量始终是public,并且不允许任何访问说明符。枚举的其他成员默认情况下是包私有的。(JLS§8.9)


在接口和注释类型中,默认情况下,所有成员(同样,这意味着字段,方法和嵌套类型声明)都是公共的。实际上,接口和注释类型的成员必须是公共的,并且将它们指定为私有或受保护是错误的。(JLS§9.3至9.5)


本地类是在方法,构造函数或初始化程序块内声明的命名类。它们的作用域是声明它们的{.. }块,并且不允许任何访问说明符。(JLS§14.3)使用反射,您可以从其他地方实例化本地类,它们是程序包专用的,尽管我不确定JLS中是否包含该细节。


匿名类是创建的自定义类,可使用new它们直接在表达式中指定类主体。(JLS§15.9.5)其语法不允许任何访问说明符。使用反射,您可以从其他地方实例化匿名类,它们和它们生成的构造函数都是包私有的,尽管我不确定JLS中是否包含该细节。


实例和静态初始化程序块在语言级别上没有访问说明符(JLS§8.6和8.7),但是静态初始化程序块是作为名为<clinit>(JVMS§2.9)的方法实现的,因此该方法在内部必须具有一些访问说明符。我使用十六进制编辑器检查了javac和Eclipse的编译器编译的类,发现两者均将方法生成为package-private。但是,您不能<clinit>()在该语言内调用,因为方法名称中的<和>字符无效,并且反射方法被硬连线拒绝其存在,因此有效地其访问说明符是access。该方法只能在类初始化期间由VM调用。实例初始化程序块不会编译为单独的方法;它们的代码被复制到每个构造函数中,因此即使通过反射也无法单独访问它们。


查看完整回答
反对 回复 2019-09-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信