class Orange{
Orange(){
}
}
Run Code Online (Sandbox Code Playgroud)
修饰符的用法 - 在本例中是package-private - 在类的前面和构造函数的前面有什么区别?我认为构造函数前面的修饰符意味着允许实例化类的实例Orange.但是在课堂前面的修饰语怎么样?
Ris*_*are 13
首先,由3个访问修饰符创建了4个访问级别.
你是对的 - 构造函数级别的修饰符与类的实例化直接相关.
Class级别的修饰符决定了Class的可访问性.
首先,为了减轻任何担忧,您提供的代码是完全有效的 Java 语法。
\n\n实际上,您创建了一个只能由默认包中的其他类实例化/使用的类。如果您在包中定义它也可以工作(例如package foo;),因为只有包中的类foo可以看到此类)。
现在,到问题的关键了。
\n\n有不同的方法来控制对字段和成员的访问。他们每个人都做不同的事情。
\n\nprivate可见度是最不可见的。只有定义类可以访问该字段。
没有修饰符,或者package private是第二不可见的。定义类和包中的所有类都可以访问该字段,但子类和其他类则不能。
protected是第二个最明显的。只有其他类被禁止访问该字段。
public是最明显的。 一切都可以进入领域。
类级别的修饰符变得有趣。这来自Java 语言规范 \xc2\xa78.1.1:
\n\n\n\n\n访问修饰符
\n\npublic(\xc2\xa76.6) 仅适用于顶级类\n (\xc2\xa77.6) 和成员类 (\xc2\xa78.5),不适用于本地类 (\xc2\xa714.5)。 3) 或\n 匿名类(\xc2\xa715.9.5)。访问修饰符
\n\nprotected和private(\xc2\xa76.6) 仅适用于\n 直接封闭类或枚举声明\n (\xc2\xa78.5) 中的成员类。修饰符 static 仅适用于成员类 (\xc2\xa78.5.1),而不适用于顶级类、本地类或匿名类。
\n\n如果相同的修饰符在类声明中出现多次,则会出现编译时错误。
\n\n如果两个或多个(不同的)类修饰符出现在类声明中,则按照惯例(尽管不是必需),它们的出现顺序与上面在 的产生式中显示的顺序一致
\nClassModifier。
一般来说,类声明看起来像这样:
\n\nClassDeclaration:\n NormalClassDeclaration\n EnumDeclaration\n\nNormalClassDeclaration:\n ClassModifiers(opt) class Identifier TypeParameters(opt)\n Super(opt) Interfaces(opt) ClassBody\nRun Code Online (Sandbox Code Playgroud)\n\n任何带有 (opt) 的内容都被认为是可选的。
\n\n那么,这会减少什么呢?
\n\npublic,则仅适用于顶级类和成员类。protected或private,则它仅适用于直接封闭类或枚举中的成员类。static可能会出现,但仅适用于成员类。ConstructorDeclaration:\n ConstructorModifiers(opt) ConstructorDeclarator\n Throws(opt) ConstructorBody\n\nConstructorDeclarator:\n TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) )\nRun Code Online (Sandbox Code Playgroud)\n\n再次,这可以分解为:
\n\nabstract, static, final, native, strictfp, 或synchronized。