初学者的疑问:关于java引用类型标识符

FROM: http://www.javaeye.com/topic/125752


java有三种数据类型:基本类型、null以及引用类型,我想请教各位大佬一个问题:

      java是用“ClassType 标识符 ”来定义一个标识符的,比如“String str”、“int i”等等,对于这些标识符,我的理解是java首先存储标识符本身,再根据ClassType决定是存储基本类型的值还是引用类型的内存地址,对于后者,上述两步便构成一个句柄。既然句柄存储的是标识符本身和对象的内存地址,那么句柄本身的数据结构应该是固定的,因此,我就想用一个简单的办法定义所有的引用类型的标识符:

            Object 标识符x;

      当程序中需要明确“标识符x”的指向时,便利用以下的例子形式进行明确:

            标识符x=new String ("This is a Example");

      令我高兴的是,java编译程序认可了这种做法:不管new后面是什么类型,皆通过无错(即使是自定义类),但是麻烦很快来了:

java 代码
  1.     Object i;   
  2.     i = new Integer(12);   
  3.     System.out.println(i);   
  4. //或者是System.out.println(i.toString());    
  5. //此时编译通过,运行没问题,结果是12   
  6.   
  7. /*如果再加上一句:  
  8.     System.out.println(i.intValue());  
  9.      Eclipse提示错误:"the method intValue() is undefined for the type Object"  
  10. */   

            请注意:i句柄已经定义成功并且也指向了一个new Integer(12)对象,因为可以成功地输出"12"。可是,就因为我首先是用Object定义的i,java竟然只允许我使用Object类定义的方法,这是为什么?java为什么要在运行期做出此种限制呢?

   

时间:2007-09-20
Object对象有intValue这个方法吗?
   
0 请登录后投票

时间:2007-09-21
上传类问题,父类是只能调用自己有声明过且被子类继承的方法.intValue这个方法是Interger子类后来添加的.所以Object是不能调用该方法的
   
0 请登录后投票

时间:2007-09-21
cast to Integer class, or invoke dynamically
Java代码 复制代码
  1. //cast   
  2. System.out.println(((Integer)i)intValue());  
//cast
System.out.println(((Integer)i)intValue());

Java代码 复制代码
  1. //dynamic invocation 1.5 api   
  2. System.out.println( i.getClass().getMethod("intValue").invoke(i));  
//dynamic invocation 1.5 api
System.out.println( i.getClass().getMethod("intValue").invoke(i));
   
0 请登录后投票

时间:2007-09-26
gordon@java 写道
cast to Integer class, or invoke dynamically
Java代码 复制代码
  1. //cast   
  2. System.out.println(((Integer)i)intValue());  
//cast
System.out.println(((Integer)i)intValue());

Java代码 复制代码
  1. //dynamic invocation 1.5 api   
  2. System.out.println( i.getClass().getMethod("intValue").invoke(i));  
//dynamic invocation 1.5 api
System.out.println( i.getClass().getMethod("intValue").invoke(i));


第二种方法就是利用了java的反射机制,对吧。

根据上例,“i.getClass()”返回一个Integer Class,这说明标识符i已经成功地指向了一个Integer实例,而不管预先将其定义为何种引用类型!
因此,我想,当需要引用一个未知的类的实例时,完全可以采用 “Object 标识符x”,然后指向该实例,再getClass()的方式解决
   
0 请登录后投票

时间:2007-09-26
cmbscqhd 写道
gordon@java 写道
cast to Integer class, or invoke dynamically
Java代码 复制代码
  1. //cast   
  2. System.out.println(((Integer)i)intValue());  
//cast
System.out.println(((Integer)i)intValue());

Java代码 复制代码
  1. //dynamic invocation 1.5 api   
  2. System.out.println( i.getClass().getMethod("intValue").invoke(i));  
//dynamic invocation 1.5 api
System.out.println( i.getClass().getMethod("intValue").invoke(i));


第二种方法就是利用了java的反射机制,对吧。

根据上例,“i.getClass()”返回一个Integer Class,这说明标识符i已经成功地指向了一个Integer实例,而不管预先将其定义为何种引用类型!
因此,我想,当需要引用一个未知的类的实例时,完全可以采用 “Object 标识符x”,然后指向该实例,再getClass()的方式解决


但是这样的话,你就不能利用到ide和compiler的错误检测功能了,出错几率会大些,比如把intValue写成了inValue,编译器是发现不了的,而且通过反射效率比直接调用会差些
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值