java中公共/私有/其他方法的含义是什么?
这些选项有哪些优点和缺点?
作为一个想成为优秀程序员的人,我的动力是什么呢?
答案 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改善封装。一旦你考虑了上述内容并得出结论认为实际上需要的限制较少,那么将其设置为一步或更多步。