在java中公共/私有/其他方法的含义是什么意思?

时间:2010-04-15 16:49:05

标签: java methods

java中公共/私有/其他方法的含义是什么? 这些选项有哪些优点和缺点?
作为一个想成为优秀程序员的人,我的动力是什么呢?

6 个答案:

答案 0 :(得分:14)

如果方法公开,则表示其他对象可以访问

例如:

class David {
     // public method, can be use by anyone
     public String getName() {
         return "David";
      }
 }

方法getName可能被其他类访问,因为它是公共的:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); //<-- compiles and runs
 }

优势......你可以在其他地方使用它。

如果方法私有,则表示只能通过同一类

对象访问它

例如,在这个新定义中:

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instances" can use it.. 
     private int getAge() {
         return 19;
     } 

 }

其他类无法访问方法getAge,因为它是私有的,如果你尝试这样做,编译器会给你一个错误信息:

 class Other  {
      David davidOne = new David();
      String davidsName = davidOne.getName(); 
      int davidsAge = davidOne.getAge(); //<-- Compiler error, getAge() is not visible
 }

但是,如果您可以在 David类中使用

class David {
     public String getName() {
         return "David";
     }
     // private method... nobody but David's "instance" can use it.. 
     private int getAge() {
         return 19;
     } 
     // Here the call to "getAge()" will succeed, because it is visible 
     // inside the class 
     public boolean hasSameAgeAs( David otherDavid ) {
         return this.getAge() == otherDavid.getAge();
     }
 }

优势?您可以创建一系列方法并将其保密,避免数据损坏或一般保留对象encapsulated

关于封装

OOP(面向对象编程)中,目的是在真实对象之后对软件进行建模。

现实生活对象具有访问这些属性的属性和方法(以及其他内容)。

您希望公开其中一些方法,并保留其他方法。

例如,人类存在,有一颗心。但它并没有暴露给所有人,这将是危险的。它在我们体内封装

如果我们要在真正的之后对软件进行建模,我们可以将方法声明为:heartBeat为私有(因此,没有人可以访问它)

另一方面,像getGender这样的公共方法来判断你的人类实例是男性还是女性是很有用的。

还有其他访问修饰符,例如:“protected”和package protected(没有关键字)

 class David {
      // protected method
      protected int getBalance() { 
          return 1000000; 
      }
      // package protected or "default" method
      boolean knowsOop(){ 
          return true;
      }
 }

方法getBalance只能由David个实例和David子类加入(为子类创建另一个线程)

方法knowsOop可以在定义David时由包内的任何人访问。

不要担心这两个访问修饰符,当您了解有关OOP和Java的更多信息时,它们会有意义。

最后你应该真的,真的需要时间阅读:

http://java.sun.com/docs/books/tutorial/java/javaOO/index.html

我希望这会有所帮助

答案 1 :(得分:5)

可以从任何地方访问公共方法,只能从同一个类访问私有方法。主要优点是控制类的API。如果我只公开所需的东西,我可以改变类的内部行为,而不会破坏代码,具体取决于这个类。您应该关心,因为软件经常在现实世界中发生变化(至少这是我的经验,而其他人也有变化),每次更改都会中断,您需要投入的维护能量越多,或者软件的错误就越多。最后,这是一个成本问题。

为了避免以后的更改破坏代码,可能会将类的内部隐藏到此类的用户,这通常称为封装或information hiding

除了public和private之外的两个选项是package(没有修饰符)和protected。也可以从同一个包的类中访问包可访问的方法。我不记得以任何有用的方式使用该选项。可以从继承有问题的类的类访问受保护的方法。这通常用于为基类的已定义API创建具有具体行为的类。例如,你可以通过扩展AbstractList来实现一个新的List类,你只需要实现get和size(以及一个可修改列表的set方法)。 List的API公开的其他方法在基类中定义,如果需要,调用其他三种方法。

答案 2 :(得分:1)

公共,受保护和私有修饰符控制其他代码可以看到这些方法(或字段)的内容。它是关于控制你正在暴露的界面。

通常有用的是:

公共修饰符:任何其他人都可以看到你的方法。

私有修饰符:除了你的类之外没有代码,任何内部类都可以看到你的方法。

如果您想确保只创建了一个类的单个实例(singleton pattern),这些将非常有用。您可以将构造函数设为私有,创建单个实例,将store存储为名为instance的私有成员,并提供如下公共方法:

public static MyObject getInstance() {
  return instance;
}

所以你可以保证只有每一个实例。


更新 - 请求的另一个示例。

另一个例子可能是你有一个复杂的公共方法,你想把它分解成更简单的部分。您可以将其分解为更简单的方法,每个方法都可以完成部分工作,但您不希望其他代码调用这些部分方法,因为它们不能自行工作 - 因此您可以将较小的方法设为私有,从而确保他们不能在你的课外打电话。

答案 3 :(得分:1)

私有方法只能在类中调用。您可以在程序的任何位置调用类的公共方法。没有访问修饰符的方法意味着具有包可见性范围(它被称为默认),因此您可以在包中定义类的任何位置调用它。

请参阅http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

答案 4 :(得分:0)

主要原因是封装:不允许访问对象的内部状态。

答案 5 :(得分:0)

对于初学者,我会尽可能地开始限制访问。从private开始。如果您碰巧需要来自其他地方的构造函数,方法或字段,但由于限制而无法访问它,那么接下来的步骤就是问自己:

  1. 如果是方法,你真的需要访问吗?它是否会改变类/实例的行为?你不应该让那个班级做这项工作吗?当前的类(需要该字段或方法)是否应该更加严格到该类?
  2. 如果是某个字段,您是否需要获取或设置其值?你不应该添加一个确切的方法吗?
  3. 点1避免错误耦合,点2改善封装。一旦你考虑了上述内容并得出结论认为实际上需要的限制较少,那么将其设置为一步或更多步。