Java类和方法问题
作为一个从零开始学习Java的人,我了解一点Python,我一直想知道Java中所有的访问修饰符(public、static、protected…)是什么。我知道它们的意思,但为什么要用它们呢Java类和方法问题,java,access-modifiers,Java,Access Modifiers,作为一个从零开始学习Java的人,我了解一点Python,我一直想知道Java中所有的访问修饰符(public、static、protected…)是什么。我知道它们的意思,但为什么要用它们呢 这是一直困扰我的问题,因为每当我写一个新类,写实例变量时,我总是要问自己,我希望这个变量是私有的、公共的、最终的等等吗?我通常会得出结论,我不喜欢大多数变量和方法。我知道有几个实例需要从另一个类调用该方法,但为什么不公开所有方法呢?这是因为在大型项目中,你不能相信其他开发人员不会开始翻找和弄乱你的代码吗?
这是一直困扰我的问题,因为每当我写一个新类,写实例变量时,我总是要问自己,我希望这个变量是私有的、公共的、最终的等等吗?我通常会得出结论,我不喜欢大多数变量和方法。我知道有几个实例需要从另一个类调用该方法,但为什么不公开所有方法呢?这是因为在大型项目中,你不能相信其他开发人员不会开始翻找和弄乱你的代码吗?访问修饰符是这样的,程序员可以用面向对象的方式编程,并使用数据封装来编写密封(或尽可能接近)的API
我同意,这并不总是可取的。这就是为什么还有其他选项。在每种情况下都使用“最小可见性”修改器。例如,在几乎所有情况下,字段都应该是私有的 方法可以是:
- private-如果它们仅在当前类中用作助手
- 受保护,如果您希望它们仅可供子类访问,而不可供其他类访问。这是当您为继承设计类时,您希望为子类提供钩子
- 包私有-如果您想在同一个包中使用这些方法,但不想将它们公开给外部世界
Joshua Bloch关于API设计的文章(特别是从29:00开始)这是一个面向对象的概念。首先,例如,“final”是一个修饰符,它将使该变量成为一个“常量”,如果你需要一个常量,你就必须使用它。当您开始编写实际项目时,您将看到这种封装的优势。不要低估它 例如,当您编写一个方法时,该方法可能会在将来发生变化
public void save(Person p){
this.saveInTheDataBase(p);
}
private void saveInTheDataBase(Person p){
database.save(p);
}
private void saveInFile(Person p){
file.save(p);
}
然后,您的客户机将调用save();例如,如果您有一个库,希望能够在不改变代码太多的情况下进行更新,而不必考虑它保存在哪里,那么它将非常有用。公共方法通常保持不变,而私有方法可以更改。如果库作者将所有内容公开,库用户可能会意外地使用这些特定于实现的方法,从而使更新库变得更加困难。关键在于您的API暴露了多少,因此,当您更改它时,有多少API将被破坏
您可以随时更改代码,并且您知道您只会影响该文件中您自己的代码private
- 默认(包私有)您仍然只影响您自己的代码(某些包欺骗可能除外),但您必须检查更多
:其他人的代码可能正在使用它,但由于它仅限于子类,他们通常可以相当轻松地更新代码protected
代码可能被其他人的代码广泛使用。更改此选项可能会迫使其他人在整个项目中修改他们的代码。如果您知道其他人正在使用您的代码,您可能不应该更改这些方法,除非您发布了一些标记为public
的版本,以便这些人可以在代码崩溃之前进行更改以更新其代码@deprecated
private
在运行时肯定存在。否则,java.lang.reflect.Field.setAccessible
就没有意义了。@Kirk我很肯定我在这个网站上看到过一篇帖子,上面说的是相反的话。如果我把它挖出来,我会让你知道,同时我会删除我以前的评论