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{ }之前执行。
  • 相关阅读:
    用记事本编写C#程序并运行C#代码
    C#传递参数大集合
    JQuery或JavaScript获取网页的宽度、高等
    mybatis
    mysql 函数
    eclipse sts 常规操作
    谷歌浏览器自动翻译当前网页
    推荐Calendar操作日期
    IDEA 快捷键
    eclipse sts 快捷键
  • 原文地址:https://www.cnblogs.com/mibloom/p/9040354.html
Copyright © 2011-2022 走看看