修饰符分类
Java提供了很多修饰符,一般分为访问修饰符和非访问修饰符
访问修饰符
Java支持4中不同的访问权限:
default(默认缺省):同一包中可见,不使用任何修饰符,使用对象:类、接口、变量、方法
private:在同一类中可见,使用对象:变量、方法,不能修饰外部类
public:对所有类可见,使用对象:类、接口、变量、方法
protected:对同意包内的类和所有子类可见,使用对象:变量、方法,不能修饰外部类
注意:一个java文件内只能有一个public修饰的类(主类),且类名必须与文件名相同
访问控制
修饰符 | 当前类 | 同一包内 | 子类(同一包) | 子类(不同包) | 其他包 |
public | √ | √ | √ | √ | √ |
protected | √ | √ | √ | √/× | × |
default | √ | √ | √ | × | × |
private | √ | × | × | × | × |
说明:子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。
default:默认访问修饰符,不使用任何关键字
使用默认访问修饰符修饰的类、方法和变量,对同一个包内的类是可见的
private:私有访问修饰符
private是最严格的的访问级别,被声明为private的类(只能是静态内部类)、方法、变量和构造方法只能被所属的类访问
声明为private的变量只能通过类中的public方法进行访问
private的使用主要是用来隐藏类的实现细节和保护类的数据
public:公有访问修饰符
声明为public的类、方法、构造方法能够被任何类访问
访问不同包中的public类时需要导入相应public类所在的包
Java程序中的main方法必须设置为public
protected:受保护的访问修饰符
protected可以修饰数据成员、构造方法、方法成员,不能修饰外部类
子类和基类在同一包中,声明为protected的变量、方法和构造方法能被同一个包中的任何其他类访问
子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法
访问控制和继承
子类继承父类的方法的访问权限只能比父类的访问权限高
- 父类中声明为 public 的方法在子类中也必须为 public。
- 父类中声明为 protected 的方法在子类中要么声明为 protected,要么声明为 public,不能声明为 private。
- 父类中声明为 private 的方法,不能够被继承。
非访问修饰符
static:修饰方法和类变量
final:修饰类、方法和变量
abstract:修饰类、方法
synchronized和volatile:用于线程编程
static
static变量:静态变量(类变量),其值保存在类的内存区域的公共存储单元,该类的任意对象访问时取到的都是相同数据,被该类的任意对象操作时,也是对同一个内存单元进行操作,局部变量不能被static修饰
static方法:静态方法,不能使用类的非静态变量
生命周期:静态变量和静态方法在类被声明时就被创建,随着类被回收而销毁,因而类的对象和类的非静态方法可以调用静态变量和静态方法,反之则不行
对静态变量和方法的访问可以直接使用 classname.variablename 和 classname.methodname 的方式访问。
final
final变量:被final修饰的变量必须显示指定初始值,一旦被赋值后,不能重新被赋值。final通常和static一起使用来创建类常量
final方法:可以被子类继承,但不能被子类重写,目的是防止该方法的内容和功能被修改,保证了正确性和安全性
final类:不能被继承
abstract
abstract类:不能实例化对象,目的是为了将来对该类进行扩充。一个类不能同时被abstract和final同时修饰。abstract类可以包含abstract方法和非abstract方法,也可以不包含。继承abstract类的子类必须实现所有父类的abstract方法,除非该子类也是一个abstract类
abstract方法:在该类中没有方法体,具体实现由该类的子类完成,同样的,一个方法不能被abstract和final同时修饰,包含abstract方法的必须是abstract类。抽象方法的声明以分号结尾,例如:public abstract sample();
synchronized
该关键字声明的方法同一时间只能被一个线程访问,可以与四个访问修饰符一起使用
transient
用来定义一个暂时性变量,用修饰符transient 限定的暂时性变量,将指定 Java虚拟机认定该暂时性变量不属于永久状态,以实现不同对象的存档功能。否则,类中所有变量都是对象的永久状态的一部分,存储对象时必须同时保存这些变量。
volatile
volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到该成员变量的同一个值。
一个 volatile 对象引用可能是 null。