-1

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

Java 语言的设计者本可以选择相反的方式,但他们更喜欢默认公开类成员(在同一个包中)。

知道为什么吗?

4

7 回答 7

4

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

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

于 2011-03-18T23:03:25.597 回答
4

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

于 2011-03-18T23:03:55.520 回答
2

我不知道 sun 在他们发明 java 时做出的决定,但恕我直言,这是因为你需要包私有类型比私有或公共类更频繁。

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

于 2011-03-18T23:09:33.843 回答
2

@anOOb 在评论中写了这个......它应该得到彻底的回应。

当 Java 让我从一个不同的类(在一个单独的文件中)设置一个类的数据成员时,我感到很惊喜,因为我不必经历创建访问器的麻烦。它更方便但不违反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 中使用访问器/修改器还有两个原因:

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

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

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


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

于 2011-03-19T01:07:02.883 回答
1

仅供参考:

访问级别

--------------------------------------------------
修饰符类包子类世界
--------------------------------------------------
公开 YYYY
受保护的 YYYN
没有修饰符 YYNN
私人 YNNN
于 2011-03-18T23:21:52.300 回答
1

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

IMO,如果 Java 设计者有时间机器,他们会更改规范以private设置默认访问级别。

于 2011-03-19T01:55:39.387 回答
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

于 2011-03-18T23:21:59.540 回答