Java类和方法问题

时间:2010-11-06 15:22:34

标签: java access-modifiers

当有人从头学习Java,谁知道一点Python时,我一直想知道Java中的所有访问修饰符(public,static,protected ...)是什么。我知道他们的意思,但为什么要使用它们?

这只是困扰我的事情,因为无论何时我写一个新类并编写实例变量,我都要经常问自己,我是否希望这个变量是私有的,公共的,最终的等等?我通常得出结论我不关心大多数变量和方法。有几个实例,我知道我需要从另一个类调用该方法,但为什么不公开所有方法呢?是因为在大型项目中你不能相信另一个开发人员不会开始四处搜索并弄乱你的代码吗?

5 个答案:

答案 0 :(得分:4)

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

方法可以是:

  • private - 如果它们仅在当前类中使用,则作为帮助程序。
  • protected,如果您希望它们只能被子类访问,而不能访问其他类。这是在为继承设计类时,并且想要为子类提供钩子。
  • package-private - 如果您想在同一个包中使用这些方法,但又不想将它们暴露给外界

这些都与API设计有关 - 您希望API公开哪些功能,哪些不公开。也就是说 - 哪些方法是您实现的内部方法,哪些方法可以由使用您的类来完成其工作的类使用。

所有这一切的优点是你可以更改私有/包私有方法,而不是你自己的类/包依赖它们。将它们公之于众,可以为您提供支持。不仅在设计像集合框架这样的API时也是如此。当您在自己的项目中设计自己的API时也是如此。类必须知道更少的方法(因此更容易更改和支持)。

Joshua Bloch关于API设计的

See this presentation(特别是从29:00开始)

答案 1 :(得分:0)

访问修饰符是程序员可以以OO方式编程并使用数据封装来编写气密(或尽可能接近)的API。

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

答案 2 :(得分:0)

这是一个OO概念。首先,例如,“final”是一个修饰符,它将使该变量成为“常量”,然后如果你需要一个constat,你必须使用它。当您开始编写现实生活项目时,您将看到具有此类封装的优势。不要低估它。

例如,您编码的方法可能会在未来发生变化。

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();没有注意保存的地方

答案 3 :(得分:0)

例如,如果您希望能够在不改变代码的情况下更新库,那么它就非常有用。公共方法通常会保留,而私人方法可以改变。如果图书馆作者将所有内容公之于众,图书馆用户可能会意外地使用这些特定于实现的方法,从而使更新库变得更加困难。

答案 4 :(得分:0)

所有关于你的API的暴露程度,以及更改它时会破坏多少。

  • private代码可以随时更改,并且您知道您只会在该文件中影响您自己的代码。

  • 默认(包私有)你仍然只影响你自己的代码(可能除了某些包欺骗),但你必须检查更多。

  • protected:其他人的代码可能正在使用它,但由于它仅限于子类,因此通常可以非常轻松地更新代码。

  • public代码可能被其他人的代码广泛使用。改变这种情况可能会迫使其他人在整个项目中修改他们的代码。如果您知道其他人正在使用您的代码,您可能不应该更改这些方法,直到您发布了一些标记为@deprecated的版本,以便这些人在更改代码之前更新代码