在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

访问修饰符protected和private(\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
    • 如果修饰符是protected或private,则它仅适用于直接封闭类或枚举中的成员类。
    • \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