很多初学者(PS:我也是)在碰到作用域的理解时,很容易陷入误区,分不清楚protected和default的区别。好多教科书、论坛都误导了大家。
首先,讲下为什么java需要4种权限控制,而不是5种、6种。
private、public的设计很好理解,面向对象程序设计就是为了封装,自然要提供隐藏实现(private)、公布API(public)。而protected、default是为了解决包级别的访问控制的。
为啥要提供包级别控制?首先包的概念可以对应到模块的概念,有了包,你就可以把表达意义相近的类放到一起了,代码结构更清晰。更容易维护。想一想,如果所有人都在一个包内开发--com.hellword.* 全世界就一个包,维护得累死。
包的引入就带来的一个问题,我不想让别的包引用我,但是又想让自己包内的类访问我,怎么办?这就是default权限。
包的引入带来的第二个问题,别的包的开发人员继承了我的类,我想让子类能够看到,不想让子类所在的包看到我,怎么办?这就是protected权限。
所以,大家不要去区分那个权限大,那个权限小。以上4种权限的控制都是为了更合理的设计类的权限。简单来说就是,不该让别人看到的不让别人看到。
说了半天,还是上代码:
最难理解的:包的引入带来的第二个问题,别的包的开发人员继承了我的类,我想让子类能够看到,不想让子类所在的包看到我,怎么办?这就是protected权限。
首先是Father类的定义,注意Father类在com.test.www包内:
package com.test.www;
public class Father
{
protected int data;
}
其次是子类、测试类的定义,都在default包内:
public class testworkspace {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Son myson = new Son();
myson.Cout();
}
}
import com.huawei.www.*;
class Son extends Father
{
public void Cout()
{
data = 1;
System.out.println(data);
return;
}
} 以上代码如果把Father中的data定义改为int data;那么编译就会提示错误,提示子类找不到data。