黑马程序员技术交流社区

标题: Integer构造方法问题 [打印本页]

作者: 焦健    时间: 2012-12-19 17:45
标题: Integer构造方法问题
在论坛里看到一个问题,如下:Integer构造方法为什么能接收char类型数据。
这是api中Integer的构造方法:
                Integer(int value)
                构造一个新分配的 Integer 对象,它表示指定的 int 值。
                Integer(String s)
                构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
不包括char类型的构造函数。
但是下面的代码却能够正常的编译和执行,并打印出115.谁能帮我解答这是为什么,不要告诉我s对应的是ASCII码115。
public class Duo4 {
        public static void main(String[] args)
        {
                Integer i=new Integer('s');
                System.out.println(i);
        }
}
下面是我找的java.lang.Integer的构造方法的代码
public Integer(int value) {
        this.value = value;
    }
public Integer(String s) throws NumberFormatException {
        this.value = parseInt(s, 10);
    }


因为public Integer(String s)构造方法中用到了 parseInt(s, 10)方法,
所以我找到了 parseInt(s, 10)方法的代码如下。从代码里根本就看不出为什么能够接收char类型数据。
所以请大家帮忙看下。

public static int parseInt(String s, int radix)
        throws NumberFormatException
{
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */
       
        if (s == null) {
            throw new NumberFormatException("null");
        }
       
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }
       
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }
       
        int result = 0;
        boolean negative = false;
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
       
        if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);
       
                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
}

作者: 高境    时间: 2012-12-19 17:53
{:soso_e179:}讲的好
作者: 郭金龙    时间: 2012-12-19 18:03
好问题,看解答!
作者: 苏克    时间: 2013-1-22 18:31
通过一系列的语句测试,我是这么理解得。
byte的对象类型继承的是number,属于数据类型。但是byte b='a';也是可以接收的,并不会报错。那是因为在ascii中每个单字节都会对应一个相应的数值。但是这里千万要注意一点这里的映射是但方向的,也就是说每个字节都会对应一个数值,但不是每个数值(这个数值是单字节范围内的)都会对应一个字节。因为这种映射是单方向的,所以当我们用到byte的时候它都会是以数值的方式在运算。
示例:
byte b='a';
  System.out.println(a+8);//105
  System.out.println(a+"8");//978

char类型对象类型继承的是Object,它接收的类型是字符,在Unicode 码中每个字符都有对应的数值,每个char类型范围内的数值(0-65535)也都对应一个字符。这种映射是双向的,<——>。
这也就是它为什么不能继承number 的原因,因为它既可以当数值用,也可以当作字符用。具体是当作字符还是数值来使用看具体情况而定,如果无法判断则当作字符来使用。
示例:
char a='a';
char b=97;
  System.out.println(ch1);//a
  System.out.println(ch1+8);//105
  System.out.println(ch1+"8");//a8
  System.out.println(ch2);//a
  System.out.println(ch2+8);//105
  System.out.println(ch2+"8");//a8
System.out.println(ch2+'8');//153。这要注意一点,当两个字符相加的时候,是求和,而不是连接。


如果看到这还不明白,为什么参数是int的可以接受char和byte。那么我只有使出杀手锏了。
int i='我';
system.out.println(i);//25105。
也就就说,在java的机制里面,所有Unicode里面包含的字符,都可以向数值类型转换,这种转换是自动执行的。只是当接收类型是int,long的时候只能当作数值运算,但是当接收的char的时候,既可以当作字符本身使用,也可以当作数值运算。





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