黑马程序员技术交流社区

标题: 类型转换问题 [打印本页]

作者: 钟伟杰    时间: 2013-1-11 09:36
标题: 类型转换问题
本帖最后由 钟伟杰 于 2013-1-11 10:34 编辑
  1. import java.util.*;
  2. class  TestCollection
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 int read = 0;
  7.                 ArrayList al = new ArrayList();
  8.                 System.out.println("please enter Number:");
  9.                
  10.                 while(true)
  11.                 {
  12.                         try
  13.                         {
  14.                                 read = System.in.read();//...........1
  15.                         }
  16.                         catch (Exception e)
  17.                         {
  18.                         }

  19.                         if(read=='\r'||read=='\n')
  20.                                 break;
  21.                         else
  22.                         {
  23.                                 int num = read-'0';//.....................2
  24.                                 al.add(new Integer(num));//...............3
  25.                         }        
  26.                 }

  27.                 int sum = 0;
  28.                 Iterator it = al.iterator();//.................4
  29.                 while(it.hasNext())
  30.                 {
  31.                         Integer in = (Integer)it.next();//.........................5
  32.                         sum += in.intValue();
  33.                 }
  34.                 System.out.println(sum);
  35.         }
  36. }



  37. 上面是一个通过键盘输入一个数字序列在屏幕上打印出着数列的和的小程序。思路还是很清晰的,但是它们类型的转换上不明白,求解答。
  38. 一、1那里read()后返回的类型是int类型,但是为什么有2那么的一步,把read减上字符‘0’用int类型接收呢?read()后的类型不是int吗,这做法
  39.       岂不是多此一举?
  40. 二、4那里是在ArrayList上启动迭代器再封装成Iterator类型;3那里不是已经把存进ArrayList里面的数据封装成Integer类型吗?为什么在5那里
  41.       调用next()方法取出时还要再次强转为Integer类型呢?

  42. 本人菜鸟一个,经验不足,如有错误,请多多包涵。
复制代码

作者: 肖志锋    时间: 2013-1-11 22:06
本帖最后由 肖志锋 于 2013-1-11 22:14 编辑

1:我先回答你第一个问题,这个是因为system.in.read()接受的确实int值,但是这个int是是输入字符的ASCII码,也就是说如果你输入的是0的话,那边实际接受的是48,也就是他的字符的编码,这懂了没,如果是1-9,那么需要转成int怎么做呢?最简单的当然就是-48咯,因为‘0’对应的就是48.
2:第2个问题就涉及到泛型了,在集合中不能装i基本本数据类型,只能装Object类以及子类,所以我们只能使用基本数据类型的包装类把他们装进去,这是3的必要性。。至于4,5,则是因为你在4迭代器里面没有指定泛型,这样的话,集合会默认你装的是Object,那么Object当然是不能直接做加减,所以需要去把他向下转型成原来的类型,然后包装类自动拆箱得到你要的结果。当然你这里是用方法取得包装类的值的,其实最简单的让他自动拆箱就可以了。

作者: 胡勇敏    时间: 2013-1-11 22:15
肖志锋 发表于 2013-1-11 22:06
1:我先回答你第一个问题,这个是因为system.in.read()接受的确实int值,但是这个int是是输入字符的ASCII码 ...

解释的很到位。
作者: 张云杰    时间: 2013-1-11 22:47
'0' 是一个字符, 遇到Int 类型的时候 会计算成ASCII码,  比如说 你输入的是1  然后 减去'0' ,  这个值就是 1- 48 = -47 ,  至于第2个, 是因为 it.next() 里有个泛型, 默认都是Object的, 如果要获取到与你所对应的类型计算, 就必须要强转成你所写的那个类型后才能计算
作者: 钟伟杰    时间: 2013-1-14 07:33
肖志锋 发表于 2013-1-11 22:06
1:我先回答你第一个问题,这个是因为system.in.read()接受的确实int值,但是这个int是是输入字符的ASCII码 ...

:handshake
作者: 钟伟杰    时间: 2013-1-14 07:33
张云杰 发表于 2013-1-11 22:47
'0' 是一个字符, 遇到Int 类型的时候 会计算成ASCII码,  比如说 你输入的是1  然后 减去'0' ,  这个值就是  ...

:handshake




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