8.6 访问控制符
访问控制符的作用是说明被声明的内容(类、属性、方法和构造方法)的访问权限,就像发布的文件一样,在文件中标注机密,就是说明该文件可以被那些人阅读。
访问控制在面向对象技术中处于很重要的地位,合理的使用访问控制符,可以通过降低类和类之间的耦合性(关联性)来
降低整个项目的复杂度,也便于整个项目的开发和维护。具体的实现就是通过访问控制符将类中会被其它类调用的内容开放出来,而把不希望别人调用的内容隐藏起
来,这样一个类开放的信息变得比较有限,从而降低了整个项目开放的信息,另外因为不被别人调用的功能被隐藏起来,在修改类内部隐藏的内容时,只要最终的功
能没有改变,即使改变功能的实现方式,项目中其它的类不需要更改,这样可以提高了代码的可维护性,便于项目代码的修改。
在Java语言中访问控制权限有4种,使用三个关键字进行表达,依次如下:
<!--[if !supportLists]-->l <!--[endif]-->public——公共的
<!--[if !supportLists]-->l <!--[endif]-->protected——受保护的
<!--[if !supportLists]-->l <!--[endif]-->无访问控制符——默认的
<!--[if !supportLists]-->l <!--[endif]-->private——私有的
其中无访问控制符是指不书写任何的关键字,也代表一种访问权限,访问控制符的使用示例如下所示:
public class AccessControl {
int
n;
public
AccessControl(){
init();
}
private
void init(){}
protected void test(int k){}
}
该示例代码中演示了各个访问控制符的实际使用示例,其中属性n的访问控制符就是默认的。
在实际使用时,类声明的访问控制符只有2个:public和无访问控制符,属性声明、构造方法声明和方法声明的访问控制符可以是以上4种中的任何一个。
这4个访问控制符的权限作用如下表所示:
访问控制符
|
同一个类内部
|
同一个包内部
|
不同包中的子类
|
不同包中的非子类
|
public
|
Yes
|
Yes
|
Yes
|
Yes
|
protected
|
Yes
|
Yes
|
Yes
|
No
|
无访问控制符
|
Yes
|
Yes
|
No
|
No
|
private
|
Yes
|
No
|
No
|
No
|
说明:在该表中,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的构造方法无法得到调用,所以该类也不可以有对应的子类。
这里说明的只是两个基本的用途,在实际的项目中,可以根据需要灵活的使用访问控制符实现对应的功能。
总之,访问控制符通过控制声明的内容的访问权限,实现对于内容的隐藏,从而降低使代码的耦合性降低,降低项目的复杂度,并且方便实际项目中代码的维护。
分享到:
相关推荐
java的控制符可分为两大类,一种是访问控制符,另一种是非访问控制符。我们上文提到的public,private便是访问控制符了。 访问控制符:访问控制符的作用是说明被声明的内容(类、属性、方法和构造方法)的访问权限 ...
Visual Studio 2010 关键字是对编译器具有特殊意义的预定义保留标识符。 它们不能在程序中用作标识符,除非它们有一个 @ 前缀。
Java 访问修饰符 public protected private
JAVA编程核心结构图与控制修饰符汇总表。简单明了。
实验目的 理解掌握Java类修饰符、访问控制符等;理解熟悉String类的equals方法和= =运算符;进一步熟悉面向对象基本概念;熟悉Java中对象声明、创建、访问、参数传值等基本语法;
private 关键字是访问控制修饰符,可以应用于类、方法或字段(在类中声明的变量)。 只能在声明private(内部)类、方法或字段的类中引用这些类、方法或字段。在类的外部或者对于子类而言,它们是不可见的。 所有类...
本文档介绍了Java中的访问控制权限修饰符。它解释了public、private、protected和默认访问级别的含义和用法,以及它们在类、接口、成员变量和方法中的应用。 能学到什么 通过阅读本文档,您将学习以下内容: 不同...
java 四种关系修饰符访问(csdn)————程序
Java和C# 中访问修饰符 及其对比说明
Java入门——Java修饰词总结
上章讲了访问控制符,这章开始讲非访问控制符。 java中的非访问修饰符的作用各不一样,据我所知常用的有六种: static final abstract synchronized volatile transient 今天我们只讲前三种,后面三种等我们讲到线程...
计算机二级摸底测验J继承和接口和java访问权限修饰符总结ava题目
Python编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docxPython编程——修饰器.docx
详细介绍java访问修饰符与费访问修饰符
经过长时间的学习和经验的积累,我总结出JAVA访问修饰符的全部特性和使用范围,外加使用权限,另外我还总结了一下关于接口,抽象类的一些特性
java访问权限修饰符public.doc
java的访问控制符分为两类:类的访问控制符,属性和方法的访问控制符。 1. 类的访问控制符有两种:public, default(默认的,什么都不用写) default是包内访问控制符。 当然对于内部类还可以有static修饰,...
PHP中有三种访问修饰符,分别是: public(公共的、默认) protected(受保护的) private(私有的) 它们可以分别用在类的属性和方法上(类的属性和方法统称为类的成员),用来修饰类成员的访问权限。 public(公共的...
父子类可以是不同包 在不同包下面只有public 与 protected 可以访问,而且protected必须是在继承关系下才能够访问
第2篇为Java语言高级语法,包括类、对象、方法、继承、多态、修饰符、接口、抽象类、内部类、Java异常处理和多线程编程。第3篇为Java语言编程进阶,包括Java编程常用知识、Java文件编程、Java文件I/O编程、Java TCP...