zoukankan      html  css  js  c++  java
  • Java 的初始化顺序

    初始化顺序: 

        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

    总结:

    1.  所有静态成员是属于Class对象的,所有非静态成员是属于实例对象的,先加载Class对象在创建实例对象,所以先执行静态变量,在执行实例变量

    2. 注意: new A() 是A 的实例对象,也就是说所有非静态的成员都是属于new A() ,所有静态成员都是属于A.class 对象的, 但是如果 有2个静态成员按顺序分别是 static A a = new A ( ) 和static{   }那么 一定是先执行第一个静态成员 new A() ,所以属于new A()的非静态成员在 static{ }之前执行。
  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/mibloom/p/9040354.html
Copyright © 2011-2022 走看看