学了Java也有几年了,可是今天突然发现自己居然还是没弄清Java最最基本的访问权限问题:public(公开的)、protected(受保护的)、private(私有的)、friendly(即不写,默认情况下的)
首先这是我在百度以后得到的比较好的讲解文章,大家感兴趣的可以去看看!!!
借用一下上文中的访问权限表格:
由上图可以看出:
在同一个类下【就像是夫妻俩的财产,谁用不都是用么】,是不受访问权限所限制的,所谓的访问权限仅仅是对外而言的;
亲身测试:
public class PermissionTest {
private String namePri; //私有成员变量
protected String namePro;//受保护的成员变量
public String namePub;//公有成员变量
String nameDef; //默认访问权限的成员变量
protected void showMe(){
System.out.println("This is my demo!");
}
public String getNamePri() {
return namePri;
}
public void setNamePri(String namePri) {
this.namePri = namePri;
}
public String getNamePro() {
return namePro;
}
public void setNamePro(String namePro) {
this.namePro = namePro;
}
public String getNamePub() {
return namePub;
}
public void setNamePub(String namePub) {
this.namePub = namePub;
}
public String getNameDef() {
return nameDef;
}
public void setNameDef(String nameDef) {
this.nameDef = nameDef;
}
public static void main(String[] args) {
PermissionTest pt = new PermissionTest();
pt.XXX; //本处查看可调用到的对象属性
}
}
测试截图:
在同一个包(package)下,私有便被隐藏了,因为人家都说是私有的了,当然是人家藏起来自己没事欣赏的,咱们是看不到了,至于其他的(protected、public以及默认的),还是可以正常访问的;
亲身测试,同一包下:
public class SamePack extends PermissionTest{
public static void main(String[] args) {
PermissionTest pt = new PermissionTest();
pt.XXX; //本处查看可调用到的对象属性
}
}
测试截图:
在不同包中的非子类,既不同族(指的是同一个包下)又不是亲生的(说的是继承或实现喽),我想绝大数人都不会这么大方,把遗产家产留给外人吧。。。。。。 当然还是会有类似比尔盖茨之类的好人的(就比如public)。也就是在非亲非故的情况下,只有public修饰的内容是可以被访问到的;
亲身测试不同包下:
public class SamePack{
public static void main(String[] args) {
PermissionTest pt = new PermissionTest();
pt.XXX; //本处查看可调用到的对象属性
}
}
测试截图:
最后是不同包下的子类,我不说相信大家都知道,这就是所谓的【私生子】了,当然要留一部分财产出来给人家的(protected的访问权限),public就不多了... 。。。
注:在这儿得先强调一下,省得大家自己实践的时候会像我一样还要费事的去查:
上面的前三项你如果当作方法修饰符的作用域问题来看,没什么问题,但是最后一项,也就是protected在不同包的子类访问这一项,就会发现自己错了,因为你会像我一样遇到以下错误:
我的错误情况,正如下图中所看到的,居然只有public的属性,那protected的又跑到哪儿去了呢???
看的我一脸蒙蔽啊 , 明明说好protected的修饰可以被不同包下的子类所访问的嘞,怎么到我这儿不好使了 唉....
:
查了好久终于有点眉目了,原来我一直理解上就有错误,所谓的protected修饰,是指子类可以继承,重写,访问 ,是相当于在子类定义了该方法也就是在子类的创建中可以正常继承使用到父类中的受保护对象,而不是所谓的属性调用,就如下图所示:
子类中的方法调用:
看到这儿,相信大家也看懂了一些,我的理解也就到这儿了,希望对大家有所帮助!!!