黑马程序员技术交流社区

标题: 关于Class类字节码,有点绕不过弯儿来 求坛友指点 [打印本页]

作者: 李慧声    时间: 2013-4-29 14:39
标题: 关于Class类字节码,有点绕不过弯儿来 求坛友指点
本帖最后由 李慧声 于 2013-4-30 09:50 编辑

                 String str1 = "abc";
                Class cls1 = str1.getClass();
                Class cls2 = String.class;
                Class cls3 = Class.forName("java.lang.String");
                System.out.println(cls1 == cls2);
                System.out.println(cls2 == cls3);

为啥两个都是true呢?张老师的听的不大懂,求通俗的解释,谢谢!

作者: 董维明    时间: 2013-4-29 20:10
因为java中只有一个String类,,而你获取的是String类型的 字节码,无论你创建多少String对象,,其指向的 永远都是同一个String.class文件,,,所以就相等咯
作者: cowthan    时间: 2013-4-29 20:13
这都是java.lang.String对应的Class对象,当你运行这个程序时,你觉得你的系统能载入几个java.lang.String?
当然就一个啊,所以只要是java.lang.String对Class对象,不管你是通过什么手段获得的,都是同一个
作者: 任江峰    时间: 2013-4-29 20:46
这里比较的是他们的类型,cls1,cls2,cls3的类型都是String,只是用不同的方法获取的。
所以他们比较的结果是true.
作者: 杨同旺    时间: 2013-4-29 20:51
String是一个类,"abc"只是String类的一个对象,

如果想使用类和对象,必须把这个类加载到内存中去,

无论怎么使用,类只会被加载一次,

所以很多String类的对象只会对应一个String的字节码文件,String类的字节码文件也只有一个,通过什么方式也只会得到这一个,

类的对象却可以在内存中生成多个.
作者: 伊廷文    时间: 2013-4-29 21:01
java中只有一个String类或者说只有一个String字节码,所以他们用的都是用的这个字节码,所以是true啊
作者: Sword    时间: 2013-4-30 01:36
得到各个字节码对应的实例对象有三种方式( Class类型)
一,类名.class,例如, String.class
二,对象.getClass(),例如,str1.getClass()
三,Class.forName("类名"),例如,Class.forName("java.util.String");

又因为String类的对象只会对应一个String的字节码文件,
String类的字节码文件也只有一个,
所以你通过这三种方式也只会得到同一个字节码文件

类的对象却可以在内存中生成多个.
作者: 李慧声    时间: 2013-4-30 09:44
董维明 发表于 2013-4-29 20:10
因为java中只有一个String类,,而你获取的是String类型的 字节码,无论你创建多少String对象,,其指向的  ...

哦 对哦 学习了 呵呵
作者: 李慧声    时间: 2013-4-30 09:45
cowthan 发表于 2013-4-29 20:13
这都是java.lang.String对应的Class对象,当你运行这个程序时,你觉得你的系统能载入几个java.lang.String ...

解决问题了 谢谢
作者: 李慧声    时间: 2013-4-30 09:45
任江峰 发表于 2013-4-29 20:46
这里比较的是他们的类型,cls1,cls2,cls3的类型都是String,只是用不同的方法获取的。
所以他们比较的结果 ...

恩 有道理
作者: 李慧声    时间: 2013-4-30 09:48
杨同旺 发表于 2013-4-29 20:51
String是一个类,"abc"只是String类的一个对象,

如果想使用类和对象,必须把这个类加载到内存中去,

嗯嗯 解决了
是该String类只在内存中加载一次 所以对应的String字节码只有一份 然后去引用创建的话 结果都是一样的
谢谢啊
作者: 李慧声    时间: 2013-4-30 09:49
伊廷文 发表于 2013-4-29 21:01
java中只有一个String类或者说只有一个String字节码,所以他们用的都是用的这个字节码,所以是true啊 ...

嗯嗯 解决了
作者: 李慧声    时间: 2013-4-30 09:50
Sword 发表于 2013-4-30 01:36
得到各个字节码对应的实例对象有三种方式( Class类型)
一,类名.class,例如, String.class
二,对象.ge ...

嗯嗯 这个比较给力
作者: 符立波    时间: 2013-4-30 10:26
只有一份String.class在内存中.........
作者: 火之意志    时间: 2013-5-23 12:15
class类的字节码文件就是硬盘上文件目录的*.class文件,加载该文件到内存,只存在一个该文件的对象(且类的加载再起生命周期中只有一次),不同的调用方式调用的还是同一个对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2