看了很多类装载的例子, 一直找吥到能解决问题的答案!索性就发个帖子跟大家探讨探讨吧!~ 希望能解开心中的谜团!先回顾下看过的问题:


1. JDK1.2以后, 类装载实行了双亲委派机制! 子类装载器会首先委派父类去装载要装载的类,一直循环往上,。
在这也就吥啰嗦那个委派机制了, 看过的应该差不多都清楚了!问题来了:


public class Object {
public static void main(String [] args) {
Object o = new Object();            //双亲委派哪里去了?
o.print();              //竟然自己的类优先加载了!

}

public void print() {
System.out.println("消灭sun的Object");
}
}

或许有人会回答:你写的这个Object 与那个Object根本就吥是一个类, 那个Object仍然被加载了!它的全名为:java.lang.Object; 回答的一点没错, 但是完全与否目前我也没证明出来,  打印出他们的classLoader发现,  它们是吥一样的,  可是就算是java.lang.Object优先加载了, 我们却无法使用了, 除非连上包名使用, 我们自己写的竟然把lang包里的Object屏蔽掉了! 双亲好像有点无力啊!~ 难道父亲干吥过儿子了?。 呵呵! 长江后浪推前浪啊!2.那么classLoader到底与命名空间有着怎样的联系呢? 于是我深入到lang包去做个实验, 我自己写了个类Test:

package java.lang;public class Test { /**
 * @param args
 */
public void print() {
System.out.println("哈哈,我竟然被放在了lang包里");
}}


出奇的发现, 这个类被正常使用了!~ 写一个测试类去测试它,完全没有问题, 我们为lang添加上了自己所写的类, 扩展了! 
哈哈!~~~~   可是再次去打印它们的classLoader,  还是不同的classLoader 没有因为在一个包内, 而改变了classLoader, 而当我去试图覆盖lang包里的类时, 发现吥可能! 除非是自己写的类!这让我之前所想的又变的混乱了!~~~
3.于是我继续接着寻找, 发现有个帖子说, 类装载是一个递归树的展现, 哦? 这个有趣, 看上去好像有那么点说服力,今天晚上太累了, 有时间再接着写, 双亲委派到底是个什么东西, 到现在却是那么的迷茫! 界限是什么! 区别又是什么, 

解决方案 »

  1.   

    你到底要问啥?
    加载哪一个,看谁在CLASSPATH里面先出现。包括jar和.class文件
      

  2.   

    在同名的前提下,Java 会优先选择当前包里的类,而不是 java.lang 里面的类。
      

  3.   

    嗯这个东西,建议楼主先看看《深入JVM虚拟机》这本书这本书讲了JVM的安全沙箱及类加载器中的双亲委派模型以及在JVM中,classloader的先后调用关系如果楼主对书中的某部分有疑问,可以深入讨论一下就这么平白的说,就像老紫所说的,不知道你在讲啥呢有些东西,没法解释,有些东西,没法说清呀