Java中的访问修饰符主要有以下4种:
- private
- protected
- default - 什么都不写
- public
这些修饰符可作用于属性、方法和类型,其中的类型主要包括class、interface、enum等。这些修饰符的访问权限范围又是怎样的呢?我们以一个表格来说明一下。
| 修饰符 | 当前java文件 | 同一个包 | 子类 | 其他的包 | 说明 |
|---|---|---|---|---|---|
| public | √ | √ | √ | √ | 我的东西任何人都可以分享。 |
| protected | √ | √ | √ | × | 我的东西可以和跟我一块住的那个人分享, 另外也可以跟不在家的儿子分享。 |
| default | √ | √ | × | × | 我的东西可以和跟我一块住的那个人分享。 |
| private | √ | × | × | × | 我什么都不跟别人分享,只有自己知道。 |
这儿需要特别说明三点:
- 这4种修饰符都可作用于
当前java文件,而非网上说的当前类。 - 在Java中,
外部类只能使用public和default来进行修饰,而不能使用protected和private。所谓外部类,指的是java文件中最外层的根类。 - 这4种访问修饰符都只在编译期进行范围权限检查。而在运行期,我们可以通过反射机制,对任意位置的任意属性和方法进行访问。例如:可以对另外一个包下面的私有属性和私有方法进行访问。
说明1的例子:
/**
* OuterClass为外部类类,而InnerClassB和InnerClassC为内部类
* private修饰的内部类,可在当前java文件所访问,而非仅仅局限在当前类
*/
public class OuterClass {
private static class InnerClassB {
private int fieldB;
private void methodB() {
}
}
private static class InnerClassC {
InnerClassB b = new InnerClassB();
private void methodC() {
b.methodB();
b.fieldB = 3;
}
}
}
说明2的例子:
private不能修饰外部类
protected不能修饰外部类












网友评论