前言
Java提供了访问权限的关键词,通过这些关键词,类库的开发者就可以向使用这个类库的开发者指明那些字段
、方法是可以用的,那些是不可以用的。字段、方法的访问权限等级有四个,从大到小分别是:public、protected,包访问权限(没有关键词),private。
正文
艺术来源于生活,又高于生活,编程语言也是如此。这个访问权限怎么用现实场景来还原呢?当今社会确实是一个拜金的社会,那就用财产来说明吧。先在home包里面创建两个类,一个father,一个是mother。代码如下:
father类
package home;
/**
* 类说明:老爸类,有四种类型的财产(都是private的),通过四种访问权限,访问使用这些财产
* @author l2h
*
*/
public class Father {
private double privateMoney;//老爸藏的私房钱,自己才能用的
private double protectedMoney;//这是留给富二代儿子的钱。protected也提供包访问权限。也就是说,相同包内的其他 //<span style="font-family: Arial, Helvetica, sans-serif;">成员也可以访问</span>
private double packageMoney;//放在屋内只有住在一个屋子里的人才能用的一毛,五毛零钱,即包访问权限
private double publicMoney;//这是纳税的钱
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
spendPrivateMoney();
}
/**
* 方法说明:花私房钱,这钱只能是老爸偷偷用,即使妈也不能用。方法设置为private,该只能在类内部使用。
*/
private static void spendPrivateMoney(){
System.out.println("花私房钱");
}
/**
* 方法说明:花住一个屋子里的人才能用的钱,比如一毛,5毛这样的零钱,放在一起,屋子里的人都能拿来用。
* 方法没有关键词修饰,就是包访问权限。
*/
void spendPackageMoney(){
System.out.println("花放在房间内的零钱"+this.packageMoney);
}
protected void spendProtectedMoney() {
System.out.println("花留给儿子的钱"+this.protectedMoney);
}
public void spendPublicMoney() {
System.out.println("花纳税的钱"+this.publicMoney);
}
}
mother类:
package home;
/**
* 类说明:老妈类。家庭主妇负责花老爸的钱
* @author Administrator
*
*/
public class Mother {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Father husband = new Father();
husband.spendPackageMoney();//花老公放在家里的零钱
husband.spendPublicMoney();//花纳税的钱,税收取之于民用之于民
husband.spendProtectedMoney();//留给儿子的钱跟放在家里的零钱一样也是可以花的。同包类访问
}
}
从中可以看出,father跟mother同一在home包。mother可以花老爸私房钱外的钱,包括packageMoney,protectedMoney,publicMoney。这也说明了,protected关键词提供了同包访问权限。
接下来,在home2中创建了两个类,一个是Son类(因为java只能单继承,所以只继承father)和DaugtherInLaw类(儿媳妇)。代码如下:
Son类
package home2;
import home.Father;
/**
* 儿子类。儿子长大了不跟父母住一块,所以son类在home2包
* @author Administrator
*
*/
public class Son extends Father {
public void spendFatherPublicMoney() {
spendFatherPublicMoney();
}
public void spendFatherProtectedMoney() {
spendProtectedMoney();
}
//不能花老爸放在家里的零钱,因为他跟父母不住一起,这个钱对于他来说不可视。即不在同一个包内
public void spendFatherPackageMoney() {
//spendPackageMoney();报错
}
//不能花老爸放在家里的零钱,因为他跟父母不住一起,这个钱对于他来说不可视。即不在同一个包内
public void spendFatherPrivateMoney() {
//spendPrivateMoney;报错
}
}
DaugtherInLaw类:
package home2;
import home.Father;
/**
* 儿媳妇类。
* @author l2h
*
*/
public class DaugtherInLaw {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Father father = new Father();
//father.spendPackageMoney();//报错。不跟公公住在一个一起,不能花花这钱
father.spendPublicMoney();//花纳税的钱,税收取之于民用之于民
//father.spendProtectedMoney();//报错。爸留给的丈夫的钱,只能丈夫花
}
}
从Son类中可以看出,他只能访问
protectedMoney,
publicMoney,跟father不同包所以packageMoney不能访问。而DaugtherInLaw跟father是继承关系,也不同包因此只能访问publicMoney。
通过上面的例子我们可以看出,public关键词修饰的字段或者方法权限是最大的,其次是protected关键词修饰的,因为它不仅提供了同包访问权限而且其子类也可以访问,接下来是没有关键词修饰的(即常说的默认访问权限)只能在同包内访问,权限最小的当然是private修饰的,只能在类本身中访问。
总结
前面说明了java中的四种访问权限控制,主要是为了应用于我们的实际开发中。通常提供给客户端程序员(使用别人提供的jar包的程序员)的接口方法定义成public;如果服务端程序员(开发jar供别人使用的程序员)希望某个特定成员或方法,把它的访问权限赋予派生类而不是所有类,那么就使用protected;如果服务端程序员(开发jar供别人使用的程序员)开发一个工具jar包时,将功能相关的工具类组织在一起,希望某些方法只许创建这个jar包的人使用时,那么就不需要添加任何访问权限关键词;当希望某些成员或方法别人不能访问时,使用private。