A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangkerui 中级黑马   /  2014-5-31 18:33  /  1711 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wangkerui 于 2014-6-1 23:41 编辑

一个 Class 对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个。

  1. class Test
  2. {
  3.           public static void main(String[] args) throws Exception
  4.           {
  5.                
  6.                       String s1 = "abc";
  7.                       String s2 = "xyz";
  8.                
  9.                       Class c1 = s1.getClass();
  10.                       Class c2 = s2.getClass();
  11.                
  12.                       System.out.println(c1==c2);
  13.           }
  14. }   
复制代码
程序运行的结果为  true 。印证了“相同类型的对象得到的字节码是同一个。”,但还是不明白,既然对象都不同,为什么仅仅因为类型相同就认为他们的字节码是同一个呢?

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

5 个回复

倒序浏览
因为他们属于同一个string 类型的数据

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
也许在虚拟机加载完代码后,里面只存一分相同类型的字节码
回复 使用道具 举报
只要是被虚拟机加载过的话,同一种类型的Class,就只有一份字节码
一:反射的基石
1:反射技术建立在jdk提供的Class类上,因此要掌握反射技术,首先要熟悉Class类。
2:通过Class类就可以得到java类中方方面面的内容<如:java类中的:构造方法(Constructor)、属性(field)、方法(method)>。
3:Class  cls=?(?代表什么,你知道吗?)
  注:?代表字节码
4:什么是字节码?
注:java代码编译的时候,将java源程序翻译成字节码<.class>存储到硬盘上,然后类加载器将字节码加载到jvm的内存中,生成一个又一个java对象。       
5:得到字节码的三种方式:
        String str1="abc"
        Class cls1=str1.getClass();<通过对象得到字节码>
        Class cls2=String.class;<通过类得到字节码>
        Class  cls3=Class.forName("java.lang.String");<通过包名得到字节码>
注:得到了一个类的字节码,那么就可以得到字节码的全部成分,下面将一一介绍.
6:同一类型的字节码相同吗?
        System.out.println(cls1==cls2);返回:true
        System.out.println(cls1==cls3);返回:true
注:说明同一类型的字节码只有一份,同一类型的字节码是相同的。
二:字节码的简单应用<检测数据的类型>
      1: String str1="abc";
       Class cls1=str1.getClass();
       //测试String是否为基本类型的字节码,返回false;因为:String是一个类        System.out.println(cls1.isPrimitive());
      2: //int是基本类型的字节码,返回true
        System.out.println(int.class.isPrimitive())
      3:   //int是基本类型,Integer是类,因此返回:false
        System.out.println(int.class==Integer.class);
      4: //包装类型的基本类型的字节码比较,返回true
        System.out.println(int.class==Integer.TYPE);
      5://数组不是基本类型,返回false
      System.out.println(int[].class.isPrimitive());
回复 使用道具 举报
fenzheng 发表于 2014-5-31 19:28
只要是被虚拟机加载过的话,同一种类型的Class,就只有一份字节码
一:反射的基石
1:反射技术建立在jdk提供 ...

谢啦,呵呵!
回复 使用道具 举报
楼主的反射概念没搞清楚哦,getClass()获取的是字节码的类型,s1和s2的字节码类型都是String.class,所以他们相等,这和对象中的内容没有任何关系的

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马