以前一直以为已经把初始化搞懂了,但其实里面还有很多小细节存在问题
1.在一个类里到底先加载静态代码块还是先加载静态属性?
public class add {
1.//static String b=print();
static{
System.out.println("类静态代码块");
}
2.//static String b=print();
public static String print()
{
System.out.println("类静态属性");
return "类静态属性";
}
public static void main(String[] args)
{
add a=new add();
//System.out.println(a.print());
}
}
图里代码位置1和2是一样的,都是给静态属性b赋值,但是不同的位置输出不同,说明静态属性和静态代码块
加载顺序和前后位置有关。
2. 在一个类里到底先加载普通代码块还是先加载普通属性?
代码如图,只是将上图的代码的static去掉
public class add {
1. //String b=print();
{
System.out.println("类普通代码块");
}
2.// String b=print();
public String print()
{
System.out.println("类普通属性");
return "类普通属性";
}
public static void main(String[] args)
{
add a=new add();
//System.out.println(a.print());
}
}
在1.2位置不同,得到的结果也不一样,这说明和static的加载一样
3. 存在继承关系的加载顺序,直接上代码
class addfather{
static{
System.out.println("父类静态代码块");
}
{
System.out.println("父类普通代码块");
}
addfather()
{
System.out.println("父类构造方法");
}
}
public class add extends addfather{
static{
System.out.println("子类静态代码块");
}
{
System.out.println("子类普通代码块");
}
add()
{
System.out.println("子类构造方法");
}
public static void main(String[] args)
{
add a=new add();
//System.out.println(a.print());
}
}
输出如下
父类静态代码块
子类静态代码块
父类普通代码块
父类构造方法
子类普通代码块
子类构造方法
我们得到结论:首先父类加载所有静态属性和代码块,然后子类加载所有静态属性和代码块,然后父类加载普通代码块
和属性 ,最后加载构造方法(构造方法优先级最低),然后加载子类的普通代码块和属性,最后子类构造方法。