Java中的默认访问说明符是什么?
我刚开始读一本Java的书,想知道;如果未指定访问说明符,那么哪个访问说明符是默认的?默认的可见性称为“包专用”(尽管您不能明确使用它),这意味着可以从类所属的同一个包内访问该字段 正如mdma所指出的,接口成员的默认值为“public”,而接口成员的情况并非如此Java中的默认访问说明符是什么?,java,access-specifier,Java,Access Specifier,我刚开始读一本Java的书,想知道;如果未指定访问说明符,那么哪个访问说明符是默认的?默认的可见性称为“包专用”(尽管您不能明确使用它),这意味着可以从类所属的同一个包内访问该字段 正如mdma所指出的,接口成员的默认值为“public”,而接口成员的情况并非如此 请参见如果没有提供访问说明符,则类和类成员的访问是包级别的(没有明确的说明符)。接口方法是隐式公开的。有关详细信息,请参阅。默认值不是private/public/protected,而是完全不同的访问规范。它没有被广泛使用,我更喜欢
请参见如果没有提供访问说明符,则类和类成员的访问是包级别的(没有明确的说明符)。接口方法是隐式公开的。有关详细信息,请参阅。默认值不是private/public/protected,而是完全不同的访问规范。它没有被广泛使用,我更喜欢在我的访问定义中更加具体。默认的可见性(没有关键字)是package,这意味着它将可用于位于同一个包中的每个类
class MyClass // package private
{
int field; // package private field
void calc() { // package private method
}
}
有趣的是,受保护的不限制子类的可见性,也限制同一包中其他类的可见性默认说明符取决于上下文 对于类和接口声明,默认为包私有。这介于受保护和私有之间,只允许同一包中的类访问。(protected是这样的,但也允许访问包外部的子类。) 对于接口成员(字段和方法),默认访问权限为public。但是请注意,接口声明本身默认为包私有
interface MyInterface // package private
{
int field1; // static final public
void method1(); // public abstract
}
如果我们有了声明
public interface MyInterface2 extends MyInterface
{
}
使用MyInterface2的类可以从超级接口看到field1和method1,因为它们是公共的,即使他们看不到MyInterface本身的声明。默认访问说明符是包。类可以访问同一包中其他类的成员。但在包外,它显示为私有这取决于它是什么
- 默认情况下,顶级类型(即未在另一个类型中声明的类、枚举、接口和注释类型)是包私有的。()
- 在类中,默认情况下,所有成员(即字段、方法和嵌套类型声明)和构造函数都是包私有的。()
- 当类没有显式声明的构造函数时,编译器将插入一个默认的零参数构造函数,该构造函数具有与类相同的访问说明符。()默认构造函数通常被错误地描述为总是公共的,但这不是等价的
- 在枚举中,默认情况下构造函数是私有的。事实上,枚举构造函数必须是私有的,将它们指定为公共或受保护是错误的。枚举常量始终是公共的,不允许任何访问说明符。默认情况下,枚举的其他成员是包私有的。()
- 在接口和注释类型中,默认情况下,所有成员(同样,这意味着字段、方法和嵌套类型声明)都是公共的。实际上,接口和注释类型的成员必须是公共的,将它们指定为私有或受保护是错误的。()
- 局部类是在方法、构造函数或初始值设定项块中声明的命名类。它们的作用域为声明它们的
。{
块,不允许任何访问说明符。()使用反射,您可以从其他地方实例化本地类,它们是包私有的,尽管我不确定这个细节是否在JLS中}
- 匿名类是使用
创建的自定义类,它直接在表达式中指定类主体。()它们的语法不允许任何访问说明符。使用反射,您可以从其他地方实例化匿名类,它们和它们生成的构造函数都是包私有的,尽管我不确定这个细节是否在JLS中new
- 实例和静态初始值设定项块在语言级别()没有访问说明符,但是静态初始值设定项块是作为名为
()的方法实现的,因此该方法必须在内部具有一些访问说明符。我使用十六进制编辑器检查了javac和Eclipse编译器编译的类,发现它们都以包私有的方式生成方法。但是,您不能在语言中调用
,因为()
和code>字符在方法名称中无效,并且反射方法硬连线拒绝它的存在,因此实际上它的访问说明符是无访问。该方法只能由VM在类初始化期间调用。实例初始值设定项块不作为单独的方法编译;它们的代码被复制到每个构造函数中,因此不能单独访问它们,即使是通过反射
public class Simple{
public static void main(String args[]){
System.out.println("Hello Java");
}
}
Access Levels
Modifier Class Package Subclass EveryWhere
public Y Y Y Y
protected Y Y Y N
default Y Y N N
private Y N N N
public interface Computer {
default void Start() {
throw new UnsupportedOperationException("Error");
}
}