我知道,与 C++ 不同,如果我在声明数据成员时未指定“公共”或“私有”,则可以从同一包中的任何位置访问它。
Java 语言的设计者本可以选择相反的方式,但他们更喜欢默认公开类成员(在同一个包中)。
知道为什么吗?
我知道,与 C++ 不同,如果我在声明数据成员时未指定“公共”或“私有”,则可以从同一包中的任何位置访问它。
Java 语言的设计者本可以选择相反的方式,但他们更喜欢默认公开类成员(在同一个包中)。
知道为什么吗?
它们不是公开的,同一包的成员可以访问它们。Java 精神是给定的包代表一组连贯的协作职责,因此默认情况下它们应该能够互操作。
如果您希望强制执行不同的语义,您始终可以使用特定的访问级别。
Java 中的默认可见性是包私有的。这意味着您可以从同一个包访问这些实体。我不知道您为什么认为默认可见性是公开的。
我不知道 sun 在他们发明 java 时做出的决定,但恕我直言,这是因为你需要包私有类型比私有或公共类更频繁。
例如,如果您在 org.example.myapi.* 中创建 API,您将尝试从外部调用您的 API,以便需要尽可能少的类以保持简单,并且您需要让 API 执行所有帮助类他们应该做的,不应该从外面看到。大多数时候,您需要更多的包私有 API 帮助类,然后是公共 API 调用类。
@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 代码的重要部分。这被认为是“最佳实践”,典型的样式/错误检查程序会将暴露的状态变量标记为问题。
仅供参考:
-------------------------------------------------- 修饰符类包子类世界 -------------------------------------------------- 公开 YYYY 受保护的 YYYN 没有修饰符 YYNN 私人 YNNN
我只想说,如果他们设置默认访问级别会更好private
。正如其他人所指出的那样,这个想法可能是package
访问级别将是最常用的访问级别,因为包“代表了一组连贯的协作责任”(Visage)。然而,事实证明这private
是最常用的访问级别。
IMO,如果 Java 设计者有时间机器,他们会更改规范以private
设置默认访问级别。
你的假设是错误的;默认情况下,字段不公开。下表描述了 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