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

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

164528 次浏览

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

As mdma pointed out, it isn't true for interface members though, for which the default is "public".

See Java 的访问说明符

如果没有给出访问说明符,那么它就是类和类成员的包级访问(对此没有显式的说明符)。接口方法是隐式公共的。

有关详细信息,请参阅 给你。默认值不是 private/public/protected,而是一个完全不同的访问规范。它没有被广泛使用,我更喜欢在我的访问定义中更具体一些。

默认的可见性(没有关键字)是 包裹,这意味着它将可用于位于同一个包中的每个类。

有趣的是,受到保护不限制子类的可见性,也不限制同一包中其他类的可见性

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

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

class MyClass   // package private
{
int field;    // package private field


void calc() {  // package private method


}
}

对于接口成员(字段和方法) ,默认访问是公共的。但是请注意,接口声明本身默认为包 private。

interface MyInterface  // package private
{
int field1;         // static final public


void method1();     // public abstract
}

如果我们有了声明

public interface MyInterface2 extends MyInterface
{


}

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

the default access specifier is 包裹.Classes can access the members of other classes in the same package.but outside the package it appears as 二等兵

It depends on what the thing is.

  • 顶级类型(即类、枚举、接口和未在其他类型中声明的注释类型)默认为 私人包裹

  • 在类中,默认情况下,所有成员(即字段、方法和嵌套类型声明)和构造函数都是 私人包裹

    • When a class has no explicitly declared constructor, the compiler inserts a default zero-argument constructor which has the 与类相同的访问说明符. (JLS 8.8.9) The default constructor is commonly misstated as always being public, but 在极少数情况下 that's not equivalent.
  • 在枚举中,构造函数默认为 二等兵。实际上,枚举构造函数 必须的是私有的,将它们指定为 public 或 protected 是错误的。枚举常数始终是 public,并且不允许任何访问说明符。默认情况下,枚举的其他成员是 私人包裹。(JLS 8.9)

  • In interfaces and annotation types, all members (again, that means fields, methods, and nested type declarations) are 公众人士 by default. Indeed, members of interfaces and annotation types 必须的 be public, and it is an error to specify them as private or protected. (JLS §9.3 to 9.5)

  • 本地类是在方法、构造函数或初始值设定项块中声明的命名类。它们是 作用域为声明它们的 ABC0. . },不允许任何访问说明符。(JLS §14.3)使用反射,您可以从其他地方实例化本地类,它们是 package-private,尽管我不确定这个细节是否在 JLS 中。

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

  • 实例和静态初始值设定项块在语言级别(JLS 8.6 & 8.7)没有访问说明符,但是静态初始值设定项块被实现为一个名为 <clinit>(JVMS 2.9)的方法,因此该方法在内部必须有一些访问说明符。我检查了 javac 和 Eclipse 编译器使用十六进制编辑器编译的类,发现两者都生成 package-private方法。但是,您不能在语言中调用 <clinit>(),因为 <>字符在方法名中是无效的,并且反射方法被硬连接以否认其存在,所以实际上它的访问说明符是 无法进入。该方法只能在类初始化期间由 VM 调用。Instance初始化程序块不是作为单独的方法编译的; 它们的代码被复制到每个构造函数中,因此不能单独访问它们,甚至不能通过反射访问它们。

下面是对 Java 创造者 James Gosling 的一次采访中关于包级别可见性的一段话:

Bill Venners : Java 有四个访问级别 一直想知道使包访问默认是否方便 因为 C + + 的人已经知道的三个关键词 是私人的,受保护的,公共的。或者如果你有一些特别的 您认为包访问应该是默认的原因。

James Gosling: A package is generally a set of things that are kind of 所以一般来说,我可以做两件事情中的一件。 One was force you always to put in a keyword that gives you the 或者我可以有一个默认值。然后问题是, 什么是合理的违约? 我倾向于选择最小的违约 危险的东西。

因此,公开违约将是一件非常糟糕的事情。 私有可能是一件坏事,使违约,如果 只是因为人们实际上不经常编写私有方法。 和受保护的一样,看着一堆代码 我有,我决定,最常见的东西,是相当安全的 C + + 没有这个关键字,因为 他们没有包的概念。

但是我喜欢它,而不是朋友的概念,因为与朋友 你得列举出你所有的朋友 向包中添加一个新类,那么通常最终必须 go to all of the classes in that package and update their friends, 我一直觉得这是个大麻烦。

但是好友列表本身会导致一些版本问题 所以就有了友好课堂的概念 我把它设置为默认值——我会解决这个问题,那么应该怎么做呢 the keyword be?

For a while there actually was a friendly keyword. But because all the 有的是 P 开头,有的是“友好”有个“ PH”但那是 只在里面待了一天。

Http://www.artima.com/intv/gosling2p.html

更新 default关键字的 爪哇8用法: 正如许多其他人注意到的那样,默认可见性(没有关键字)

该字段将可以从 课程属于。

不要与新的 爪哇8特性(默认方法)混淆,后者允许接口在标记为 default关键字时提供实现。

见: 访问修饰符

首先让我说一件事,在 java 中没有“ Access 说明符”这样的术语。我们应该称一切为“修饰语”。正如我们所知,最终的,静态的,同步的,不稳定的... 。被称为修饰符,甚至公开、私有、保护、默认、抽象也应该被称为修饰符。默认是这样一种修饰符,其中物理存在不存在,但没有放置修饰符,因此它应被视为默认修饰符。

为了证明这一点,我们举一个例子:

public class Simple{  
    public static void main(String args[]){  
     System.out.println("Hello Java");  
    }  
}  

输出将是: Hello Java

现在将 public 更改为 private,看看会得到什么编译器错误: 它说“这里不允许修饰符私有” 什么结论是有人可能是错误的,或者一些教程可能是错误的,但编译器不能是错误的。 所以我们可以说 Java 中没有术语访问说明符,一切都是修饰符。

There is an access modifier called "default" in JAVA, which allows direct instance creation of that entity only within that package.

这里有一个有用的链接:

Java Access Modifiers/Specifiers

Default 是一个关键字,用作方法和变量的访问修饰符。
使用这个访问修饰符将使您的类、变量、方法或构造函数可以从自己的类或包中访问,如果没有访问修饰符,它也将被设置。

  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

if you use a default in a interface you will be able to implement a method there like this exemple

public interface Computer {
default void Start() {
throw new UnsupportedOperationException("Error");
}
}

但是它只能在8 Java 版本下工作

正式文件

Java 中的访问修饰符