think in java--7.10初始化及类加载的理解

1.在java中每个类都会编译成一个独立得文件。该文件只会在程序需要使用的时候才加载。可以说:类得代码在初次使用的时候才会加载。还有,当访问static域或者方法时候,也会发生加载。初次使用之处也是static加载发生之处,所有的static对象和static方法都会在加载时按照程序顺序加载,定义为static 只会被加载一次。

2.程序运行得顺序:先找main入口,然后看看有没有基类(extends关键字),如果有就初始化基类,依次类推,初始化完毕后然后按照程序执行。

3.每一个非基本类型的对象都有一个toString()方法,而且当编译器需要一个String而你只有一个对象时,该方法被调用。

代码:

package test2;

class A {
    static String a = print("a-static初始化");

    static String print(String str) {
        System.out.println(str);
        return str;
    };

    A() {
        System.out.println("A构造函数初始化");
    };

    public String toString() {
        return "调用对象的toString方法";
    }
};

class B extends A {
    static String b = print("b-static初始化");

    static String print(String str) {
        System.out.println(str);
        return str;
    };

    B() {
        System.out.println("B构造函数初始化");
    };
};

class C {
    static String c = print("c-static初始化");

    static String print(String str) {
        System.out.println(str);
        return str;
    }

    static A a = new A();
};

class D {
    D() {
        System.out.println("D构造函数初始化");
    };

};

class Demo extends B {
    static String d = print("demo-static初始化");

    static String print(String str) {
        System.out.println(str);
        return str;
    }

    Demo() {
        System.out.println("Demo构造函数初始化");
    };

    public static void main(String[] args) {
        System.out.println("测试开始");
        System.out.println(C.a);
        D d2 = new D();
    }
};
/*
a-static初始化
b-static初始化
demo-static初始化
测试开始
c-static初始化
A构造函数初始化
调用对象的toString方法
D构造函数初始化
*/

代码说明:程序入口在main方法,Demo继承于B类,B继承于A类,A没有父类,所以先加载A的编译文件,A中的static属性先调用,打印"a-static初始化",然后依次加载B,Demo类,依次打印”b-static初始化“,”demo-static初始化“。然后程序往下走,打印”测试开始“,接着加载C类,打印”c-static初始化“,在C类里面调用A类的构造函数,最后是新建一个D类,加载D类,调用构造函数。

个人理解:前面3行打印说明了对static的访问会引发对类的加载,从C类中新建一个A类的对象可以看出,这里只打印了A的构造函数,没有在打印static属性,这里证明了类只加载了一次,并且static也只初始化一次。

 

猜你喜欢

转载自blog.csdn.net/stonennnn/article/details/80812387