类加载和初始化

2017-08-31  本文已影响0人  小贱嘎嘎

对象的创建过程

当首次创建某个类的对象时(构造器可看作静态方法),或者类的静态方法/静态域被访问时,Java解释器会定位并加载类的.class文件,所有静态初始化动作都会执行,这个静态初始化动作只执行一次。
--------------------分割线---------------------
总结一下对象的创建过程,假设有一个名为Dog的类:
1,即使没有显式的使用static关键字,构造器实际上也是静态方法。因此当创建类型为Dog的对象,或者Dog类的静态方法/静态域首次被访问时,Java解释器查找类路径,定位Dog.class文件。
2,载入Dog.class(将会创建一个Class对象),有关静态初始化的动作全部执行。因此,静态初始化只在Class对象首次加载时候进行一次。
3,当用new Dog()创建对象时,将在堆上分配足够的存储空间。
4,此块存储空间被清空,所以所有的基本数据类型被设置为默认值,引用类型被置为null。
5,执行所有出现于字段定义处的初始化动作
6,执行构造器

普通初始化例子

根据下面代码写出输出结果

package com.patrick.bishi;

public class TestVar {
    public static int k = 0;
    public static TestVar t1 = new TestVar("t1");
    public static TestVar t2 = new TestVar("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");
    {
        print("构造");
    }
    static {
        print("静态");
    }

    public TestVar(String str) {
        System.out.println((++k) + ":" + str + "    i=" + i + " n=" + n);
        ++i;
        ++n;
    }

    public static int print(String str) {
        System.out.println((++k) + ":" + str + "    i=" + i + " n=" + n);
        ++n;
        return ++i;
    }

    public static void main(String[] args) {
        TestVar t = new TestVar("init");
    }
}

分析:
1,执行main函数时进行类的加载,此时静态数据被置为默认值k=0,t1=null,t2=null,i=0,n=0。
2,执行静态初始化语句与静态初始化块

父类子类初始化顺序

父类:

public class Person {

    {
        System.out.println("父类非静态块");
    }

    static {
        System.out.println("父类静态块");
    }

    public Person() {
        System.out.println("父类构造器");
    }
}

子类:

public class Male extends Person{

    {
        System.out.println("子类非静态块");
    }

    static {
        System.out.println("子类静态块");
    }

    public Male() {
        System.out.println("子类构造器");
    }

}

测试类:

public class Main {

    public static void main(String [] args){
        Person person = new Male();
    }

}

输出结果:

父类静态块
子类静态块
父类非静态块
父类构造器
子类非静态块
子类构造器
上一篇 下一篇

猜你喜欢

热点阅读