在Java中使用可见性修饰符

class Orange{ Orange(){ } } 

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

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

  1. 公众 – 无处不在
  2. 受保护 – 可在同一包裹和儿童中使用
  3. 默认 – 只能在同一个包中访问
  4. 私人 – 只能在同一个class级访问。

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

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

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

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

现在,问题的关键。

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

  • private能见度最不明显。 只有定义类才能访问该字段。

  • 没有修饰符或package private是第二个最不可见的。 包中的定义类所有类可以访问该字段,但子类和世界其他地方不能访问。

  • protected是第二个最明显的。 只允许其他类访问该字段。

  • public是最明显的。 一切都可以访问该领域。

课堂上的修饰语变得有趣。 这来自Java语言规范,§8.1.1 :

访问修饰符public (第6.6节)仅适用于顶级类(第7.6节)和成员类(第8.5节),不适用于本地类(第14.3节)或匿名类(第15.9.5节)。

访问修饰符protectedprivate (第6.6节)仅适用于直接封闭类或枚举声明(第8.5节)中的成员类。

修饰符static仅适用于成员类(第8.5.1节),而不适用于顶级或本地或匿名类。

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

如果两个或多个(不同的)类修饰符出现在类声明中,则通常(尽管不是必需的)它们按照与上面在ClassModifier的制作中所示的顺序一致的顺序出现。

通常,类声明看起来像这样:

 ClassDeclaration: NormalClassDeclaration EnumDeclaration NormalClassDeclaration: ClassModifiers(opt) class Identifier TypeParameters(opt) Super(opt) Interfaces(opt) ClassBody 

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

那么,这会减少什么呢?

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

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

 ConstructorDeclaration: ConstructorModifiers(opt) ConstructorDeclarator Throws(opt) ConstructorBody ConstructorDeclarator: TypeParameters(opt) SimpleTypeName ( FormalParameterList(opt) ) 

再次,这分解为:

  • JLS要求构造函数不需要[constructor]修饰符。
  • JLS要求构造函数修饰符不能包含abstractstaticfinalnativestrictfpsynchronized
  • JLS强制要求,如果没有为普通类的构造函数指定访问修饰符,则构造函数具有默认访问权限(§8.8.3,强调我的)。

您只能在Java中声明公共或默认类(仅限顶级类),并且这些修饰符决定了类的可访问性。

我还建议你看看“ 为什么类或接口不能接收私有或受保护的访问修饰符? ”

现在至于构造函数关注点,当没有显式定义access-modifier时,构造函数将具有类型default的aaccess-control。 所以这个构造函数将具有包级访问权限。 只有那些在该包中定义的类作为具有此默认构造函数的类的类才能访问它。 请参阅“ 默认情况下,Java构造函数不公开吗? ”

如果构造函数是私有的,那么只有该类中的代码才能访问它。 为了更好地理解修饰符,您需要查看“ Java中的访问修饰符 ”

类的修饰符定义了谁可以访问该类。 例如,可以通过任何包中的类访问public类,如果没有编写修饰符,则只能从同一个包中的类访问该类。

构造函数,方法和字段的修饰符具有相同的含义。 然而privateprotected更有意义。 可以仅从当前class级访问私人。 仅从同一个包中的类中保护其子类。

关于你关于构造函数的问题。 类可以有几个构造函数。 其中一些可以是私人的,另一些是公共的。 你是对的,如果类是包受保护的话,没有意义使构造函数公开:无论如何,没有一个外部包可以调用这个类。

这就像为抽象类编写公共构造函数一样。 由于抽象类本身无法实例化,因此构造函数应该受到protectedprivate尽管编译器并不关心这一点。

使用默认包的BTW不常用,也不推荐使用。

class级别修饰符的用法类型

http://javapapers.com/core-java/access-modifiers-in-java-explain/

constructor级别修饰符的用法类型

http://www.careercup.com/question?id=296844#commentThread302715

类修饰符与方法修饰符的工作方式类似。 公共,私人,最终,抽象等工作。

Public允许通过任何包中的类访问类及其方法。

没有修饰符只允许从其定义的包中访问类。

Private会阻止所有访问(如果使用顶级类,则不会指向此)。

抽象类允许您创建从 (抽象)类派生的类。 例如,您可以创建一个Abstract Shape类并具有Rectangle类的扩展形状,inheritance其所有方法,变量,并强制它定义任何抽象方法。

访问修饰符:

  • 公开 – {可以访问项目中的任何位置}
  • 私人 – {只能在class级内访问}
  • 受保护 – {可以在包和子类中访问}
  • 默认 – {可以在包中访问}

非访问修饰符:

  • 静态 – {用于创建类变量和方法}
  • 最终 – {用于创建最终变量和方法}
  • 摘要 – {用于创建抽象方法和类}
  • 同步 – {for threads}

在此链接中对上述修饰符进行了简要讨论。 请参阅以便更好地理解。

我发现Java中最好的可见性级别是default可见性,即可见性,因为它使unit testing类能够访问所有方法,如果测试放在与主类相同的包中。

由于您可以省略可见性声明,因此包装可见性更短,因此锅炉板更少。

第二个最佳可见性级别protected ,因为在某些情况下,您可以将测试类创建为主类的子类。 但是,如前所述,如果正确使用包,则在大多数情况下,包可见性会更好。

第三,通常如果您运行Sonar并对大型项目进行代码审查和静态分析,我发现通常80%的方法是public ,20%是private / protected 。 因此,使用私有或受保护方法的主要思想是通过绕过访问器来保护数据/属性不被访问。 大多数方法通常都是公共的。

最无用的可见性级别(但不幸的是常用)是private因为它无法测试(不使用Reflection并将可见性修改为其他内容)。 此外, private禁止在子类中重用代码,这是首先使用面向对象范例的主要思想,因此应该避免。 出于同样的原因,在大多数情况下应避免使用关键字final

因此,我发现你的例子是如何定义可见性级别的最佳实践,除了你的构造函数不公开:)。 但是,您缺少包声明和unit testing。