java虚拟机类的加载顺序

来源:互联网 发布:当当阅读器知乎 编辑:程序博客网 时间:2024/05/02 02:28
Parent.java
package book.oo.initorder;

public class Parent
{
    
private int ix = 50;

    
private static int iz = getNext(30);
    
{
        System.out.println(
"Parent的初始化块");
        
int x = 100;
        
int y = 100// getNext(100);
    }

    
static
    
{
        System.out.println(
"Parent的静态初始化块");
        
int sx = 100;
        
int sy = getNext(100);
    }


    
private int endall = 1;

    
public Parent()
    
{
        System.out.println(
"Parent的构造方法被调用");
    }


    
public void display()
    
{
        System.out.println(
"Parent的display方法被调用");
        System.out.print(
"ix=" + this.ix);
        System.out.println(
"; iz=" + iz);
        dispA();
    }


    
public static void dispA()
    
{
        System.out.println(
"Parent的dispA()被调用");
    }


    
public static int getNext(int base)
    
{
        System.out.println(
"Parent的getNext(int base)被调用");
        
return ++base;
    }


    
/**
     * 当Java在进行垃圾回收时,会调用对象的finalize方法
     
*/

    
protected void finalize()
    
{
        System.out.println(
"Parent的销毁方法被调用");
    }

}

 

Child.java

package book.oo.initorder;

public class Child extends Parent
{
    
{
        System.out.println(
"Child的初始化块");
        
int bx = 100;
    }

    
static
    
{
        System.out.println(
"Child的静态初始化块");
    }


    
public Child()
    
{
        
super();
        System.out.println(
"Child的构造方法被调用");
    }


    
public static void dispB()
    
{
        System.out.println(
"Child的dispB()被调用");
    }


    
/**
     * 当Java在进行垃圾回收时,会调用对象的finalize方法
     
*/

    
protected void finalize()
    
{
        System.out.println(
"Child的销毁方法被调用");
        
super.finalize();
    }

}

 

ClassInitOrderTest.java

package book.oo.initorder;

public static void main(String[] args)
{
    System.out.println(
"不new对象,访问静态方法时的输出:");
    Child.dispB();

    System.out.println();
    System.out.println(
"new对象,访问非静态方法时的输出:");
    
new Child().display(); //通知虚拟机进行垃圾回收 System.gc();

}

 

以上代码摘抄自 JAVA JDK实例宝典,但书中关于JAVA类的加载部分有误,但代码可用来作测试,了解类的加载顺序

当一个类或它的子类调用它的静态方法时,如上面的Child.dispB(),虚拟机会先初始化类的静态变量,静态初始化块,其初始化顺序按照变量和初始化块在程序中的位置来决定,依次按排在前面到后面的顺序初始化,初始化静态变量和静态初始化块的顺序没有先后之分,但不会初始化烊的静态方法.如Child.dispB()这样访问类的静态方法的时候,不会初始化类的初始化块,构造函数,普通变量等.

当一个类new一个对象时,会按先父类后子类的顺序初始化类的,静态变量,静态初始化块,普通变量,普通初始化块,构造函数等.

原创粉丝点击