装箱/装包: 把一个基本数据类型转变为包装类型
拆箱/拆包: 把一个包装类型转变为一个基本数据类型
int a = 1; Integer i = a; // 自动装箱 int b = i; // 自动拆箱 Integer ii = Integer.valueOf(a); // 手动装箱,推荐使用 Integer.valueOf() 而不是 new Integer() int bb = ii.intValue(); // 手动拆箱
{ int a = 1; //Integer ii = a; //自动装箱 Integer ii = Integer.valueOf(a); // Integer ii2 = new Integer(2); Integer ii2 = Integer.valueOf(2); int b = ii2; //自动拆箱 System.out.println(a); System.out.println(b); }
反汇编
new的时候调用了init构造方法
{ Integer ii = 100; Integer ii2 = 100; System.out.println(ii == ii2); }
运行结果为
{ Integer ii = 200; Integer ii2 = 200; System.out.println(ii == ii2); }
运行结果为
这是为什么呢
这既然是包装类型 , 那么可能调用了valueOf方法
可以看到最小值为-128
进入IntegerCache
最大值为128
如果在-128到127之间
那么返回的是下标为 i + 128的数组的值
因为存储的是-128到127
泛型在c++中叫做模版
引出泛型
实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?
使用Object类型
class Myarray { public Object[] array = new Object[10]; public void setValue(int pos, int val) { array[pos] = val; } public Object getValue(int pos) { return array[pos]; } }
代码定义了一个名为
Myarray
的类,其中有一个包含Object
类型的数组array
,并提供了设置和获取数组元素值的方法。然而,虽然数组的类型是
Object[]
,但?setValue
方法中将一个int
类型的值直接赋给数组元素。这是因为数组的元素类型是Object
,而int
是基本数据类型。在这种情况下,会发生自动装箱,将int
装箱为Integer
。即不能放任意类型的元素
将setValue改为
public void setValue(int pos, Object val) { array[pos] = val; }
可以使用该数组存放任意类型的数据了
但是
为什么不能给String类型呢?
因为Object是String的父类类型
改为
String str = (String) myarray.getValue(2);
不过这数组中存放的是String类型
怎么又强转起来了?
感觉多此一举了
现在看看自己的目的:存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值
现在把类型改为
class Myarray<T>public T[] array = new T[];但是不能new一个 T 类型的数组改成
public T[] array = (T[]) new Object[10];暂时骗过编译器
可以发现不报错了
这里我觉得, 个人理解, T像是一个占位符 可以放String 也可以放Integer类型 (包装类型, 除了int是Integer , char是Character之外 其他都是本身大写)
总结
泛型的意义:?
1. 在编译的时候 检查数据类型是否正确
2. 在编译的时候, 帮助进行类型转换
补充:
要是
Myarray<Person> myarray1 = new Myarray<>();改为
Myarray myarray1 = new Myarray();呢是不会报错的
这种类型叫做裸类型
上面泛型的代码也可以写为
class Myarray<T> { // public T[] array = (T[]) new Object[10]; public Object[] array = new Object[10]; public void setValue(int pos, T val) { array[pos] = val; } public T getValue(int pos) { return (T) array[pos]; } }
有帮助的话记得点个赞哦