据我所知,与C ++不同,如果我在声明数据成员时没有指定“public”或“private”,则可以从同一个包中的任何位置访问它。
Java语言的设计者可能选择相反的方法,但他们宁愿默认将类成员公开(在同一个包中)。
知道为什么吗?
答案 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)
仅供参考:
-------------------------------------------------- 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