包装类和基本类型的转换_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 包装类和基本类型的转换

包装类和基本类型的转换

 2017/6/20 5:44:56  神绮_H_亚里亚  程序员俱乐部  我要评论(0)
  • 摘要:基本的4类八种值类型数据各自对应着一个包装类,不知道大家认为两者有什么区别?两者没有什么区别,只是java为了方便转换而定义的包装类。很多人会这么认为吧真的是这样吗?System.out.println(Integer.class==int.class);不知道大家对于这段代码怎么理解的,结果是什么?曾经我问过一个经理int和Integer有什么区别,他告诉我没什么区别,两者的字节码文件都是一样的,后来我试了一下,却发现结果是falseSystem.out.println(Integer
  • 标签:

基本的4类八种值类型数据各自对应着一个包装类,不知道大家认为两者有什么区别?

两者没有什么区别,只是java为了方便转换而定义的包装类。

很多人会这么认为吧

真的是这样吗?

?

class="java"> System.out.println(Integer.class==int.class);

?不知道大家对于这段代码怎么理解的,结果是什么?

?

曾经我问过一个经理int和Integer有什么区别,他告诉我没什么区别,两者的字节码文件都是一样的,后来我试了一下,却发现结果是false

?

 System.out.println(Integer.class);//输出结果class java.lang.Integer

?

 System.out.println(int.class);//输出结果为int

?你没看错,int.class结果就是int

?

我们知道,在java之中monospace;"> System.out.println方法输出的是对象的tostring方法类名.class返回的其实就是对象名.getClass()不相信的话大家可以自己试试

?

 String s ="";
System.out.println(String.class==s.getClass());//结果为true

?我们看看Class的源码

?

?

  public String toString() {
        return (isInterface() ? "interface " : (isPrimitive() ? "" : "class "))
            + getName();
    }

?

?

?

从源码我们可以看出,如果是类,那么返回class+完整路径名字,如果是接口返回interface +完整路径名

但是int却只有一个int,既没有class,也没有interface,其他的基本类型也是这样,似乎不符合java语法。

事实上也的确是这样,基本数据类型都来自于c语言的函数库,有兴趣的可以自己去看看

到这里肯定有人会疑惑

既然字节码文件不一样,那么说明两者是不同的数据类型,结构也不相同,那么两者到底是怎么转化的呢?

当然,如果还有说两者是无条件转化的,那么你们可以试试如下代码

?

public class A {
	static Integer a;
	public static void main(String[] args) {
		int b = a;
		System.out.println(b);
	}
}

?大家猜猜结果是什么?

?

结果抛出了java.lang.NullPointerException

为什么呢?

因为转化过程其实是这样的

?

public class A {
	static Integer a;
	public static void main(String[] args) {
		int b = a.intValue();
		System.out.println(b);
	}
}

?jvm看到基本数据类型和包装类型的转化自动调用了对应的方法,

?

基本数据类型转为包装数据类型(以int为例)是new?Integer(int)

而包装类转基本类型则是对象.intValue

?

不过有一点我搞不明白,知道的请说下

?

?

 private final int value;

?这个到底是怎么定义出来的

?

 this.value = value;

?这个又是怎么赋值的

从上面截图的源码我们可以看到,value是被final修饰的,在java之中,被final修饰的变量是不能更改其引用的,而且有final修饰必须对其初始化



??

?我们这样定义,他就会提示终态字段未初始化,但是他是怎么定义的,这点我搞不明白

?

  • 相关文章
发表评论
用户名: 匿名