一、Java中有四种访问权限,private、default(一般省略)、public、protected。
- private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。
- default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。
- protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。
- public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。
这里需要注意的是,所谓的访问,可以分为两种不同方式:第一,通过对象实例访问;第二,直接访问。
比如说,某父类protected权限的成员,子类是可以直接访问的,换一种说话是子类其实继承了父类的除了private成员外的所有成员,包括protected成员,所以与其说是子类访问了父类的protected成员,不如说子类访问了自己的从父类继承来的protected成员。另一方面,如果该子类与父类不在同一个包里,那么通过父类的对象实例是不能访问父类的protected成员的。
二、下面用表格来展示四种修饰符的访问权限范围:
权限 | 类内 | 同包 | 不同包子类 | 不同包非子类 |
---|---|---|---|---|
private | √ | × | × | × |
default | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
三、举个栗子
在Eclipse中新建个类,四个类的结构如下,Aclass 和Bclass 是同包的类,Cclass 和Dclass是同包的类,Cclass 继承了Aclass。
Aclass类的定义如下,有四个成员变量,权限分别为private、default、protected、public。四个成员方法,权限分别为 private、default、protected、public。
Bclass类定义如下,它和Aclass类同属于 test1包 ,在里面定义了一个成员方法show(),该方法通过两种方法对Aclass类的所有成员进行了访问,第一方法通过实例化一个Aclass类对象aa对成员变量及方法进行访问,第二种是直接访问Aclass中的成员。通过IDE的自动检测报错,可以看出,Bclass类是不能直接访问Aclass类的成员的,但通过对象的方法可以访问default权限以下(default、protected、public)的成员。
Cclass类定义如下,它和Aclass类属于不同的包,但是Cclass继承了Aclass ,在里面定义了一个成员方法show(),该方法同样通过两种方法对Aclass类的所有成员进行了访问,第一方法通过实例化一个Aclass类对象aa对成员变量及方法进行访问,第二种是直接访问Aclass中的成员。通过IDE的自动检测报错,可以看出,Cclass类是可以直接访问Aclass类权限为protected、public的成员(因为子类的缘故),但通过对象的方法只能访问 public权限的成员(因为Cclass和Aclass不同包)。
Dclass类定义如下,它是Aclass类不同包的一般类,在里面定义了一个成员方法show(),该方法同样通过两种方法对Aclass类的所有成员进行了访问,第一方法通过实例化一个Aclass类对象aa对成员变量及方法进行访问,第二种是直接访问Aclass中的成员。通过IDE的自动检测报错,可以看出,Dclass类是不可以直接访问Aclass类的成员(因为不是子类的缘故),但通过对象的方法只能访问 public权限的成员(因为class和Aclass不同包)。
四、总结语
以上栗子,对JAVA语言种4种访问权限做了简单的探讨,这就是我对它们的理解。