• Java类变量和成员变量初始化过程


    一、类的初始化

    对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。

    类的编译决定了类的初始化过程。

    编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:

    1. 先按照静态成员变量的定义顺序在类内部声明成员变量。
    2. 再按照原java类中对成员变量的初始化顺序进行初始化。

    一个java类和编译后的class对应的转换如下:

    源文件:

    public class Person{
      public static String name="张三";
      public static int age;
      static{
    age=20;
        System.out.println("初始化age");
      }
      public static String address;
      static{
        address="北京市";
        age=34;
      }
      public static void main(String[] args) {
    System.out.println(name);
    System.out.println(age);
    System.out.println(address);
    }
    }

    当java源代码转换成一个class文件后,其转换成类似下面的代码:

    public class Person{
      public static String name;
      public static int age;
      public static String address;
      static{
        name="张三";
        age=20;
        System.out.println("初始化age");
        address="北京市";
        age=34;
      }
      public static void main(String[] args) {
    System.out.println(name);
    System.out.println(age);
    System.out.println(address);
    }
    }

    初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。

    二、对象的生成

    对于对象的生成其初始化过程与类的初始化过程类似,但会增加构造函数阶段,源代码如下:

     1 public class Person{
    2   {
    3     name="李四";
    4     age=56;
    5     System.out.println("初始化age");
    6     address="上海";
    7   }
    8   public String name="张三";
    9   public int age=29;
    10   public String address="北京市";
    11   public Person(){
    12     name="赵六";
    13     age=23;
    14     address="上海市";
    15   }
    16 }

    编译器转换成class文件后,会转换成类似下面的代码:

     1 public class Person{
    2   public String name;
    3   public int age;
    4   public String address;
    5   public Person(){
    6     name="李四";
    7     age=56;
    8     System.out.println("初始化age");
    9     address="上海";
    10     name="张三";
    11     age=29;
    12     address="北京市";
    13     name="赵六";
    14     age=23;
    15     address="上海市";
    16   }
    17 }

    可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。

    转载出处Imtoo

  • 相关阅读:
    10年后我又来看看我自己!
    KubernetesKuboard
    VSCode SSH 免密登录
    Windows Terminal 使用 PuTTY 连接 COM 串口
    PuTTY SSH 免密登录
    FastDDS 安装过程的坑🕳坑🕳坑🕳坑🕳坑🕳坑🕳
    Samba 安装、配置、共享 home 目录、创建用户、设置密码、映射盘符
    Win10 恢复快捷方式小箭头
    CSAPP 并发编程读书笔记
    修改 VSCode 终端配色
  • 原文地址:https://www.cnblogs.com/echo1937/p/6242299.html
Copyright © 2020-2023  润新知