在Java中,为什么默认情况下类成员可以访问同一个包的成员?

时间:2011-03-18 22:58:06

标签: java default design-decisions design-consideration

据我所知,与C ++不同,如果我在声明数据成员时没有指定“public”或“private”,则可以从同一个包中的任何位置访问它。

Java语言的设计者可能选择相反的方法,但他们宁愿默认将类成员公开(在同一个包中)。

知道为什么吗?

7 个答案:

答案 0 :(得分:4)

他们不是公开的,他们可以访问同一个包的成员。 Java的理念是,给定的包代表了一组连贯的职责,因此默认情况下它们应该能够互操作。

如果您希望强制执行不同的语义,则始终可以使用特定的访问级别。

答案 1 :(得分:4)

Java中的默认可见性是package-private。这意味着您可以从同一个包中访问这些实体。我不知道为什么你认为默认的可见性是公开的。

答案 2 :(得分:2)

我不知道sun发明java后的决定,但恕我直言,因为你需要包私有类型,而不是私有或公共类。

例如,如果您在org.example.myapi。*中创建API,您将尝试从外部调用API以尽可能少的类来保持思维简单,并且您需要让所有帮助类API应该做他们应该做的事情,不应该从外面看到。大多数情况下,您需要更多的包私有API辅助类,然后是公共API调用类。

答案 3 :(得分:2)

@anOOb在评论中写到这一点......它值得一个彻底的回应。

  

当Java让我从差异类(在单独的文件中)设置一个类的数据成员时,我感到非常惊讶,因为我不必经历创建访问器的麻烦。它更方便,但不符合OO的原则之一吗?


它实际上比OO更深。原理是数据封装的原理,也适用于非OO设计。

访问器和增变器的主要目的是封装状态;即防止类的实现细节在类外可见。这样做有两个主要原因:

  • 如果您控制或阻止访问其内部状态,它可以简化关于类行为的推理。
  • 它可以更轻松地更改状态变量的实现类型和不变量。如果使用类的代码仅使用访问器/更改器(即getter / setter)来访问对象状态,那么您通常可以更改类状态表示和不变量,同时隐藏来自调用者的更改的效果;例如这是一个简单的例子

    private int counter;
    public int getCounter() { return counter; }
    

    变为

    private long counter;
    public int getCounter() { return (int)counter; }
    public long getLongCounter() { return counter; }
    

我们在Java中使用访问器/更改器还有两个原因:

  • 访问器或mutator方法的行为通常可以在子类中重写。相比之下,在Java中,您无法覆盖甚至更改公开属性的可见性。

  • 有许多框架/工具依赖于具有访问器和更改器的类,其方法名称/签名遵循JavaBeans规范的约定。

还应该注意,简单的getter和setter方法由JIT编译器内联,因此对性能影响最小。


您不应该将创建访问器视为您应该避免的“麻烦”。实际上,访问器(和mutators)是编写高质量Java代码的重要部分。这被认为是“最佳实践”,典型的样式/错误检查程序会将暴露的状态变量标记为问题。

答案 4 :(得分:1)

仅供参考:

Access Levels

--------------------------------------------------
Modifier    Class    Package    Subclass    World
--------------------------------------------------
public        Y         Y           Y         Y
protected     Y         Y           Y         N
no modifier   Y         Y           N         N
private       Y         N           N         N

答案 5 :(得分:1)

我只是说如果他们提出默认访问级别private会更好。正如其他人所指出的那样,这个想法可能是package访问级别将是最常用的访问级别,因为包“代表了一组连贯的协作职责”(Visage)。但是,事实证明private是最常用的访问级别。

IMO,Java设计人员会更改规范,使private成为默认访问级别,如果他们有时间机制。

答案 6 :(得分:0)

你的假设是错误的;默认情况下,字段公开。下表描述了Java中的所有可见性级别:

Modifier    Class  Package Subclass World
public      Y      Y       Y        Y
protected   Y      Y       Y        N
no modifier Y      Y       N        N
private     Y      N       N        N

此处有更多信息:http://download.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

相关问题