**
Java类初始化顺序
**
一:先给出结论,然后带着结论通过代码看一下是否符合结论(如有不对地方欢迎在评论区指正,共同进步哈)。
总结:
在一个类中,初始化顺序为:
- 静态变量,静态变量初始化;
- 静态代码块;
- 非静态变量初始化;
- 非静态代码块;
- 构造器。
父子类的初始化顺序:
- 父类静态变量,静态变量初始化;
- 父类静态代码块
- 子类静态变量,静态变量初始化;
- 子类静态代码块
- 父类非静态变量初始化;
- 父类非静态代码块
- 父类构造器
- 子类非静态变量初始化;
- 子类非静态代码块
- 子类构造器
二:直接上代码
1:父类代码如下:
public class Father {
private String name;
static {
System.out.println("静态代码块 i am father DEMO = "+Childer.DEMO+" DEMO:"+Father.DEMO);
}
public static final String DEMO = "Father";
public Father(){
name = "无参构造器";
System.out.println("Father 的构造函数 name:" + name);
}
{
System.out.println("Father刚运行到非静态代码块时的非静态变量值:name: "+name);
name = "非静态代码块";
System.out.println("Father 的普通方法块 name:" + name);
}
public void ceshi(){
System.out.println("我是父类");
}
}
写一个主函数运行:
public class InitDemo {
public static void main(String[] args){
Father father = new Father();
}
}
运行结果如下:
:2:父子类
上子类代码
public class Childer extends Father{
private String name;
static {
System.out.println("静态代码块 i am Childer CDEMO= "+Childer.CDEMO);
}
public static final String CDEMO = "Childer";
public Childer(){
name = "子类无参构造器";
System.out.println("Childer 的构造函数 name:"+name);
}
public void ceshi(){
System.out.println("我是子类");
}
{
System.out.println("Childer刚运行到非静态代码块时的非静态变量值:name: "+name);
name = "非静态代码块";
System.out.println("Childer 的普通代码块 name:"+name);
}
}
写一个主函数运行:
public class InitDemo {
public static void main(String[] args){
Childer childer = new Childer();
}
}
运行结果:
验证了我们之前的结论
最后我们再看一种情况,子类会不会初始化父类(我们对上面的代码稍作修改):
我们将父类,以及子类的静态变量的final修饰符去掉,然后运行一下结果我们看一下。
public class Father {
private String name;
static {
System.out.println("静态代码块 i am father DEMO = "+Childer.DEMO+" DEMO:"+Father.DEMO);
}
public static String DEMO = "Father";
public Father(){
name = "无参构造器";
System.out.println("Father 的构造函数 name:" + name);
}
{
System.out.println("Father刚运行到非静态代码块时的非静态变量值:name: "+name);
name = "非静态代码块";
System.out.println("Father 的普通方法块 name:" + name);
}
public void ceshi(){
System.out.println("我是父类");
}
}
public class Childer extends Father{
private String name;
static {
System.out.println("静态代码块 i am Childer CDEMO= "+Childer.CDEMO);
}
public static String CDEMO = "Childer";
public Childer(){
name = "子类无参构造器";
System.out.println("Childer 的构造函数 name:"+name);
}
public void ceshi(){
System.out.println("我是子类");
}
{
System.out.println("Childer刚运行到非静态代码块时的非静态变量值:name: "+name);
name = "非静态代码块";
System.out.println("Childer 的普通代码块 name:"+name);
}
写一个主函数:
public class InitDemo {
public static void main(String[] args){
System.out.println(Childer.CDEMO);
}
}
运行结果如下:
然后我们再看一下加上final是什么样的呢
这种情况下并没有初始化父类。