zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
    死磕 java同步系列之AQS起篇
    死磕 java同步系列之自己动手写一个锁Lock
    死磕 java同步系列之synchronized解析
    死磕 java同步系列之volatile解析
    死磕 java同步系列之JMM(Java Memory Model)
    解决Linux下SSH超时自动断开
    Git常用命令
    JVM常用虚拟机命令汇总
    理解GC日志
  • 原文地址:https://www.cnblogs.com/echo1937/p/6242299.html
Copyright © 2011-2022 走看看