Java面试问题之十

分析下面代码的运行结果,并给出具体的原因。


public class ClassB {
public static void main(String[] args) throws Exception {
ClassLoader loader=ClassLoader.getSystemClassLoader();
Class objClass=loader.loadClass("ClassA");
System.out.println("after load ClassA");
System.out.println("before init ClassA");
objClass=Class.forName("ClassA");
}
}

class ClassA{
static{
System.out.println("now init ClassA");
}
}





问题分析:调用ClassLoader类的loadClass()方法加载一个类,并不是对这个类的主动使用,所以不会对这个类进行初始化工作。上面程序中,先使用系统类加载器加载ClassA,尽管ClassA被加载器加载了,但是Java虚拟机并没有对其进行初始化工作。当程序使用Class类的forName("ClassA")方法显示初始化ClassA时,才是对ClassA的主动使用,这将导致ClassA被初始化,所以它的静态代码段被执行。因此,程序运行的结果应该是:


after load ClassA
before init ClassA
now init ClassA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值