一.static
1.static能修饰的范围及语法:
class TestStatic{ static { } static class ClassStatic{ } static String a; public static void staticFuntion() { } }
i.静态构造块,加载时间在类信息加载之内存中时就被加载了,只会被加载一次,以后对这个类的操作就与这个静态块无关了
ii.静态内部类,加载时间与其他略有不同,它不会随着外部类的加载而加载,它的加载时间在它被调用时才会被加载
iii.静态方法,加载时间就是类信息的加载时间,这种状态的方法是不可被覆盖的,也就是说可以重载但不能被重写
iv.静态变量,加载时间就是类信息的加载时间,这种变量是和类信息一起存放在静态域当中的,所以每个实例对其的更改都会影响到别的实例,也就是说这个变量是共享的
v.静态导包,语法为:import static xxx; 加载完之后就不需要一直点出来了,比如静态导入了Integer后就可以直接使用MAX_VALUE了
2.static的一些补充知识点
i.被static修饰的成员可以直接使用类命.成员名的方式访问,如Arrays.copyOf()
ii.静态的方法里因为加载时间在实例化对象之前,所以在其内部是无法使用this或者super关键字的,因为jvm在加载的时候无法分辨this和super指的是哪个
iii.静态方法不能访问非静态的成员
二.final
1.final能修饰的范围以及语法
class TestFinal{ final static String a = "a"; final String b = "b"; public final void function() { } final class TestFinal1{ } }
i.静态常量
ii.实例常量
iii.最终方法
iv.最终类
2.final细节
i.基础数据变量被final修饰后值无法改变,而引用变量被final修饰后只是该引用指向的地址无法更改,也就是不能指向其他的实例,但这个实例的内部数据更改并不会与final关键字冲突
ii.静态常量和实例常量的差别:静态常量有static的特性,然后两者也因static的有无而产生了赋值时机的差异,静态常量的赋值时机只能在1.初始化的时候,2.静态块内;而实例常量的赋值时机在1,初始化的时候,2.构造块内,3.构造方法内
需要注意的是在构造方法内对实例常量进行赋值时必须每个构造方法都能覆盖到,否则就会报错jvm会认为这个常量有可能无值
iii.最终方法:与静态方法一样,无法被覆盖
iv.final类:无法被继承,如String 就是被final修饰的