java虚拟机类的加载顺序

本文通过具体的Java代码示例,详细解析了Java中类的加载顺序,包括静态成员、静态初始化块、实例成员、初始化块及构造方法的加载时机。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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一个对象时,会按先父类后子类的顺序初始化类的,静态变量,静态初始化块,普通变量,普通初始化块,构造函数等.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值