浅谈java类中成员的初始化顺序

Posted tongangle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈java类中成员的初始化顺序相关的知识,希望对你有一定的参考价值。

类被创建之后的成员的初始化顺序到底是怎么样的?

首先 不考虑继承


package com;

public class DemoOne {
/**
* 关于类的初始化顺序
*/
//不考虑继承结构的情况
private static int a=1;
private String str="我被赋值了";
static{
//为什么static成员函数不能访问非static变量, 不能调用非static成员函数?
//静态代码块独立于对象而存在 不依赖于对象存在 简单来说可以直接以类型名调用DemoOne.a
//而成员变量的存在依赖于对象的创建才能被调用
//所以, static成员不能访问非static变量, 不能调用非static成员!
// 编译报错 System.out.println("str ===="+ str);
System.out.println("1 静态变量被赋初始值 a===="+a);
System.out.println("2 进入静态块");
}

{
System.out.println("3 成员变量被赋值 str ===="+ str);
System.out.println("4 进到普通代码块");
}
public void run(){
System.out.println(" 进入普通方法");
}
public static void go(){
System.out.println(" 进入静态方法");
}
    public DemoOne(){
System.out.println("5 进入构造器");
}

public static void main(String[] args) {
new DemoOne();
}

}
 

运行程序后输出结果为:

1 静态变量被赋初始值 a====1
2 进入静态块
3 成员变量被赋值 str ====我被赋值了
4 进到普通代码块
5 进入构造器

为了验证静态成员的顺序由代码的前后顺序决定 加入第二个静态块

 

package com;

public class DemoOne {
    static{
        System.out.println("1 进入第一个静态代码块");
    }
    private static int a;
    static{
        System.out.println("2 进入第二个静态块");
    }
public static void main(String[] args) {
new DemoOne();
}
}

 

输出结果为:

1 进入第一个静态代码块
2 进入第二个静态块

由输出结果可以看到 调整顺序后的静态块先后顺序发生改变

总结一下 不考虑继承的类的成员加载顺序依次为 静态变量和常量->顺序位的静态块->普通成员变量->普通代码块->构造器

下面考虑存在父类的情况

 

package com;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

public class Demo {
    /**
     *
     * @param args
     */
    private static int a=1;
    private String  str="我在父类被赋值了";
    static{
        System.out.println("1 父类静态变量被赋初始值 a===="+a);
        System.out.println("2 进入父类静态块");
    }
    {
        System.out.println("5  父类成员变量被赋值  str ===="+ str);
        System.out.println("6  进入父类普通代码块");
    }
    public Demo(){
        System.out.println("7 进入父类构造器");
    }
}

 

子类

package com;

public class DemoOne  extends Demo{
    private static int a=1;
    private String  str="我在子类被赋值了";
    static{
        System.out.println("3 子类静态变量被赋初始值 a===="+a);
        System.out.println("4 进入子类静态块");
    }
    {
        System.out.println("8  子类成员变量被赋值  str ===="+ str);
        System.out.println("9  进入子类普通代码块");
    }
    public DemoOne(){
        System.out.println("10 进入子类构造器");
    }
    public static void main(String[] args) {
        new  DemoOne();
    }

}

输出结果为:

1 父类静态变量被赋初始值 a====1
2 进入父类静态块
3 子类静态变量被赋初始值 a====1
4 进入子类静态块
5 父类成员变量被赋值 str ====我在父类被赋值了
6 进入父类普通代码块
7 进入父类构造器
8 子类成员变量被赋值 str ====我在子类被赋值了
9 进入子类普通代码块
10 进入子类构造器

所以存在父类的情况下 类成员的初始化顺序

父类静态变量->父类静态块->子类静态变量->子类静态块->父类成员变量->父类普通代码块->父类构造器->子类成员变量->子类普通代码块->子类构造器

还在学习总结过程中,如若有误,请看到的朋友及时指出。

 

 





















































以上是关于浅谈java类中成员的初始化顺序的主要内容,如果未能解决你的问题,请参考以下文章

Java类成员初始化顺序

随笔25 java中的类加载顺序

java中父类和子类初始化顺序

java类中的初始化顺序

Java中代码块执行顺序

Java类的静态成员静态代码块普通成员普通代码块构造方法初始化执行的顺序