黑马程序员技术交流社区
标题:
能不做自己写个类,也叫java.lang.String?
[打印本页]
作者:
ozt6719393
时间:
2013-5-23 15:38
标题:
能不做自己写个类,也叫java.lang.String?
能不做自己写个类,也叫java.lang.String?
作者:
王靖远
时间:
2013-5-23 15:53
你要自己写lang包,然后再写String类?你也太厉害了吧。你单独写String类不还是复写吗,除非你给lang包都自己写
作者:
逸盏清茶
时间:
2013-5-23 15:55
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。
作者:
student
时间:
2013-5-23 16:39
本帖最后由 student 于 2013-5-23 16:44 编辑
可以,但是即使你写了这个类,也没有用。
这个问题涉及到加载器的委托机制,在类加载器的结构图(在下面)中,
BootStrap
是顶层父类,
ExtClassLoader
是
BootStrap
类的子类,
ExtClassLoader
又是
AppClassLoader
的父类
这里以java.lang.String为例,当我是使用到这个类时,Java虚拟机会将java.lang.String类的字节码加载到内存中。
为什么只加载系统通过的java.lang.String类而不加载用户自定义的java.lang.String类呢?
因加载某个类时,优先使用父类加载器加载需要使用的类。如果我们自定义了java.lang.String这个类,
加载该自定义的String类,该自定义String类使用的加载器是
AppClassLoader
,根据优先使用父类加载器原理,
AppClassLoader
加载器的父类为
ExtClassLoader
,所以这时加载
String使用的类加载器是
ExtClassLoader
,
但是类加载器
ExtClassLoader
在
jre/lib/ext
目录下没有找到String.class类。
然后使用
ExtClassLoader
父类的加载器
BootStrap
,
父类加载器
BootStrap
在
JRE/lib
目录的
rt.jar
找到了String.class,将其加载到内存中。这就是
类加载器的委托机制。
所以,用户自定义的java.lang.String不被加载,也就是不会被使用。
类加载器结构图.png
(72.83 KB, 下载次数: 1)
下载附件
2013-5-23 16:40 上传
类加载器结构图
作者:
刘胜寒
时间:
2013-5-24 00:59
支持楼主的想法。。
作者:
王溢君
时间:
2013-5-24 01:09
写了也是白写。委托机制的问题。
作者:
a382541804
时间:
2016-4-27 18:06
原来如此 刚好碰到这个问题
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2