Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的默认访问说明符是什么?_Java_Access Specifier - Fatal编程技术网

Java中的默认访问说明符是什么?

Java中的默认访问说明符是什么?,java,access-specifier,Java,Access Specifier,我刚开始读一本Java的书,想知道;如果未指定访问说明符,那么哪个访问说明符是默认的?默认的可见性称为“包专用”(尽管您不能明确使用它),这意味着可以从类所属的同一个包内访问该字段 正如mdma所指出的,接口成员的默认值为“public”,而接口成员的情况并非如此 请参见如果没有提供访问说明符,则类和类成员的访问是包级别的(没有明确的说明符)。接口方法是隐式公开的。有关详细信息,请参阅。默认值不是private/public/protected,而是完全不同的访问规范。它没有被广泛使用,我更喜欢

我刚开始读一本Java的书,想知道;如果未指定访问说明符,那么哪个访问说明符是默认的?

默认的可见性称为“包专用”(尽管您不能明确使用它),这意味着可以从类所属的同一个包内访问该字段

正如mdma所指出的,接口成员的默认值为“public”,而接口成员的情况并非如此


请参见

如果没有提供访问说明符,则类和类成员的访问是包级别的(没有明确的说明符)。接口方法是隐式公开的。

有关详细信息,请参阅。默认值不是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中

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

  • 实例和静态初始值设定项块在语言级别()没有访问说明符,但是静态初始值设定项块是作为名为
    ()的方法实现的,因此该方法必须在内部具有一些访问说明符。我使用十六进制编辑器检查了javac和Eclipse编译器编译的类,发现它们都以包私有的方式生成方法。但是,您不能在语言中调用
    ()
    ,因为
    和code>字符在方法名称中无效,并且反射方法硬连线拒绝它的存在,因此实际上它的访问说明符是无访问。该方法只能由VM在类初始化期间调用。实例初始值设定项块不作为单独的方法编译;它们的代码被复制到每个构造函数中,因此不能单独访问它们,即使是通过反射


以下是Java创建者James Gosling访谈中关于包级可见性的一段话:

BillVenners:Java有四个访问级别。默认值是package。我 我一直想知道将包访问设为默认是否方便 因为来自C++的三个关键词已经知道 是私人的、受保护的和公共的。或者如果你有什么特别的 您认为包访问应该是默认的原因

詹姆斯·戈斯林:一个包裹通常是一系列的东西 一起写的。一般来说,我可以做两件事中的一件。 一个是强迫你总是输入一个关键字,让你 域名。或者我可以有一个默认值。然后问题是, 什么是合理的违约?我倾向于选择最不重要的东西
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");
    }    
}