论坛首页 Java企业应用论坛

java 字符串 进制之间的转换

浏览 10885 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (3) :: 隐藏帖 (2)
作者 正文
   发表时间:2010-06-22  
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?



如果知道原因的话不如说一下把
0 请登录后投票
   发表时间:2010-06-22  
beneo 写道
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?



如果知道原因的话不如说一下把


第一个错误,是因为在装箱时,必须是本类型的吧?

第二个正确是不是因为封装以后的类型是可以当作基本类型进行转型吧?
0 请登录后投票
   发表时间:2010-06-22  
fyf_008 写道
racnow 写道
没想到javaeye已经沦落至此了


考你个问题。别说别个。


class A{
public static void m(Double d){
}

}
class B{
public static void m(double d){

}
}


能不能调用
A.m(12);

B.m(new Integer(12));

关键是why?




可以调用的,duble和Double是自动拆箱和解箱的,编译时会做处理的。
Integer和Double是向上兼容的,所以B.m(new Integer(12));也是可以的,编译器会处理掉。

不知道理解是否有误
0 请登录后投票
   发表时间:2010-06-22   最后修改:2010-06-22
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以
0 请登录后投票
   发表时间:2010-06-22  
   :不好解释的啊
0 请登录后投票
   发表时间:2010-06-22  
请写清楚JVM版本。
0 请登录后投票
   发表时间:2010-06-22  
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。


0 请登录后投票
   发表时间:2010-06-22  
mercyblitz 写道
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。




new Integer() 出来的还是对象,只不过这个對象的值被预先缓存起来了而已。

反过来说,所有的基本形都有缓存,new一下有的返回缓存,有的返回对象,岂不是乱套了?

那我再举例子

    static class A {
        public static void check(Integer d) {
            System.out.println("Integer");
        }

        public static void check(int d) {
            System.out.println("int");
        }
    }


A.check(12); A.check(new Integer(12));

我想前者返回的是 int, 后面的是Integer
0 请登录后投票
   发表时间:2010-06-22  
beneo 写道
mercyblitz 写道
fyf_008 写道
现在解答。。楼上完全不对。。。。

这个要去分析 虚拟机行为,就是Java的作者怎么去设计这个问题。

Java有自动 装箱和拆箱的行为,这个确实。

但是问题是怎么装,怎么拆?

当 m(Double d);

调用 m(12);的时候,

java 发现,12为基本类型, 而Double 为类,

这时候 主动 装箱, 12 的封装类对象是new Integer(12);

但是 ,Integer 的实例是不可以给Double 的引用的。

如,Double d=new Integer(12); 错,所以不行。

反过来 当 m(double d)
调用 m(new Integer(12));

java 自动拆箱, Integer 拆箱后为基本的 int类型。

但是int 是何以赋值给double的。

如 double d= 12; 对

看下面的例子:

Double d= 12;错误
double d=new Integer(12); 正确



所以
B.m(new Integer(12)); 可以
A.m(12); 不可以


你的说法也不完全对。

首先,
引用
12 的封装类对象是new Integer(12);


int装箱到Integer,使用的是valueOf(int)方法,而不是new,并且在-127-128的范围中,使用的是缓存。

引用
A.m(12); 不可以


是因为int的12不能向上转型成double,而并非去装箱到Integer。

int a=12,double d=a;再调用A.m方法,就可以了。

int -> double 不行,double -> int 可以。




new Integer() 出来的还是对象,只不过这个對象的值被预先缓存起来了而已。

反过来说,所有的基本形都有缓存,new一下有的返回缓存,有的返回对象,岂不是乱套了?

那我再举例子

    static class A {
        public static void check(Integer d) {
            System.out.println("Integer");
        }

        public static void check(int d) {
            System.out.println("int");
        }
    }


A.check(12); A.check(new Integer(12));

我想前者返回的是 int, 后面的是Integer


可能有点误会,装箱是调用valueOf方法,这是JLS规定的。
0 请登录后投票
   发表时间:2010-06-22  
我查阅了JLS,里面没有规定用什么方法boxing或者unboxing。

http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#190697

不过,我看了一下bytecode,的确有
#8; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

此外
Integer a = 12;
Integer b = 12;

a == b is true;
a = 128, b = 128
a == b is false;
也能很好的说明这一点

不过,感觉我们2个谈论的问题貌似不在一个点上。。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics