这里讲的不是类加载机制,是类的加载先后顺序。话不多说了,先设定以下场景:
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类一直没有机会实例化,因此可以删除
相关推荐
4.知道了static的作用,那么X类被加载,那么就会先执行X类的静态属性和静态语句块(static),执行先后顺序看谁在前面就先执行谁。只在此时执行,以后都不会。 5.所以一个输出结果为tttt,没问题了吧。 6.X类的...
java servlet spring web filter listenr
Q0032 Oracle的集合操作函数,如sum(),avg(),max(),min(),与select,where,grouby,having的先后顺序,使用方法 Oracle集合查询基本知识,只有进行分组的列,才可以取在集合查询SQL语句中取字段,先Group By,再Having...
静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....
4、可以表达出不同事件发生的先后顺序。 缺点:精确性较差,不能保证能把信息送到客户器。 "拉"的好处包括: 1、如果观察者众多,Subject来维护订阅者的列表,可能困难,或者臃肿,把订阅关系 解脱到Observer去完成...
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 封装...
非常有用的GitHub链接(顺序不分先后): OkHttpUtils-2.0.0 升级后改名 OkGo,全新完美支持RxJava,比Retrofit更简单易用。 完全仿微信的图片选择,并且提供了多种图片加载接口,选择图片后可以旋转,可以裁剪成...
本网盘分享章节编号是按照视频更新的先后顺序编号的,具体学习可参考如下章节顺序: 【第一版第一章】老罗Android开发视频--入门介绍(9集) 【第一版第二章】老罗Android开发视频--常用UI布局介绍(5集) 【第一...
7.4.html 检测onkeydown事件与onkeypress事件执行的先后顺序。 7.5.html 窗口离开时提示。 7.6.html 防止onresize事件重复执行。 7.7.html onerror事件相关处理。 7.8.html onsubmit事件使用...
Tfile的Hibernate映射文件Tfile.hbm.xml放在Tfile .java类文件的相同目录下: 代码 2 领域对象映射文件 1. 2. !DOCTYPE hibernate-mapping PUBLIC 3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 4. ...
SignalR是一个双工连接,实际上是有先后顺序的 服务器端托管模型具有以下几个优点 ● 下载大小明显小于客户端应用,且应用加载速度更快。 ● 应用充分利用服务器功能,包括使用任何与.NET Core兼容的Api。 ...
第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 ...