java 类和对象的初始化

标签: java 对象 初始化 | 发表时间:2015-12-01 23:43 | 作者:windowboy
出处:http://www.iteye.com
Java类的装载
  在Java中,类装载器把java类装载到虚拟机中,经过装载,链接和初始化三个步骤来完成。
其中链接中包括 校验、准备和解析。
下面对这些概念进行解析:

装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载。

链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;

      校验:检查导入类或接口的二进制数据的正确性;

      准备:给类的静态变量分配并初始化存储空间;

      解析:将符号引用转成直接引用;

初始化:激活类的静态变量的初始化Java代码和静态Java代码块。

其中 初始化(initialization)包含两部分:

1.类的初始化(initialization class & interface)---初始化静态变量和静态Java代码块

2.对象的创建(creation of new class instances)----new class()。

用一个简单的流程分析如下:

普通对象初始化                                                        继承体系对象初始化            
       
  
 
           
初始化
1.类的初始化,也就是静态变量以及静态块的初始化
    1.1 如果有继承父类有静态变量或者静态块的,先执行初始化。
    1.2 如果是final static ,那么就不会初始化类
    1.3 如果执行的是父类的静态变量,那么子类不会初始化
     public class SuperTmp {
             public static int a = 10;   
             public final static int b = 20;   
             public int c = 10;
             static{
                    System.out.println("init super calss...");
              }   
           public SuperTmp (){
                    System.out.println("super init constructor:");
             } 
       }
     public class Sub extends SuperTmp {
             public static  final int aa = 30;
             public static int bb = 40;
             public int cc = 20;
             static {
                    System.out.println("init sub class.....");
             }
           public Sub (){
 
                    System.out.println("sub init constructor:" );
             } 
      }
    public class Play {
              public static void main(String[] args) {    
               /**输出
                 * init super calss...
                 * 10
                 * 不会初始化子类 Sub
                 */
                  System.out.println(Sub.a);   
                /******
                  *  输出 b 不会初始化任何类
                  */
                  System.out.println(Sub.b);
                /***
                  * 输出
                  * init super calss...
                  *  init sub class.....
                  *  40
                  */
                System.out.println(Sub.bb);
               /*对象初始化
                 *init super calss...
                   init sub class.....
                 *super init constructor
                  sub init constructor
                 */
               Sub sb = new Sub()
              }
            }
 
2.创建class的对象
    2.1.先为Sub类和其父类SuperTmp类分配内存空间,父类和子类的变量都初始化值,对象类型的为null,
       基本数据类型的为默认的值,例如 int 类型的为初始化 0
   2.2  执行构造函数Sub(), 调用父类的构造函数,输出“super init constructor”,“sub init constructor”。
   2.3  初始化superTmp,Sub类的成员变量,并赋值
   2.4  对于类实现了接口Interface,初始化它的时候并不会引起接口的初始化。
 

所以对象的创建,具体步骤如下:

(1) 所有的成员变量—包括该类,及它的父类中的成员变量--被分配内存空间,

   并赋予默认值。(第一次初始化成员变量)

(2) 为所调用的构造函数初始化其参数变量。(如果有参数)

(3) 如果在构造函数中用this 调用了同类中的其他构造函数,

   则按照步骤(2)~(6)去处理被调用到的构造函数。

(4) 如果在构造函数中用super调用了其父类的构造函数,

   则按照步骤(2)~(6)去处理被调用到的父类构造函数。

(5) 按照书写顺序,执行instance initializer 和 instance variable initializer

   来初始化成员变量。(第二次初始化成员变量)

(6) 按照书写顺序,执行构造函数的其余部分。

总结:

  从类的初始化和对象的创建步骤,可以知道,一个类是先初始化static的变量和static句块,

  然后在分配该类以及父类的成员变量的内存空间,赋予默认值,然后开始调用构造函数。

  而子类和父类之间,则先初始化和创建父类,然后再初始化和创建子类的。

 
 
 
 
 
 
 
 
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [java 对象 初始化] 推荐:

