黑马程序员技术交流社区

标题: 关于Integer字节码类型的疑惑! [打印本页]

作者: 范龙波    时间: 2013-8-27 10:56
标题: 关于Integer字节码类型的疑惑!
本帖最后由 范龙波 于 2013-8-27 12:22 编辑

Class<Integer> clazz =  new Integer(12).getClass();
System.out.println(clazz == Integer.TYPE);
问题1: 打印结果为false ,为什么?
以下为Integer的源码
public static final Class<Integer> TYPE = (Class<Integer>)Class.getPrimitiveClass("int");
对于这句话的个人理解 :getPrimitiveClass("int"); 获取基本数据类型的字节码 --->转换为Integer.class : 如果是这样打印语句应该是true啊;
static native Class getPrimitiveClass(String name);
问题2:源码中用private代替 native  定义这个方法 有什么区别


作者: 张歆明    时间: 2013-8-27 11:19
楼主 打印出false就对了

[1]. 明确一点:Java有九大预定义Class对象:八种基本数据类型的Class对象+ 一种void类型的数据类型的Class对象

基本数据类型的字节码和其对应包装类的字节码是完全不一样的。因此对应的两者的Class对象也一定是不一样的。

这里面就是int.class和Integer.class就是两份不同的字节码

[2]. 针对你的问题1
{1}. public static final Class<Integer> TYPE = (Class<Integer>)Class.getPrimitiveClass("int");
primitive:单词的含义是“原始的,基本的”   PrimitiveClass的含义就是基本类型   
Class.getPrimitiveClass("int")获取到的就是int.class
{2}. 楼主注意:强转的类型和赋值左边的类型都是参数化类型,就是含有类型变量的类型,泛型的一种体现。
Java中的泛型仅仅是对编译器有效的,防止非法取值。但是编译器编译完成之后,就对泛型进行了擦除。
由于Class这个类型的源码声明是:
public class Class<T> ......{...}  这个泛型类的类型变量没有使用extends关键字进行限定,因此泛型擦除最彻底,直接擦除到Object类。

所以 上面编译之后,擦除后的代码是:
public static final Class TYPE = Class.getPrimitiveClass("int");

运行的时候,这个Type就是指向int.class对象。但是你比较的另一端(Class<Integer> clazz =  new Integer(12).getClass();)是Integer.class  因此 一定是不一样的  打印结果就是false
[2]. 针对你的问题2
源码中用private代替 native  定义这个方法 有什么区别

native是本地化方法,表示这个方法具体实现是直接调用的底层操作系统的资源完成的。这个是不能对外公开的(操作系统的内核)
因此没有方法体。这种没有方法体但是被native修饰的方法是你看不到方法体,但是不代表真的没有方法体。这和抽象方法是不一样的。

private是访问权限修饰符   和native没关系


作者: 范龙波    时间: 2013-8-27 11:24
说的很清楚 ,答案很给力 !
作者: code_geass    时间: 2013-8-27 11:35
{:soso_e140:} TYPE不是说了对应int的字节码了嘛。又不是integer的。话说技术分怎么得快啊。。赶不上24期了要
作者: 张歆明    时间: 2013-8-27 14:01
范龙波 发表于 2013-8-27 11:24
说的很清楚 ,答案很给力 !

呵呵 恩 多多交流哈 嘿嘿





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