## Java编程那些事儿64——访问控制符、修饰符和其它关键字
作者:陈跃峰
出自:[http://blog.csdn.net/mailbomb](http://blog.csdn.net/mailbomb)
### 8.6 访问控制符
访问控制符的作用是说明被声明的内容(类、属性、方法和构造方法)的访问权限,就像发布的文件一样,在文件中标注机密,就是说明该文件可以被那些人阅读。
访问控制在面向对象技术中处于很重要的地位,合理的使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来降低整个项目的复杂度,也便于整个项目的开发和维护。具体的实现就是通过访问控制符将类中会被其它类调用的内容开放出来,而把不希望别人调用的内容隐藏起来,这样一个类开放的信息变得比较有限,从而降低了整个项目开放的信息,另外因为不被别人调用的功能被隐藏起来,在修改类内部隐藏的内容时,只要最终的功能没有改变,即使改变功能的实现方式,项目中其它的类不需要更改,这样可以提高了代码的可维护性,便于项目代码的修改。
在Java语言中访问控制权限有4种,使用三个关键字进行表达,依次如下:
1. public——公共的
2. protected——受保护的
3. 无访问控制符——默认的
4. private——私有的
其中无访问控制符是指不书写任何的关键字,也代表一种访问权限,访问控制符的使用示例如下所示:
~~~
public class AccessControl {
intn;
publicAccessControl(){
init();
}
privatevoid init(){}
protected void test(int k){}
}
~~~
该示例代码中演示了各个访问控制符的实际使用示例,其中属性n的访问控制符就是默认的。
在实际使用时,类声明的访问控制符只有2个:public和无访问控制符,属性声明、构造方法声明和方法声明的访问控制符可以是以上4种中的任何一个。
这4个访问控制符的权限作用如下表所示:
<table class="MsoNormalTable" style="border: medium none ; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0"><tbody><tr style=""><td style="border: 1pt solid black; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal"><span style="font-family: 宋体;">访问控制符</span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;" valign="top" width="104"> <p class="MsoNormal"><span style="font-family: 宋体;">同一个类内部</span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal"><span style="font-family: 宋体;">同一个包内部</span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 3cm;" valign="top" width="113"> <p class="MsoNormal"><span style="font-family: 宋体;">不同包中的子类</span></p> </td> <td style="border-style: solid solid solid none; border-color: black black black -moz-use-text-color; border-width: 1pt 1pt 1pt medium; padding: 0cm 5.4pt; width: 99.2pt;" valign="top" width="132"> <p class="MsoNormal"><span style="font-family: 宋体;">不同包中的非子类</span></p> </td> </tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">public</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 3cm;" valign="top" width="113"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 99.2pt;" valign="top" width="132"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> </tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">protected</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 3cm;" valign="top" width="113"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 99.2pt;" valign="top" width="132"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> </tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: 宋体;">无访问控制符</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 3cm;" valign="top" width="113"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 99.2pt;" valign="top" width="132"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> </tr><tr style=""><td style="border-style: none solid solid; border-color: -moz-use-text-color black black; border-width: medium 1pt 1pt; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">private</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 77.95pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">Yes</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 78pt;" valign="top" width="104"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 3cm;" valign="top" width="113"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> <td style="border-style: none solid solid none; border-color: -moz-use-text-color black black -moz-use-text-color; border-width: medium 1pt 1pt medium; padding: 0cm 5.4pt; width: 99.2pt;" valign="top" width="132"> <p class="MsoNormal" style="text-align: center;" align="center"><span lang="EN-US">No</span></p> </td> </tr></tbody></table>
说明:在该表中,Yes代表具备对应的权限,No代表不具备对应的权限。
在4种访问控制中,public一般称作公共权限,其限制最小,也可以说没有限制,使用public修饰的内容可以在其它所有位置访问,只要能访问到对应的类,就可以访问到类内部public修饰的内容,一般在项目中开放的方法和构造方法使用public修饰,开放给项目使用的类也使用public修饰。protected一般称作继承权限,使用protected修饰的内容可以被同一个包中的类访问也可以在不同包内部的子类中访问,一般用于修饰只开放给子类的属性、方法和构造方法。无访问控制符一般称作包权限,无访问控制符修饰的内容可以被同一个包中的类访问,一般用于修饰项目中一个包内部的功能类,这些类的功能只是辅助其它的类实现,而为包外部的类提供功能。private一般称作私有权限,其限制最大,类似于文件中的绝密,使用private修饰的内容只能在当前类中访问,而不能被类外部的任何内容访问,一般修饰不开放给外部使用的内容,修改private的内容一般对外部的实现没有影响。
下面以两个基本的示例来说明访问控制符在实际项目中的使用方式。
第一个使用示例:在项目中,一般不会将类的属性开放给其它的类,也就是不允许外部的类直接访问属性,而是使用对应的存取方法来进行访问。例如在学校的学员管理系统中,需要实现的学生类,按照访问控制符的一般使用规则,实现的代码如下:
~~~
/**
* 学员类,演示访问控制符的使用
*/
public class Student {
/**年龄*/
private int age;
/**学员ID*/
private int id;
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 0){
//处理代码,未实现
}
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
//校验id是否合法的代码,未实现
this.id = id;
}
}
~~~
通过将属性的访问权限设定为private,限制所有类外部对属性的访问,而为了让外部可以访问这些属性,专门声明对应的get/set方法来读取/存储数据,这样在设置属性值的set方法中,可以对于参数做出基本的校验,在上面的示例代码中,留出了校验参数的位置,具体的代码未在示例代码中实现。
小技巧:在eclipse中,get和set方法可以在选中对应类的代码以后,使用“Source”菜单中的“Generate Getters and Setters…”菜单实现。
第二个使用示例:在项目中,一般为了设计的需要实现一些特定的功能,下面介绍一下使用访问控制符实现的一个功能——使一个类既不能创建对象也不能被继承。实现的方法如下:该类中只实现一个构造方法,而且将该构造方法的访问权限设置为私有的。具体实现代码如下:
~~~
/**
* 不能创建对象且不能被继承的子类
*/
public class PrivateDemo {
private PrivateDemo(){}
}
~~~
在该示例中,PrivateDemo类只有一个构造方法,且该构造方法为私有。按照以前的介绍,创建对象时需要调用构造方法,而private修饰的构造方法无法在类的外部进行访问,所以无法创建对象。另外,在子类的构造方法中也需要调用父类的构造方法,由于private的构造方法无法得到调用,所以该类也不可以有对应的子类。
这里说明的只是两个基本的用途,在实际的项目中,可以根据需要灵活的使用访问控制符实现对应的功能。
总之,访问控制符通过控制声明的内容的访问权限,实现对于内容的隐藏,从而降低使代码的耦合性降低,降低项目的复杂度,并且方便实际项目中代码的维护。
- 前言
- (1)序言
- (2)程序设计是什么?
- (3)你适合学习程序设计吗?
- (4)如何学好程序设计?
- (5)程序设计介绍小结
- (6)计算机软件基本概念
- (7)进制的概念
- (8)计算机内部的数据表达
- (9)网络编程基础
- (10)Java语言简介
- (11)JDK的获得、安装和配置
- (12)第一个HelloWorld程序
- (13)Eclipse基本使用
- (14)Eclipse基础使用进阶
- (15)如何学好Java语法
- (16)代码框架、关键字和标识符
- (17)基本数据类型
- (18)变量和常量
- (19)数据类型转换
- (20)空白、语句结束和注释
- (21)算术运算符
- (22)比较运算符
- (23)逻辑运算符
- (24)赋值运算符
- (25)位运算符
- (26)移位运算符
- (27)其它运算符
- (28)运算符优先级
- (29)表达式
- (30)流程控制基础
- (31)if语句语法(1)
- (32)if语句语法(2)
- (33)if语句语法(3)
- (34)switch语句语法
- (35)while语句语法
- (36)do-while语句语法
- (37)for语句语法
- (38)break和continue语句
- (39)流程控制综合示例1
- (40)流程控制综合示例2
- (41)流程控制综合示例3
- (42)流程控制综合练习
- (43)数组概述
- (44)数组基础语法
- (45)数组使用示例1
- (46)数组使用示例2
- (47)数组使用示例3
- (48)多维数组基础
- (49)多维数组使用示例1
- (50)多维数组使用示例2
- (51)多维数组练习
- (52)方法声明
- (53)方法声明示例
- (54)方法调用
- (55)方法重载和参数传递
- (56)方法练习
- (57)面向对象基础
- (58)类(一)
- (59)类(二)
- (60)对象
- (61)面向对象设计方法和面向对象特性(一)
- (62)继承(二)
- (63)多态性
- (64)访问控制符、修饰符和其它关键字
- (65)static修饰符
- (66)final修饰符
- (67)this和super
- (68)抽象类和接口(一)
- (69)抽象类和接口(二)
- (70)抽象类和接口(三)
- (71)内部类简介
- (72)包的概念
- (73)JDK文档使用
- (74)java.lang包介绍1
- (75)String类使用
- (76)StringBuffer类和System类
- (77)包装类
- (78)时间和日期处理
- (79)Random随机处理
- (80)集合框架简述
- (81)异常处理概述
- (82)异常处理语法1
- (83)异常处理语法2
- (84)IO简介
- (85)IO类体系
- (86)文件操作之File类使用
- (87)文件操作之读取文件
- (88)文件操作之写文件
- (89)读取控制台输入
- (90)装饰流使用1
- (91)装饰流使用2
- (92)IO使用注意问题
- (93)多线程基础
- (94)多线程实现方式1
- (95)多线程实现方式2
- (96)多线程使用示例1
- (97)多线程使用示例2
- (98)多线程问题及处理1
- (99)多线程问题及处理2
- (100)多线程问题及处理3
- (101)网络编程概述
- (102)网络编程技术1
- (103)网络编程技术2
- (104)网络编程技术3
- (105)网络编程技术4
- (106)网络编程技术5
- (107)网络协议概念
- (108)网络编程示例1
- (109)网络编程示例2
- (110)网络编程小结