在Java中使用可见性修饰符

joy*_*joy 6 java modifier

class Orange{

    Orange(){
    }

}
Run Code Online (Sandbox Code Playgroud)

修饰符的用法 - 在本例中是package-private - 在类的前面和构造函数的前面有什么区别?我认为构造函数前面的修饰符意味着允许实例化类的实例Orange.但是在课堂前面的修饰语怎么样?

Ris*_*are 13

首先,由3个访问修饰符创建了4个访问级别.

  1. 公众 - 随处可见
  2. 受保护 - 可在同一包裹和儿童中使用
  3. default - 只能在同一个包中访问
  4. 私人 - 只能在同一个班级访问.

你是对的 - 构造函数级别的修饰符与类的实例化直接相关.

Class级别的修饰符决定了Class的可访问性.

  • 好吧,事情就是这样。一个类只能是公共的或默认的,即您只能使用一个在类级别上公共的修饰符。假设您在编写类时未指定访问修饰符(默认访问级别)并尝试在另一个包中访问它,则它将无法访问。**不允许进口** (2认同)

Mak*_*oto 5

首先,为了减轻任何担忧,您提供的代码完全有效的 Java 语法。

\n\n

实际上,您创建了一个只能由默认包中的其他类实例化/使用的类。如果您在包中定义它也可以工作(例如package foo;),因为只有包中的类foo可以看到此类)。

\n\n

现在,到问题的关键了。

\n\n

有不同的方法来控制对字段和成员的访问。他们每个人都做不同的事情。

\n\n
    \n
  • private可见度是最不可见的。只有定义类可以访问该字段。

  • \n
  • 没有修饰符,或者package private是第二不可见的。定义类包中的所有类都可以访问该字段,但子类和其他类则不能。

  • \n
  • protected是第二个最明显的。只有其他类被禁止访问该字段。

  • \n
  • public是最明显的。 一切都可以进入领域。

  • \n
\n\n

类级别的修饰符变得有趣。这来自Java 语言规范 \xc2\xa78.1.1

\n\n
\n

访问修饰符public(\xc2\xa76.6) 仅适用于顶级类\n (\xc2\xa77.6) 和成员类 (\xc2\xa78.5),不适用于本地类 (\xc2\xa714.5)。 3) 或\n 匿名类(\xc2\xa715.9.5)。

\n\n

访问修饰符protectedprivate(\xc2\xa76.6) 仅适用于\n 直接封闭类或枚举声明\n (\xc2\xa78.5) 中的成员类。

\n\n

修饰符 static 仅适用于成员类 (\xc2\xa78.5.1),而不适用于顶级类、本地类或匿名类。

\n\n

如果相同的修饰符在类声明中出现多次,则会出现编译时错误。

\n\n

如果两个或多个(不同的)类修饰符出现在类声明中,则按照惯例(尽管不是必需),它们的出现顺序与上面在 的产生式中显示的顺序一致ClassModifier

\n
\n\n

一般来说,类声明看起来像这样:

\n\n
ClassDeclaration:\n    NormalClassDeclaration\n    EnumDeclaration\n\nNormalClassDeclaration:\n    ClassModifiers(opt) class Identifier TypeParameters(opt)\n                        Super(opt) Interfaces(opt) ClassBody\n
Run Code Online (Sandbox Code Playgroud)\n\n

任何带有 (opt) 的内容都被认为是可选的。

\n\n

那么,这会减少什么呢?

\n\n
    \n
  • JLS 要求类不需要 [class] 修饰符。
  • \n
  • JLS 要求,如果存在 [class] 修饰符,则它遵循以下规则之一:\n
      \n
    • 如果修饰符为public,则仅适用于顶级类和成员类。
    • \n
    • 如果修饰符是protectedprivate,则它仅适用于直接封闭类或枚举中的成员类。
    • \n
    • static可能会出现,但仅适用于成员类。
    • \n
  • \n
\n\n

构造函数有类似的规则集。

\n\n
ConstructorDeclaration:\n    ConstructorModifiers(opt) ConstructorDeclarator\n                                Throws(opt) ConstructorBody\n\nConstructorDeclarator:\n    TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) )\n
Run Code Online (Sandbox Code Playgroud)\n\n

再次,这可以分解为:

\n\n
    \n
  • JLS 要求构造函数不需要 [constructor] 修饰符。
  • \n
  • JLS 要求构造函数修饰符不能包含abstract, static, final, native, strictfp, 或synchronized
  • \n
  • JLS 强制要求,如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认值访问权限(\xc2\xa78.8.3,强调我的)。
  • \n
\n