目录
引言
忽然有些被Java中的各种修饰符搞晕了:哪些是用于成员、哪些是用于类、各自的作用是啥等等。之前好几次遇到这些问题都是跑去重新翻书,今天就自行总结一下。
外部类、内部类、成员变量、方法各自可以使用的修饰符
外部类
public:描述访问权限。表示这是一个公共类,全局范围内皆可访问。顺便说一下,外部类只有两种访问控制级别:public和默认。
final:定义不可变类。表示该类不可被继承,可以和public同时存在。
abstract:定义抽象类。抽象类就是用来被继承的,所以该修饰符不能和final同时存在。
不用修饰符:从访问权限的角度——属于包访问权限,即可以被相同包下的其他类访问;从特殊性的角度——没有任何特殊性。
内部类
内部类比外部类可以多使用3个修饰符:private、protected、static。因为其属于外部类成员,也就具有了成员的属性。此处仅简单介绍。
成员变量
private、protected、public:描述访问权限,下文有章节详述。显然三者不能同时存在。
static:描述成员变量是实例变量(非静态变量)or类变量(静态变量)。
final:定义不可变量,即不能被二次赋值。
方法
private、protected、public:描述访问权限。
static:描述方法是实例方法(非静态方法)or类方法(静态方法)。
final:定义final方法,表示该方法不可被重写(父类与子类之间的操作),但依旧可以被重载(同一类中的操作)。
abstract:定义抽象方法,无方法体,由继承其所在抽象类的子类提供实现(即重写)。显然abstract和final不能同时存在。
小结
无论是类层面还是方法层面,abstract和final都不能同时存在。
访问控制符
这一部分是封装的内容,重温一下封装的定义:将对象的状态信息隐藏在状态内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。“隐藏”的程度就和访问控制符的选择有直接关系。
Java提供了3个访问控制符:private、protected、public,4个访问控制级别(还有一个对应于无访问控制符,即default级别):
- private(当前类访问权限):用于类的成员;
- default(包访问权限):用于类的成员或者一个外部类;
- protected(子类访问权限):用于类的成员;
- public(公共访问权限):用于类的成员或者一个外部类。
private | default | protected | public | |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中 | √ | √ | √ | |
子类中 | √ | √ | ||
全局范围内 | √ |
具体介绍我就略去,大家也很容易找到,唯二想说明的——
第一点:protected的访问权限是比default要宽松的。一开始我其实不是很理解,因为从字面上protected似乎都要更加难以访问一些。
default修饰的成员或者外部类可以被相同包下的其他类访问;protected修饰的成员可以被相同包下的其他类访问(这里是等同于default权限的),也可以被不同包中的子类访问(这是比default多出来的权限)。所以protected权限更加宽松。
第二点:外部类只有两种访问控制级别:public修饰的当前类访问权限、默认的包访问权限。因为外部类没有处于任何类的内部,所以也就没有其所在类的内部(对应private修饰权限)、所在类的子类(对应protected修饰权限)两个范围。
总结
起初容易搞混归根结底还是没有记清楚每个修饰符的作用,清除了作用就知道哪些可以同时存在哪些不可以,是用于控制访问权限还是其他。