java中的public作用_JAVA中的作用域public、private、protected、default深度理解,为什么这么做?...

很多初学者(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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值