1、static 修饰符
-
static 作用于代码块:
- 称作静态代码块(可以初始化 static field,不能初始化非 static field);
-
static 作用于 methods:
- static 方法(类方法)只能访问 static 方法,不能访问非 static 方法
- static 方法只能访问 static field, 不能访问非 static field
- static方法不能访问本类中的非static变量
- 非 static 方法可以访问 static fields 和 static methods
- static method 的两种访问方式 oject.method 和 class.method,
- 非 static method 只有 object.method 一种访问方式
- static method 中不支持 this 和 super
- static 不可以作为局部变量(局部变量包括:函数级局部变量和块级局部变量)
2、final 修饰符
- final 类不能被继承(不能有 abstract final class)(final 类内的 method 自动为 final,但不包括属性)
- final 方法可以被继承但不能被 override 不能有 abstract final method
- final 属性不能被重新赋值(可以被继承,但不可以修改)定义时可以初始化,也可以不初始化,而在语句块中初始化或者构造函数中初始化(最晚要在构造函数中初始化,只能初始化一次)
- final 属性只能人为赋值一次继承与父类的 final 属性不能被修改
- final 可以修饰局部变量表示局部常量(方法级局部变量(形参及局部变量,方法体级局部变量)或块级局部变量)
3、abstract 修饰符:
- abstract 类不能实例化对象
- abstract 类可以不包含 abstract 方法,但是只要有一个 abstract 方法那么该类必须为 abstract 类
- abstract 方法没有方法体,需要被 override
- abstract 类的子类要么实现其父类全部的 abstract method,要么也是一个 abstract 类
- abstract 不能修饰属性
- abstract 不能修饰局部变量(方法级局部变量(形参级局部变量,方法体级局部变量)或块级局部变量)
4、final、static、abstract 之间的关系:
- final、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
- static、abstract 不能共存(无论在类、方法、属性、局部变量上都不能共存)
- 可以出现 final static field(该类成员属性不能被修改)
- 可以出现 final static method(该类成员方法不能被 override)
5、final static 修饰的属性
static和final的意义是不同的,
- static修饰的时候代表对象是静态的,而final修饰的时候代表对象只能赋值一次,
- 他们连用的时候是因为定义的那个对象既要它是静态的,也要求它的值不能再被修改。
举例说明:
static int a=1;
static final b=1;
这里a和b的区别在于,a在程序里可以被重新赋值为2或3或等等的整数,而b在程序里不能被重新赋值,b永远都为1,也就是说b是一个常量。
final int c=1;
static final b=1;
这里c和b的区别在于,b存放在静态空间,不会在程序运行时被释放,它永远占着内存直到程序终止,而c在程序用完它而不会再用到它的时候就会被自动释放,不再占用内存。
当一个常数或字符串我们需要在程序里反复反复使用的时候,我们就可以把它定义为static final,这样内存就不用重复的申请和释放空间。