Java类和方法问题

Java类和方法问题,java,access-modifiers,Java,Access Modifiers,作为一个从零开始学习Java的人,我了解一点Python,我一直想知道Java中所有的访问修饰符(public、static、protected…)是什么。我知道它们的意思,但为什么要用它们呢 这是一直困扰我的问题,因为每当我写一个新类,写实例变量时,我总是要问自己,我希望这个变量是私有的、公共的、最终的等等吗?我通常会得出结论,我不喜欢大多数变量和方法。我知道有几个实例需要从另一个类调用该方法,但为什么不公开所有方法呢?这是因为在大型项目中,你不能相信其他开发人员不会开始翻找和弄乱你的代码吗?

作为一个从零开始学习Java的人,我了解一点Python,我一直想知道Java中所有的访问修饰符(public、static、protected…)是什么。我知道它们的意思,但为什么要用它们呢


这是一直困扰我的问题,因为每当我写一个新类,写实例变量时,我总是要问自己,我希望这个变量是私有的、公共的、最终的等等吗?我通常会得出结论,我不喜欢大多数变量和方法。我知道有几个实例需要从另一个类调用该方法,但为什么不公开所有方法呢?这是因为在大型项目中,你不能相信其他开发人员不会开始翻找和弄乱你的代码吗?

访问修饰符是这样的,程序员可以用面向对象的方式编程,并使用数据封装来编写密封(或尽可能接近)的API


我同意,这并不总是可取的。这就是为什么还有其他选项。

在每种情况下都使用“最小可见性”修改器。例如,在几乎所有情况下,字段都应该是私有的

方法可以是:

  • private-如果它们仅在当前类中用作助手
  • 受保护,如果您希望它们仅可供子类访问,而不可供其他类访问。这是当您为继承设计类时,您希望为子类提供钩子
  • 包私有-如果您想在同一个包中使用这些方法,但不想将它们公开给外部世界
这些都与API设计有关——您希望API公开哪些功能,哪些不公开。也就是说,哪些方法是实现的内部方法,哪些方法应该被使用您的类来完成其工作的类使用

所有这些的优点是,您可以更改私有/包私有方法,而无需任何其他人,只有您自己的类/包依赖它们。把他们公之于众会让你支持他们。这不仅在设计像collections框架这样的API时是正确的。当您在自己的项目中设计自己的API时也是如此。类必须知道更少的方法(因此更容易更改和支持)


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
    的版本,以便这些人可以在代码崩溃之前进行更改以更新其代码


但我的问题是,使用私有比公共有什么好处?请详细说明。I7m不确定这意味着什么。@Woot4Moo,
private
在运行时肯定存在。否则,
java.lang.reflect.Field.setAccessible
就没有意义了。@Kirk我很肯定我在这个网站上看到过一篇帖子,上面说的是相反的话。如果我把它挖出来,我会让你知道,同时我会删除我以前的评论