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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 范龙波 高级黑马   /  2013-8-27 10:56  /  2370 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 范龙波 于 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  定义这个方法 有什么区别

评分

参与人数 1技术分 +2 收起 理由
张智文 + 2

查看全部评分

4 个回复

倒序浏览
楼主 打印出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没关系

评分

参与人数 1技术分 +2 收起 理由
张智文 + 2

查看全部评分

回复 使用道具 举报
说的很清楚 ,答案很给力 !
回复 使用道具 举报
{:soso_e140:} TYPE不是说了对应int的字节码了嘛。又不是integer的。话说技术分怎么得快啊。。赶不上24期了要
回复 使用道具 举报
范龙波 发表于 2013-8-27 11:24
说的很清楚 ,答案很给力 !

呵呵 恩 多多交流哈 嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马