类的加载过程(类的初始化)

类的加载过程(类的初始化)

1.加载父类的静态变量

2.加载父类的静态代码快

3.加载子类的静态变量

4.加载子类的静态代码快

(其实,静态变量和静态代码块肯定是按照顺序初始化的,反正java语法不支持提前引用)

类的实例化,相当于JVM对字节码文件信息的一次扫描,并且把扫描结果分类存放到方法区中。

而方法区里存放什么呢,其实我一直对这块比较模糊,之前只知道方法区中,有常量池、有存放静态变量的静态区,在学习了反射,发现方法区中有Field区、Method区,还存放着类的继承、接口等信息。

实例:

package com.xm.load;

public class Animal {

    static String str = "I`m a animal!";

    static {
        System.out.println(str);
        System.out.println("加载父类静态代码块");
    }



}

class Dog extends Animal{

    static String str = "I`m a dog!";

    static {
        System.out.println(str);
        System.out.println("加载子类静态代码块");
    }


    public static void main(String[] args) {
        new Dog();
    }
}

结果:

I`m a animal!

加载父类静态代码块

I`m a dog!

加载子类静态代码块

要知道,类的加载和对象的实例化是不一样的。

类的加载只会发生一次,而对象的实例化却是和new的次数相关的。

而类的加载一定会发生在对象的初始化之前。

实例:

package com.xm.load;

public class Animal {

    static String str = "I`m a animal!";

    static {
        System.out.println(str);
        System.out.println("加载父类静态代码块");
    }

    static void doing() {
        System.out.println("This ia a Animal!");
    }

    public Animal() {
        doing();
        System.out.println("Animal 对象实例化");
    }


}

class Dog extends Animal{

    static String str = "I`m a dog!";

    static {
        System.out.println(str);
        System.out.println("加载子类静态代码块");
    }

    static void doing() {
        System.out.println("This ia a dog!");
    }

    public Dog() {
        doing();
        System.out.println("Dog 对象实例化");
    }


    public static void main(String[] args) {
        new Dog();
    }
}

结果:

I`m a animal!

加载父类静态代码块

I`m a dog!

加载子类静态代码块

This ia a Animal!

Animal 对象实例化

This ia a dog!

Dog 对象实例化

posted @ 2019-01-24 09:05  零度微笑  阅读(347)  评论(0编辑  收藏  举报