static及类的加载初始化、对象初始化的顺序。
static用来修饰静态的变量、方法、(静态内部类)
被static修饰的元素所有对象仅此一份,存储在方法区。
被static修饰的属性在类加载的时候就初始化好了。
被static修饰的方法和属性可以直接使用类名.方法名/属性名调用
一般用于对象之间共享数据吧。
静态方法中只能使用静态变量,它内部也没有this引用,因为它不属于任何一个对象。
只能使用静态变量的原因是,可能使用方法时实例变量还没有初始化好
static方法必须被实现,不能是抽象的。
static代码块,被用来初始化static变量或者执行某些特定的方法,只会在类加载的时候执行一次。
感觉static没什么。可以理解为,被static修饰的所有东西都是属于类的,只有这一份的,重点关注以下static代码块,在类加载的时候比较重要。因为,它和类加载有关系哈
对象初始化的顺序:
首先是类加载,类加载的过程中为静态变量初始化,以及载入静态方法(先加载父类,再加载子类)
其次是调用static代码块,static代码块的作用是为静态变量赋值,可以调用静态方法(先调用父类的,再调用子类的)
然后是初始化对象,先执行非静态代码块,再执行构造函数(也是先调用父类的再调用子类的)
在这三个过程中,并不是说一次性把父类的所有的初始化方式一次性执行完,而是把所有的对象初始化,分为了这三个阶段。
但是第一步和第二步只会执行一次,被反复执行的是第三步。
其实可以分为两个阶段会好理解一点吧;
第一个阶段是类加载及初始化:
先加载父类,再加载子类
首先把所有的类加载进来之后,从父类开始依次向下的初始化类变量。(初始化变量意思是指的,将变量的值设置为程序中所直接 int a = 10,这样的常量。就直接变为10,如果没有写明的话,初始化为零值)
第二个阶段是对象初始化;:
(执行静态代码块,从父类到子类,不顾哦这个过程在程序运行时期只会执行一次,执行的时刻是在new这个类的对象之前的时候执行static代码块,并不是在类的加载之后又立马执行)
对象初始化的话,也是从父类开始初始化,父类初始化完成之后再初始化子类。(先执行父类的非static代码块,然后构造函数,然后子类的非static代码块,构造函数)
这样就好理解一点啦。