Java基础之访问权限控制
Java基础之访问权限控制
四种访问权限
Java中类与成员的访问权限共有四种,其中三种有访问权限修饰词:public,protected,private。
- Public:权限最大,允许所有类访问,但其他包下的类想要访问需使用
import
关键字将这些public类导入包中才可使用,换句话说,import
将不同包的类导入到一个包下,从而转化为包访问权限下的情况。 - Protected:除了提供包访问权限以外,还对继承该类的所有派生类赋予访问权限。
- Private:权限最小,只能由包含该成员(域和方法)的类本身访问,其他任何类都无法访问。
- 其中,默认情况下没有任何修饰词,这样的类成员具有“包访问权”,即位于同一个包中的类对其有访问权;而protected为“继承访问权”,即该类的子类对其具有访问权(同时,位于同一个包中的类也对其具有访问权)。
在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词。Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public。其权限控制如下表所示:
修饰词 | 本类 | 同一个包的类 | 继承类 | 其他类 |
private | √ | × | × | × |
无(默认) | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
而对于Java中的“类”(不是其内部成员,两者要区分开),其访问权限修饰词仅有public和“无”(即包访问权)两种,而没有private和protected(有 一个特例,就是“内部类”,其可以是private或protected的)。所以对于类的访问权限,你仅有两个选择:包访问权或是public。
如果你 不希望其他任何人对该类拥有访问权,你可以把所有的构造器都指定为private,从而阻止任何人创建该类的对象。但是有一个例外,就是在该类的 static成员内部进行创建。如:
class Soup {
// private Constructor!
private Soup() {}
// Allow creation via static method:
public static Soup makeSoup() {
return new Soup();
}
}
成员最终访问权限
- 类访问权限大小:
public
>包访问权限
。 - 成员访问权限大小:
public
>protected
>包访问权限
>private
。 - 成员和类的访问权限优先级:
类
>成员
。
成员最终访问权限为类权限和成员权限的叠加。只要类不是public
的,无论成员是哪种访问权限,静态与否(即对象成员还是类成员),包外的类都无法访问类成员(也无法静态调用),即对包外所有类不可见。
其实道理很简单,因为成员是通过类或类对象调用的,类权限比成员权限优先级高,所以无论成员权限多大,只要类不是public
的,就无法通过import
导入,该类根本就对包外的类不可见,类的成员更是不可见了。
所以,通常来说,只要类是包访问权限,其成员最多是包访问权限。而且书中也建议:在创建包访问权限的类时,应尽可能将类的域声明为private
的,这样才有意义
最新文章
- MySQL主从复制(Master-Slave)实践
- 使用 U盘 重装 Mac OSX
- IO流-输入输出
- ext3文件系统反删除利器-ext3grep
- iframe并排横着显示
- 【HDNOIP】HD201404最短路径
- [转]CentOS开机启动脚本
- 扩容盘、SD卡扩容
- HDU1151Air Raid(二分图的最大匹配)
- Oracle数据库作业-5 查询
- 关于String和StringBuffer的使用
- MySql中的事务嵌套
- C++赋值函数详解
- js实现淘宝首页图片轮播效果
- 高度-宽度关系,同一div、不同div高度与宽度关系控制函数
- linux下boost的安装与编译
- ios音乐播放器demo
- cocos2d-x_ Windows下Android环境搭建
- 字典dict
- macOS在使用音视频通话时会降低其他音频声音的解决方法