2010-04-15 46 views
9

在java中,public/private/other方法的含义是什么?
这些选项的优点和缺点是什么?
作为一个想成为一名优秀程序员的人,我的动力是什么?在java中,public/private/other方法的含义是什么?

+9

孙教程:http://java.sun.com/docs/books/tutorial/ java/javaOO/accesscontrol.html – BalusC 2010-04-15 16:50:35

+0

我接下来是教程或基本的OOP教程。在数据封装/访问方面,所有OO语言的概念都是相同的。 – 2010-04-15 16:52:25

+0

OOP代表什么? – David 2010-04-15 16:55:25

回答

13

当一个方法是公共这意味着它可以被其他的对象

例如被访问:

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 
} 

但是,如果你能大卫类中使用它

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为私有(所以,没有人可以访问它)

在另一方面,这将是非常有用的来public方法如getGender找出您的实例是男性还是女性。

还有其他接入改性剂如:“受保护”和保护的包(其不具有关键字)

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

有所述方法getBalance只能通过David实例和David子类accesed(创建用于什么是子类的另一个线程)

方法knowsOop可以由包中的任何人按照David的定义进行访问。

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

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

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

我希望这有助于

0

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

+0

你能否详细介绍一下? – David 2010-04-15 16:55:10

+0

对象可能有状态;例如,它可能具有可变前景和背景颜色的属性。该状态将作为某种类型的变量的值保存在对象中。实施者可能希望规定对颜色如何变化的限制(例如,两种颜色可能不相同)。如果变量是公开的并且可以直接访问,那么用户可能违反条件(又称不变),将对象转换为意料之外的/非法的状态。实现者可以使变量保密,并通过公共方法允许有效的变异。 – 2010-04-15 17:27:01

1

HThe public,protected和private修饰符控制其他代码可以看到这些方法(或字段)的内容。这是关于控制你正在暴露的界面。

的很常用的有:

public修饰符:任何其他可以看到你的方法。

私人修改:没有代码,除了你的类和任何内部类可以看到你的方法。

例如,如果您想确保创建的类只有一个实例(singleton pattern),这些将很有用。你可以使构造私人,创建一个单一的实例和存储作为一个私有成员称为实例,并提供一个公共的方法是这样的:

public static MyObject getInstance() { 
    return instance; 
} 

,所以你能保证将只有每一个是一个实例。


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

另一个例子可能是你有一个复杂的公共方法,你想把它分解成更简单的部分。你可以把它分解成简单的方法,每个方法都是完成工作的一部分,但你不希望其他代码调用这些方法,因为它们不会自己工作 - 所以你可以使小方法保密,确保他们不能在你的班级以外被调用。

+0

您能否详细了解实用性? – David 2010-04-15 16:59:23

+0

不能调用多次MyObject吗?这不会导致创建类的多重实例吗? – David 2010-04-15 17:03:13

+0

否 - 调用MyObject.getInstance()不会创建新实例,它只会返回已创建的实例。重复的调用将继续返回相同的实例。 – Brabster 2010-04-15 17:04:59

1

Private方法只能在类中调用。您可以拨打电话public您的课程在任何地方的方法。没有访问修饰符的方法意味着包的可见性范围(它被称为默认),所以你可以在包中定义类的地方调用它。

http://en.wikipedia.org/wiki/Object_oriented_programming#Encapsulation

+0

我的动力是什么让一个方法只能在课堂内部调用? – David 2010-04-15 16:58:22

+0

有时你只有在课堂上需要的方法。它可以是一些转换功能或任何其他补充的代码。 – Dmitry 2010-04-15 17:09:26

+1

在公共方法本身中实现通过公共方法公开的功能并不总是可取的。公共方法可能需要调用其他方法来执行其行为。这些其他方法因此旨在用于内部使用,并应标记为私人。 – 2010-04-15 17:13:56

5

一个公共方法可以从任何地方访问,只能从同一类的私有方法。主要优点是对类的API的控制。如果我只公开需要什么,我可以改变一个类的内部行为,而不会根据这个类破坏代码。你应该关心,因为软件在现实世界中经常发生变化(至少这是我的经验,其他人也有这种感觉),每一次变更都会中断,你需要投入更多的精力或者软件有更多的错误。最后,这是一个成本问题。

从这个类的用户隐藏你的类的内部以避免以后改变破坏代码的可能性通常称为封装或information hiding

除了公共和私人的两个选项是包(没有修饰符)和保护。程序包可访问的方法也可以从相同程序包的类中访问。我不记得以任何有用的方式使用该选项。受保护的方法可以从类中进行访问,这些类继承了所讨论的类。这通常用于为基类定义的API创建具有具体行为的类。例如,你可以通过扩展AbstractList来实现一个新的List类,你只需要实现get和size(以及一个可修改列表的set-method)。 List的API公开的其他方法在基类中定义,如果需要的话调用其他三个方法。

0

对于初学者,我会尽可能地开始限制访问。从private开始。如果你碰巧需要从别的地方的构造函数,方法或字段,但不能访问它由于限制,那么下一步将是要问自己:

  1. 如果它是一个方法,你真的需要访问它?它会改变类/实例的行为吗?你不应该让那个班做这项工作吗?当前课程(需要该领域或方法)是否不应该为该课程提供更紧张的体系?
  2. 如果它是一个领域,你需要获得或设置它的价值?你不应该添加一个方法吗?

点1避免了错误的耦合,点2改善了封装。一旦你考虑了上述内容并得出结论,确实需要更少的限制,那么将其设置为更进一步打开。

相关问题