-
前言
在介绍访问控制之前,首先需要了解的是成员访问指的是什么。成员访问是指的以下两种操作:
- 一个类中的方法代码是否能够访问(调用)另一个类中的成员
- 一个类是否能够继承其父类的成员
本文将会介绍四种成员访问权限
-
公共类型:public
公共类型使用public关键字修饰,当一个成员被修饰为public时,所有其他类,无论该类属于那个包,均能够访问该成员,例:
test.java中:
package chapter03;
public class Test
{
public void method()
{
System.out.println("调用的方法为public类型");
}
}
如上述例子中,Sample3_26中的main方法调用了包chapter03中的Test中的method方法。这是因为method方法被声明为public。
对于继承而言,规则为,如果父类的成员声明为public,那么无论这两个类是否在同一个包中,该子类都能继承其父类的成员。
-
私有类型:private
这里将介绍成员被标识为私有类型后的含义与用法,并且在最后将介绍面向对象中的封装及其优点。标识为私有类型的成员用 private关键字修饰,其不能被该成员所在类之外的任何类中的代码访问。例如对代码Test稍做修改,改为 Private Test类,而代码 Sample3-26不变:
编译上述两个源代码文件,并运行类 Sample3-26,编译器报错,如上图所示。
从图可以看出,方法 method却不能被调用。因为其被设为pivate类型,对该成员自己类之外的任何代码来说都是不可见的对于继承而言,规则为如果父类的成员声明为 private,子类在任何情况下都不能继承该成员。
-
默认类型(defaault)
当一个成员前面没有写任何访问限制修饰符时,其访问权限为默认类型。具有此访问权限的权限,只对同一个包中的类是可见的,也就是说,在同一个包中,默认类型相当于public,而对包外相当于private。
只需将两个类放到同一个包中,或将默认类型改为public类型,就可以解决问题。
-
保护类型:protected
标识为保护类型的成员用protected关键字修饰,其规则几乎与默认类型几乎一样,当访问该成员的类位于同一包内,则该类型的访问权限相当于public类型。只是有一点点区别,如访问该成员的类位于包外,则只有通过继承才能访问该成员。下表列出了修饰符及其可见性:
可见性 | public | protected | default | private |
对同一个类 | 是 | 是 | 是 | 是 |
对同一个包中的任何类 | 是 | 是 | 是 | 否 |
对包外所有非子类 | 是 | 否 | 否 | 否 |
对同一个包中的子类基于继承访问 | 是 | 是 | 是 | 否 |
对包外的子类基于继承访问 | 是 | 是 | 否 | 否 |
访问修饰符不能用来修饰局部变量,否则会导致编译错误,而且局部变量的作用域为局部,也没有必要。