java中的8种基本数据类型:boolean byte char short int float double long
自动拆装箱的问题引入:
由于在一开始学习java的时候,”万物皆对象“这种面向对象的看问题方式,时刻围绕在脑海中。因为静态的变量和基本数据类型不属于对象,但是由8种基本数据类型的自动装拆箱解决了基本数据类型不是对象。
在jdk1.5中引入了自动拆装箱的新特性,在jdk1.5之前,我们想要使用integer类中的方法,我们先要把int变量变成integer类型,可以通过new Integer(intNumber) 或者调用Integer.valueOf(intNumber)方法
自动装拆箱何时发生?
1、在调用方法时把基本数据类型作为参数,但是参数的类型是基本数据类型的包装类时。
在学习过javaSe基础之后,我们知道通过使用集合框架ArrayList或者Map来添加元素的时候,添加的是Object对象,在这里引入ArrayList.add()的源码:
/**
* Appends the specified element to the end of this list.
*
* @param e element to be appended to this list
* @return <tt>true</tt> (as specified by {@link Collection#add})
*/
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
对于源码的解读:首先我们来看看参数中的(E e)
,为什么是E ?而不是Object?因为E代表的是元素(集合中存储的是元素),我们平时在泛型中可以看到 <T extends List<T>>
,T 代表的是Type 类,再比如键值对中的Map<K,V>
,K
表示的是Key,V
表示的是Value。E
K
V
等泛型在使用该参数之前就已经限定好了类型,如果赋值给Object的话,就不用再进行强制类型转换了。
首先把数组的长度+1,这个操作会导致modCount加一,这个变量的作用就是记录当前数组被操作的次数,然后直接把参数传进来的对象赋值给上一次长度位置的元素。返回true表示添加成功
当我们调用ArrayList.add()方法的时候,可以直接调用
ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(10);
我们反编译这段代码:
public class AutoboxingTest
{
public AutoboxingTest()
{
}
public static void main(String args[])
{
ArrayList arrayList = new ArrayList();
arrayList.add(Integer.valueOf(100));
}
}
可以看到,编译器在编译的时候,检测到arrayList.add()需要的是Integer对象,所以把int类型自动装箱成Integer类型。
2、 给基本数据类型的包装类赋值为基本数据类型的时候。
我们还是以Integer和int类型的变量作为例子