楼上的老哥都说得挺详细了
想补充一个从面向对象和引用联系这个角度的解释,从而回答楼主的问题
今日发现:使用强制转换object类对象到int对象时,要用integer,而不是int
那么为什么呢?一般人们会直接说,这是规则,没有为什么,在Java中就是这么操作的
但凡事都有个原因,于是开始思考...
举个例子,拿integer为代表说说吧:
就是这么简单的例子,已经是常识了,写错改回去完事了,但今天恍然一想,为什么是用Integer,为什么要有Integer?从面向对象统一性的角度
int属于基本数据类型,是面向过程时留下来的特性,在面向过程中,你的强制类型转换都是用基本数据类型的,但在Java面向对象中,有了Object,万物皆对象,祖先类Object可以表示任意类型的数据
那么从类型的角度上看,int是面向过程类型的特性,Integer是面向对象类型的特性
所以,这可以解释为什么不是int val=(int) obj?
因为,Object对象类这种特性来自面向对象,因此在Java面向对象中类型强制转换时要使用对应的基本数据类型的"对象"类型Integer
至于例子中2可以给Object,Object又直接给int,是自动装箱,自动拆箱的操作,如果是在早期java,要分开来写的
这时,Integer val=(Integer) obj是要自己写的,只不过现在Java自动帮我们完成了从引用联系角度
在面向过程中,一般能让我们使用指针,进行一些内存管理,或者基本数据类型不具备的操作
但在java中呢?要知道Java弱化了指针的概念,但其实对象的引用还是可以让我们用来表示指针的来完成一些操作的
在面向过程中,有一些功能需要指针才能完成的,例如多个变量返回值,函数形参的双向传递,用基本数据类型是搞不来的
在面向过程,像C中,你可以int *val,上面的功能都可以搞定,如果有特定需求,你甚至可以用int **val, int ***val,这样的多级指针来完成想要的功能,那么面向对象中没有指针,要怎么搞?
就是使用对象的引用,可以说Integer就是类似int *一样的玩意,但比它丰富一点,同时不具备int *管理内存的功能这样而已,而且像int **这样的二级指针,在java中可以表示成引用Integer的Integer
所以,上面说的多个变量返回值,函数形参的双向传递,这些功能,在java中用Integer就可以了!因为它是属于引用类型的!
从中可以看出,Java面向对象中,引用更像是对指针的封装,具备指针的一些特性
而且,众所周知,类也是引用类型的,所以当你用类描述一个事物时,你就是用一个 "指针类型" 的性质去描述的!
所以,你在C语言中,用结构体描述一个事物,可以用指针类型和非指针类型表示,在Java中则没有,一律采用的都是对指针的封装来表示的!
综上,为了面向对象的统一性和对指针一些特性的需求,我们需要引用类型
所以,就算Java官方不写包装类,我们也必定要手动去实现这样的东西的!