`

java类加载先后顺序

 
阅读更多

这里讲的不是类加载机制,是类的加载先后顺序。话不多说了,先设定以下场景:

 

package com.jingdong;

public class A {
	
	public  static  void main(String[] args){
		System.out.println(Ib.b);
			B b=new B();
			b.ibTest();
	}
}

 

public class B implements Ib{
	private D d;
	private C c=new C();
	@Override
	public void ibTest() {
		// TODO Auto-generated method stub
		System.out.println("ibtest hello1");
		d=new D();
	}
}

 

public class C implements Ic{

	@Override
	public void icTest() {
	}
	
}

 

public class D {

}

 

public interface Ib {
	public static String b="this b ";
	public void ibTest();
}

 

public interface Ic {
	public void icTest();
}

 

执行该程序:java -verbose:class com.jingdong.A

输出如下:

[Loaded com.jingdong.A from file:/F:/myj2ee/j2ee/classTest/src/]

this b 

[Loaded com.jingdong.Ib from file:/F:/myj2ee/j2ee/classTest/src/]

[Loaded com.jingdong.B from file:/F:/myj2ee/j2ee/classTest/src/]

[Loaded com.jingdong.Ic from file:/F:/myj2ee/j2ee/classTest/src/]

[Loaded com.jingdong.C from file:/F:/myj2ee/j2ee/classTest/src/]

ibtest hello1

[Loaded com.jingdong.D from file:/F:/myj2ee/j2ee/classTest/src/]

 

顺序如下:

首先JVM查找main方法,加载到A类

main方法第一句是:System.out.println(Ib.b);输出了:this b 

注意此时并没有加载Ib接口,说明:在使用接口的静态变量时是不会加载该接口口的

 

main方法第二句:B b=new B();输出了:

[Loaded com.jingdong.Ib from file:/F:/myj2ee/j2ee/classTest/src/]

[Loaded com.jingdong.B from file:/F:/myj2ee/j2ee/classTest/src/]

说明加载了B,在加载B时,会优先加载B的超类(父类)和接口.这里有个疑问,到底是表达表B b触发了加载B类还是new B()呢,后面会讲到。

 

再看后面两句输出:

[Loaded com.jingdong.Ic from file:/F:/myj2ee/j2ee/classTest/src/]

[Loaded com.jingdong.C from file:/F:/myj2ee/j2ee/classTest/src/]

该输出是由于加载B类触发的,因为B类用到了成员变量C,D,但是为什么只加载了C而没有加载D呢。看B的声明:

private D d;

private C c=new C();

这说明:

只是引用一个类时是不会类加载器去加载该类的,只有在需要实例化类或者调用XXX.class时才会去加载。这里只有C被实例化了,因此只会输出加载了Ic和C

 

最后A类的main方法执行了:b.ibTest();

输出如下:System.out.println("ibtest hello1");

然后再执行语句d=new D();的时候触发了D的加载。

 

 

现在我好奇如果我们把d=new D();去掉,在javac以后(即编译以后)是不是就可以把D.class删了呢。

经实验发现这的确是可行的,因为D类一直没有机会实例化,因此可以删除

 

3
2
分享到:
评论
2 楼 bernoulli 2013-10-15  
fncj 写道
厉害,现在在工作的过程经常会遇到因为类加载顺序导致的问题

请关注类初始化顺序
1 楼 fncj 2013-10-15  
厉害,现在在工作的过程经常会遇到因为类加载顺序导致的问题

相关推荐

    java面试题静态加载顺序构造方法

    4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。 5.所以一个输出结果为tttt,没问题了吧。 6.X类的...

    web.xml文件中配置(servlet, spring, filter, listenr)的加载顺序

    java servlet spring web filter listenr

    java面试800题

    Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....

    java设计模式选择题复习题.doc

    4、可以表达出不同事件发生的先后顺序。 缺点:精确性较差,不能保证能把信息送到客户器。 "拉"的好处包括: 1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系 解脱到Observer去完成...

    javaSE代码实例

    11.5.2 多个catch语句的先后顺序 218 11.6 断言 219 11.6.1 什么是断言 219 11.6.2 如何启用/关闭断言 220 11.6.3 防止滥用断言 222 11.7 小结 222 第12章 封装类——鸿沟之上的桥梁 223 12.1 封装...

    java安卓仿微信聊天软件源码-Note:有用的网址总结

    非常有用的GitHub链接(顺序不分先后): OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持RxJava,比Retrofit更简单易用。 完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成...

    老罗android开发视频教程全集百度网盘下载

    本网盘分享章节编号是按照视频更新的先后顺序编号的,具体学习可参考如下章节顺序: 【第一版第一章】老罗Android开发视频--入门介绍(9集) 【第一版第二章】老罗Android开发视频--常用UI布局介绍(5集) 【第一...

    JavaScript完全自学宝典 源代码

    7.4.html 检测onkeydown事件与onkeypress事件执行的先后顺序。 7.5.html 窗口离开时提示。 7.6.html 防止onresize事件重复执行。 7.7.html onerror事件相关处理。 7.8.html onsubmit事件使用...

    ssh(structs,spring,hibernate)框架中的上传下载

    Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下:  代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...

    P13_Blazor项目模板讲解ThreeBlazor2020_1_11.rar

    SignalR是一个双工连接,实际上是有先后顺序的 服务器端托管模型具有以下几个优点 ● 下载大小明显小于客户端应用,且应用加载速度更快。 ● 应用充分利用服务器功能,包括使用任何与.NET Core兼容的Api。 ...

    C#微软培训资料

    第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 ...

Global site tag (gtag.js) - Google Analytics