当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-10-24

    本文导语:  一、类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。 类的编译决定了类的初始化过程。 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: 1)       ...

一、类的初始化

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

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

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

    
 
 

您可能感兴趣的文章:

  • java有无像vb那样的静态变量?java的staic是类的属性,那末,静态变量如何声明?
  • 大家快来帮帮我,关于JAVA的类变量:一定在定义成STATIC变量(即静态变量)吗?
  • Java两个变量的互换(不借助第3个变量)具体实现方法
  • 在Java中如何获得外部的环境变量
  • 一个.java文件中怎样来调用另一个.java文件中的变量及其它东西!
  • java程序环境变量的问题!
  • Java中怎样定义全局变量???
  • Java环境变量的设置方法(图文教程)
  • 急!送分求助,java程序中如何读取系统环境变量?
  • fedora下 java环境变量的配置
  • 求助--java 如何设置环境变量??
  • env查看环境变量,JAVA_HOME明明在里面,但使用nutch时还是提示JAVA_HOME not set?
  • win98下怎么设置Java环境变量!!! 一定给分
  • Jsp中Java和JavaScript之间如何传递变量?
  • java变量和javascript变量之间的传递示例
  • java中静态变量和实例变量的区别详细介绍
  • Red Hat下java配置环境变量问题
  • JAVA环境变量配置问题?
  • 在java中如何获取window中环境变量path的值!!!高分
  • 菜鸟问题:unix中有像windows那样的自定义的环境变量吗?用java如何取
  • java map(HashMap TreeMap)用法:初始化,遍历和排序详解
  • java安全里面的PrivateKey和PublicKey是怎么初始化的??
  • Java对象初始化顺序的使用
  • java父类和子类初始化顺序的深入理解
  • JAVA中使用双括号来初始化静态常量的小技巧
  • 通过java字节码分析学习对象初始化顺序
  • java对象初始化顺序验证示例
  • Java数组声明、创建、初始化基础
  • 一个关于java构建器的初始化菜鸟问题,10分求解!!
  • 在java中 利用匿名内部类进行较简洁的双括弧初始化的方法
  • Java中List与Map初始化的一些写法分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 推荐java站点:这个站点上的内容是全体成员辛苦劳动的成果,上面会有你感兴趣的东西,
  • java命名空间java.lang.reflect接口member的类成员方法: getname定义及介绍
  • 有没有一种工具可以让java自动调出类的方法、成员?就像Delphi一样,写完Edit1.系统会跳出一些TEdit的属性、方法。
  • java命名空间java.lang.reflect接口member的类成员方法: getmodifiers定义及介绍
  • 我是JAVA论坛的新成员,也是刚刚开始接触JAVA的菜鸟。望大家多多帮助我!
  • java命名空间java.lang.reflect接口member的类成员方法: public定义及介绍
  • Java基础教程之对象的方法与数据成员
  • java命名空间java.security.acl接口group的类成员方法: ismember定义及介绍
  • java命名空间java.lang.reflect类method的类成员方法: getdefaultvalue定义及介绍
  • java命名空间java.security.acl接口group的类成员方法: addmember定义及介绍
  • java命名空间java.lang.reflect接口member的类成员方法: declared定义及介绍
  • java命名空间java.security.acl接口group的类成员方法: members定义及介绍
  • java命名空间java.lang类class<t>的类成员方法: ismemberclass定义及介绍
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • java命名空间java.security.acl接口group的类成员方法: removemember定义及介绍
  • java命名空间java.beans接口propertyeditor的类成员方法: getvalue定义及介绍
  • java命名空间java.awt类container的类成员方法: getlayout定义及介绍
  • java命名空间java.beans类defaultpersistencedelegate的类成员方法: defaultpersistencedelegate定义及介绍
  • java命名空间java.text类decimalformat的类成员方法: topattern定义及介绍
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: javaserializedobjectmimetype定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3