class的装载

来源:互联网 发布:php 16进制转字符串 编辑:程序博客网 时间:2024/06/04 18:56

    由于Java 中的一切东西都是对象,所以许多活动变得更加简单,每个对象的代码都存在于独立的文件
中。除非真的需要代码,否则那个文件是不会载入的。通常,我们可认为除非那个类的一个对象构造完毕,
否则代码不会真的载入。由于static 方法存在一些细微的歧义,所以也能认为“类代码在首次使用的时候载入”。
首次使用的地方也是static 初始化发生的地方。装载的时候,所有static 对象和static 代码块都会按照本
来的顺序初始化(亦即它们在类定义代码里写入的顺序)。当然,static 数据只会初始化一次。

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

<code class="hljs vbnet has-numbering"><span class="hljs-keyword">Class</span> B extends <span class="hljs-keyword">Class</span> A当我们<span class="hljs-keyword">new</span> B()时,类加载器自动加载A的代码</code>
<code class="hljs cs has-numbering">(<span class="hljs-keyword">static</span>对象和<span class="hljs-keyword">static</span>代码块,依据他们的顺序进行初始化)>成员变量>构造函数</code>

public class A { static{        System.out.println("A的static代码块...");    }    {        System.out.println("A代码块...");    }     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;    }}public 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("B代码块...");        }   }


A的static代码块...

A的static变量...

B的static变量...

A代码块...
A的成员变量...
A的构造函数...
B的static代码块...
A代码块...
A的成员变量...
A的构造函数...
B的成员变量...
B代码块...
B的构造函数...

下面进行分析:

     代码块和成员变量的初始化顺序(不论是静态的还是非静态的)依他们在代码中的顺序而定,在类加载时,先加载静态的一系列(假定静态变量都写在静态代码块前面,因为静态代码块的作用是为静态变量赋值),当类初次加载时: 父静态变量,父静态代码块,子静态变量,子静态代码块,父成员变量,父代码块,父构造,子成员变量,子代码块,子构造。

       当类不是初次加载时,就不再执行类的静态变量和静态代码块。
0 0
原创粉丝点击