static及类的加载初始化、对象初始化的顺序。
static⽤来修饰静态的变量、⽅法、(静态内部类)
被static修饰的元素所有对象仅此⼀份,存储在⽅法区。
被static修饰的属性在类加载的时候就初始化好了。
被static修饰的⽅法和属性可以直接使⽤类名.⽅法名/属性名调⽤
⼀般⽤于对象之间共享数据吧。
静态⽅法中只能使⽤静态变量,它内部也没有this引⽤,因为它不属于任何⼀个对象。
只能使⽤静态变量的原因是,可能使⽤⽅法时实例变量还没有初始化好
static⽅法必须被实现,不能是抽象的。
static代码块,被⽤来初始化static变量或者执⾏某些特定的⽅法,只会在类加载的时候执⾏⼀次。
感觉static没什么。可以理解为,被static修饰的所有东西都是属于类的,只有这⼀份的,重点关注以下static代码块,在类加载的时候⽐较重要。因为,它和类加载有关系哈
对象初始化的顺序:
⾸先是类加载,类加载的过程中为静态变量初始化,以及载⼊静态⽅法(先加载⽗类,再加载⼦类)
其次是调⽤static代码块,static代码块的作⽤是为静态变量赋值,可以调⽤静态⽅法(先调⽤⽗类的,再调⽤⼦类的)
然后是初始化对象,先执⾏⾮静态代码块,再执⾏构造函数(也是先调⽤⽗类的再调⽤⼦类的)static修饰的变量
在这三个过程中,并不是说⼀次性把⽗类的所有的初始化⽅式⼀次性执⾏完,⽽是把所有的对象初始化,分为了这三个阶段。
但是第⼀步和第⼆步只会执⾏⼀次,被反复执⾏的是第三步。
其实可以分为两个阶段会好理解⼀点吧;
第⼀个阶段是类加载及初始化:
先加载⽗类,再加载⼦类
⾸先把所有的类加载进来之后,从⽗类开始依次向下的初始化类变量。(初始化变量意思是指的,将
变量的值设置为程序中所直接 int a = 10,这样的常量。就直接变为10,如果没有写明的话,初始化为零值)
第⼆个阶段是对象初始化;:
(执⾏静态代码块,从⽗类到⼦类,不顾哦这个过程在程序运⾏时期只会执⾏⼀次,执⾏的时刻是在new这个类的对象之前的时候执⾏static 代码块,并不是在类的加载之后⼜⽴马执⾏)
对象初始化的话,也是从⽗类开始初始化,⽗类初始化完成之后再初始化⼦类。(先执⾏⽗类的⾮static代码块,然后构造函数,然后⼦类的⾮static代码块,构造函数)
这样就好理解⼀点啦。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论