Java类变量和成员变量初始化过程的应用介绍

所属分类: 软件编程 / java 阅读数: 55
收藏 0 赞 0 分享

一、类的初始化

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

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

编译器生成的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类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。


二、对象的生成

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

复制代码 代码如下:

public class Person{
   {
     name="李四";
     age=56;
     System.out.println("初始化age");
     address="上海";
   }
   public String name="张三";
   public int age=29;
   public String address="北京市";
   public Person(){
     name="赵六";
     age=23;
     address="上海市";
   }
 }

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

public class Person{
   public String name;
   public int age;
   public String address;
   public Person(){
     name="李四";
     age=56;
     System.out.println("初始化age");
     address="上海";
     name="张三";
     age=29;
     address="北京市";
     name="赵六";
     age=23;
     address="上海市";
   }
 }

可以看到,对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行。本人以前一直对类初始化过程一直没有一个深刻的理解,就是搞不清到底是怎么初始化的,只能按照书上所说的记住了初始化顺序,但是过一段时间有给忘了,所以这次总算给弄清楚了,还是按照一个模型来解释初始化机制比较好啊,不用再背了,只有理解了才能不易忘

更多精彩内容其他人还在看

Javaweb 鼠标移入移出表格颜色变化的实现

这篇文章主要介绍了Javaweb 鼠标移入移出表格颜色变化的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java 实现图片压缩的两种方法

这篇文章主要介绍了Java 实现图片压缩的两种方法,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

据说这个是可以撸到2089年的idea2020.2(推荐)

这篇文章主要介绍了据说这个是可以撸到2089年的idea2020.2,本教程给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

一篇文章带你搞定SpringBoot不重启项目实现修改静态资源

这篇文章主要介绍了一篇文章带你搞定SpringBoot不重启项目实现修改静态资源,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

win10操作系统下重启电脑java环境变量失效

这篇文章主要介绍了win10操作系统下重启电脑java环境变量失效,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Java实现批量修改文件名和重命名的方法

这篇文章主要介绍了Java实现批量修改文件名和重命名的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

关于Java HashMap自动排序的简单剖析

这篇文章主要给大家介绍了关于Java HashMap自动排序的简单剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Spring中BeanFactory和ApplicationContext的作用和区别(推荐)

这篇文章主要介绍了Spring中BeanFactory和ApplicationContext的作用和区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Java程序执行Cmd指令所遇问题记录及解决方案

这篇文章主要介绍了Java程序执行Cmd指令所遇问题记录,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

深入浅析jni中的java接口使用

这篇文章主要介绍了jni中的java接口使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多