1、static 修饰符
被 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 属性不能被修改
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,这样内存就不用重复的申请和释放空间。