Java 访问控制修饰符自我理解
访问控制修饰符关键字
在java中,我们知道有4种用于访问控制的修饰符,分别是public , protected, default 以及private。
- public: 可以用于修饰类,接口,变量和方法。当一个类,接口,变量或者方法被指定为该类型修饰时, 在同一项目下的所有类(不再同一包或者在同一个包下均可)都可以访问该类,该接口,该变量或该方法, 但对于方法和变量而言,要保证它们所在的类能够被访问,它们才能被访问。
- protected: 用于修饰变量和方法,不能修饰外部类。当一个方法或者变量被申明为该类型时,在同一个包中的所有类可以访问该方法或者该变量,以及不在同一个包的子类可以访问访问该方法或者该变量。同样的,对于方法和变量而言,要保证它们所在的类能够被访问,它们才能被访问。
- default: 可以用于修饰类,接口,变量和方法, 在未指定修饰符时自动指定为该类型修饰。当一个类,接口,变量或者方法被申明为该类型时,同一个包中的类可以访问访问该类,该接口,该变量或该方法,不同包的则不能访问。同样的,对于方法和变量而言,要保证它们所在的类能够被访问,它们才能被访问。
- private: 用于修饰变量和方法,不能用于修饰外部类。当一个方法或者变量被申明为该类型时,多半是起到内部访问保护的作用,在这种情况下只有同一个类中该方法或该变量才能被访问。
综上,我们对于访问控制的权限总结如下表。
修饰符 | 同一class | 同一package | 不同package | 子孙类(同一package) | 子孙类(不同package) |
---|---|---|---|---|---|
public | ✔ | ✔ | ✔ | ✔ | ✔ |
protected | ✔ | ✔ | ✔/❌ | ✔ | ✔/❌ |
default | ✔ | ✔ | ✔/❌ | ✔ | ❌ |
private | ✔ | ✔/❌ | ❌ | ❌ | ❌ |
或者我们也可以这样理解
注意事项:
1)protected和private不能用于修饰外部class, 显而易见外部class只能使用public类修饰或者缺省(default)
2) 在方法继承中,子类继承的方法的访问权限必须不低于父类。具体来说,父类中申明为public的方法,子类中必须为public; 父类中申明为protected的方法,子类中必须为public/protected; 而父类中申明为private的方法,不能够被继承;
访问控制权限举例
假设我们有如下程序结构
Review_May是一个project, 在这个project下有两个package: may15, may16。在may14中有3个class: Tester(public),VC1401(public), VC1402(default); 在may15中有两个class: VC1501(public),VC1502(default); 其中VC1401 extends VC1501。在每个class中有对应的方法和变量如图。 变量和方法访问控制修饰符修饰如下:n1(public), n2(private),n3(protected),n4(default);
defTest()- default; priTest()- private; proTest()- protected; pubTest()- public。
我们在类Tester中尝试去访问其他类以及其它类中的方法和变量, 我们将能否访问情况已经显示在上图中。红色标记代表不能访问,绿色标记代表可以访问。