码迷,mamicode.com
首页 > 编程语言 > 详细

Java 的初始化顺序

时间:2018-05-15 12:40:52      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:顺序   bsp   不同   style   static   string   span   默认   --   

初始化顺序: 

    1.将对象内存空间初始化为二进制0(所有的数据成员被设为默认值)

    2.如果该类有基类则初始化其基类(调用默认基类构造器,也可在子类构造器中指定调用基类的某个构造器)

    3. 静态成员和静态域(谁在前谁先初始化,且在内存中只占一份空间,同一个类不同对象可以共享) 

    4.main方法 

    5.非静态成员变量,引用,实例初始化  被初始化

    6. 构造器

1,2,3,4为类加载过程,5,6为new对象过程,只有new会执行。

class A {
    A() {
        System.out.println("基类构造器");
        System.out.println("证明数据成员被设为默认值");
        draw();

    }

    A(String s) {
        System.out.println(s);
    }

    void draw() {
        System.out.println("A.draw()");
    }

}

public class Test extends A {

    int i = 5;

    Test() {
        System.out.println("子类构造器");
        System.out.println("证明数据成员在构造器调用之前被初始化");
        draw();
    }

    String b = "非静态成员";
    A a = new A(b + "与非静态引用");

    {
        A b = new A("实例初始化");
    }

    String c = "非静态成员与实例初始化平级,谁在前先初始化谁";
    A d = new A(c);

    void draw() {
        System.out.println("i = " + i);
    }

    static A start = new A("---类加载---");
    static String e = "静态成员";
    static A f = new A(e + "和静态引用");

    static {
        A g = new A("静态域");
    }

    static String h = "静态成员与静态域平级,谁在前先初始化谁";
    static A j = new A(h);

    public static void main(String[] args) {

        System.out.println("main执行");
        System.out.println("---创建Test对象---");
        Test k = new Test();

    }

}

输出结果:

---类加载---
静态成员和静态引用
静态域
静态成员与静态域平级,谁在前先初始化谁
main执行
---创建Test对象---
基类构造器
证明数据成员被设为默认值
i = 0
非静态成员与非静态引用
实例初始化
非静态成员与实例初始化平级,谁在前先初始化谁
子类构造器
证明数据成员在构造器调用之前被初始化
i = 5

 




Java 的初始化顺序

标签:顺序   bsp   不同   style   static   string   span   默认   --   

原文地址:https://www.cnblogs.com/mibloom/p/9040354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!