访问权限控制

修饰符用来定义类、方法或者变量,通常放在语句的最前端。

Java语言提供了很多修饰符,主要分为以下两类:

  • 访问修饰符
  • 非访问修饰符

其中非访问修饰符主要有:static、final、abstract、synchronized和volatile,非访问修饰符根据各自的特性来保证特定功能的实现。

Java中使用访问控制符来保护对类、变量、方法和构造方法的访问,访问控制修饰符对应的权限控制的大小情况为:public > protected > default(包访问权限) > private

目的

  • 为了让用户不要碰触他们不应该接触的地方
  • 为了让类库设计者更改类库的内部工作方式,而不用担心对客户端程序造成重大影响。

编译单元和包

java 访问控制修饰符 java修饰符与访问控制无关_java 访问控制修饰符

编译单元:即为最小的可以被编译且执行的Java文件。

一个.java文件就是一个编译单元,一个编译单元必须只包含有一个public类,可以包含有其他非public的类,并且用publi类标示的类名必须和文件名相同。如果.java文件中不包含有publi类,则这个类也是没有意义的,因为不能被外界所访问。.java文件中包含有几个类,编译后就会生成几个.class文件。

包含有一组类,是以一个名字空间集合在一起的类而已。


访问控制修饰符

java 访问控制修饰符 java修饰符与访问控制无关_修饰符_02

  • public : 对所有类可见
    使用对象:类、接口、变量、方法
  • protected : 对同一包内的类和所有子类可见
    使用对象:变量、方法。 注意:不能修饰类(外部类)
  • default (即缺省,什么也不写): 在同一包内可见,不使用任何修饰符
    使用对象:类、接口、变量、方法。
  • private : 在本类中可见
    使用对象:变量、方法。 注意:不能修饰类(外部类)

private和protected修饰符不能用以修饰类/接口

2.1 公有访问修饰符-public

被声明为 public 的类、方法、构造方法和接口能够被任何其他类访问。

如果几个相互访问的 public 类分布在不同的包中,则需要导入相应 public 类所在的包。

由于类的继承性,类所有的公有方法和变量都能被其子类继承。

2.2 受保护的访问修饰符-protected

protected 又称继承访问权限

protected 需要从以下两个点来分析:

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;
  • 子类与基类不在同一包中:在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法

子类能访问 protected 修饰符声明的方法和变量,这样就能避免不相关的类使用这些方法和变量。

在碰到涉及protected成员的调用时,首先要确定出该protected成员来自何方,其可见性范围是什么,然后就可以判断出当前用法是否可行了

package p2;
class MyObject2 {
	protected Object clone() throws CloneNotSupportedException{
       return super.clone();
    }
}
 
package p22;
public class Test2 extends MyObject2 {
    public static void main(String args[]) {
       MyObject2 obj = new MyObject2();
       obj.clone(); // Compile Error         ----(1)
 
       Test2 tobj = new Test2();
       tobj.clone(); // Complie OK         ----(2)
    }
}

对于(1)而言,clone()方法来自于类MyObject2本身,因此其可见性为包p2及MyObject2的子类,虽然Test2是MyObject2的子类,但在Test2中不能访问基类MyObject2的protected方法clone(),因此编译不通过;

对于(2)而言,由于在Test2中访问的是其本身实例的从基类MyObject2继承来的的clone(),因此编译通过。

2.3 默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。

接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。

2.4 私有访问修饰符-private

被声明为 private 的方法、变量和构造方法只能被所属类访问,并且类和接口不能声明为 private。

声明为私有访问类型的变量可以通过类中公共(public修饰)的 getter 方法被外部类访问。

private 访问修饰符的使用主要用来隐藏类的实现细节和保护类的数据