欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

图文详解Java中class的初始化顺序

程序员文章站 2024-03-13 13:45:33
class的装载 在讲class的初始化之前,我们来讲解下class的装载顺序。 以下摘自《thinking in java 4》 由于java 中的一切东西都是对象...

class的装载

在讲class的初始化之前,我们来讲解下class的装载顺序。

以下摘自《thinking in java 4》

由于java 中的一切东西都是对象,所以许多活动

变得更加简单,这个问题便是其中的一例。正如下一章会讲到的那样,每个对象的代码都存在于独立的文件中。除非真的需要代码,否则那个文件是不会载入的。通常,我们可认为除非那个类的一个对象构造完毕,否则代码不会真的载入。由于static 方法存在一些细微的歧义,所以也能认为“类代码在首次使用的时候载入”。

首次使用的地方也是static 初始化发生的地方。装载的时候,所有static 对象和static 代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。当然,static 数据只会初始化一次。

简要的说就是,在类有继承关系时,类加载器上溯造型,进行相关类的加载工作。

比如:

class b extends class a
当我们new b()时,类加载器自动加载a的代码

class的初始化顺序

通常是以下这样的初始化顺序:

(static对象和static代码块,依据他们的顺序进行初始化)>成员变量>构造函数

图文详解Java中class的初始化顺序

测试代码

public class classinit {

  /**
   * @title:       main
   * @description:   类初始化顺序测试
   * @param:       @param args  
   * @return:     void  
   * @throws
   */
  public static void main(string[] args) {
    // todo auto-generated method stub    
    new b();
  }

}

class a {
  static{
    system.out.println("a的static代码块...");
  }
  public string s1 = prtstring("a的成员变量...");
  public static string s2 = prtstring("a的static变量...");
  public a(){
    system.out.println("a的构造函数...");
  }

  public static string prtstring(string str) {
    system.out.println(str);
    return null;
  }
}

class b extends a{
  public string ss1 = prtstring("b的成员变量...");
  public static string ss2 = prtstring("b的static变量...");
  public b(){
    system.out.println("b的构造函数...");
  }
  private static a a = new a();
  static{
    system.out.println("b的static代码块...");
  }
  {
    system.out.println("代码块...");
  }  
}

测试结果

a的static代码块...
a的static变量...
b的static变量...
a的成员变量...
a的构造函数...
b的static代码块...
a的成员变量...
a的构造函数...
b的成员变量...
代码块...
b的构造函数...

总结

以上就是java中class的初始化顺序的全部内容,希望对大家使用java能有所帮助。