java 类和对象的初始化

- - Web前端 - ITeye博客
  在Java中,类装载器把java类装载到虚拟机中,经过装载,链接和初始化三个步骤来完成. 其中链接中包括 校验、准备和解析. 下面对这些概念进行解析:. 装载:查找和导入类或接口的二进制数据,常用的是根据类的路径加载,还有根据网络的地址加载. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的;.

java中一个对象的初始化过程

- - CSDN博客编程语言推荐文章
/* 该类演示了一个对象的初始化过程 */ class Person {. //堆内存默认初始化为null. private static String country="中国"; //静态属性,存在于方法区,随着类的加载而加载. System.out.println("静态代码块执行");. System.out.println("构造代码块执行");.

Java 类初始化顺序

- - Java - 编程语言 - ITeye博客
  对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是. 1.(静态变量、静态初始化块)注:这两个的初始化顺序为在类中先后出现的顺序. 2(变量、初始化块)注:这两个的初始化顺序为在类中先后出现的顺序.  我们也可以通过下面的测试代码来验证这一点:. public static String staticField = "静态变量";.

来说说Java中的实例初始化器

- - ImportNew
文首先给出个例子来探究下什么是 实例变量初始化器,什么是 实例初始化器,以及什么是 静态初始化器. 然后看看实例初始化器是怎么工作的. 先看看下面这段代码,你觉着哪部分会先被执行呢. //instance variable initializer 实例变量初始化器. //constructor 构造函数.

Java的对象驻留

- - Java译站
Java会将源代码中的字符串常量存储到常量池中. 这不只是说它俩的值是一样的,而是说就是同一个字符串对象. 用Java的话来说就是a==b的结果是true. 然而这个只对字符串以及小的整型或者长整型有效. 其它的对象是不会被驻留的,也就是说如果你创建了两个对象而他们的值是相等的,但他们并不是同一个对象.

java类加载中不会触发初始化的被动引用

- - Java - 编程语言 - ITeye博客
我们知道,在初始化一个类时,如果它的父类没有进行初始化,那么JVM就会触发其父类的初始化动作. 但是,当我们引用类的时候,可不一定会触发其初始化,这种引用类的方式称为被动引用. 可是没有竟然没有对Child类进行初始化. 这是因为val为静态字段,只有直接定义这个字段的类才会被初始化,故通过子类来引用父类静态字段val,只会触发Father类的初始化,而不会触发Child类的初始化,so 就没有Child类的事.

理解Java对象序列化

- - 博客 - 伯乐在线
来源: jiangshapub 的博客( @jiangshapub). 关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结. 此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制. 在撰写本文时,既参考了 Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文、码并茂,希望对大家有所帮助.

java bean对象之间复制属性

- - Java - 编程语言 - ITeye博客
在现在的企业级Java应用程序中, Java Bean被广泛的应用. 一堆的相关的划分也应运而生, 如DTO, DAO, BO, POJO, VO等. 这里不去管这些概念的细节, 如果你感兴趣,可以google之, 比如 这篇文章. 这里要讨论的问题是如何在不同的Java Bean对象之间复制它们的属性.

[Json]json-lib简单处理java对象变为json对象

- - CSDN博客编程语言推荐文章
由于js对json的原生支持,所以现在很多项目的数据传输都喜欢用json. 怎么样把数据从java对象转化为json对象,有怎么把前台的json对象转化成java对象去处理. json-lib是sourceforge的一个开源项目,常用来解决java json数据转换的问题. 下载地址是 http://sourceforge.net/projects/json-lib/.

JAVA内存使用--如何计算一个Java对象占用的字节数

- - Java - 编程语言 - ITeye博客
转自(http://blog.csdn.net/kp034/article/details/7077757). 通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的. 1.某些情况下,JVM根本就没有把Object放入堆中. 例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中.