包装类
下面是包装类的使用方法:
package oop.OopDemo.WrapClass;
/**
* 测试包装类的基本用法
*
* @author 发达的范
* @date 2020/10/24
*/
public class Test01 {
public static void main(String[] args) {
//报错:Cannot resolve constructor 'Integer()',必须传递一个整形数据被包装
//Integer integer = new Integer();
//包装类,把1000这个数包装成一个Integer类的对象,把这个值作为属性包装成一个对象
Integer i = new Integer(1000);
System.out.println(i.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(i.toHexString(i));
System.out.println(Integer.toHexString(i));
//把字符串转换成数字
Integer i2 = Integer.parseInt("123");
System.out.println(i2+1);
Integer i3 = new Integer("456");
System.out.println(i3.intValue());
System.out.println(i.intValue());
//加上一个字符串把数字变成字符串
String string = 123 + "";
}
}
运行结果:
这是Integer的父类,它的父类由继承了Numbers:
public final class Integer extends Number implements Comparable<Integer>
Numbers 是一个抽象类:
public abstract class Number implements java.io.Serializable
这是抽象类Numbers的继承树:
可见:八大基本数据类型都有对应的包装类,且这些包装类都是继承Numbers类,所以它们都有Numbers类的方法的普通属性。
目前来说,由于学习接触的内容比较少,我感觉把基本数据类型包装成对象来使用用处好像不是很大,下面是包装类的作用:
自动装箱&自动拆箱&缓存问题
接着上面的包装类,可以把基本数据类型包装成对象来调用包装类的方法,接着JDK 的开发人员为了提高开发人员开发效率,提出了自动装箱和自动拆箱的概念,下面以代码作为说明:
package oop.oopdemo.wrapclass;
/**
* 测试自动装箱、自动拆箱和缓存问题
*
* @author 发达的范
* @date 2020/10/24
*/
public class Test02 {
public static void main(String[] args) {
//包装类
Integer a = new Integer(1000);
/*
自动装箱,正常情况下,把基本数据类型赋值给对象是应该报错的,但是此处是包装类的自动装箱操作,也即是编译器把代码变成了
Integer b = new Integer(2000);,编译器自动把整形数据包装成一个对象
*/
Integer b = 2000;
System.out.println(b.intValue());
//正常情况下,把一个对象赋值给整形数据也应该报错,但是这里编译器自动惊醒拆箱操作,也就是int c = b.intValue();
int c = b;
System.out.println(c);
//为了验证编译器进行了自动拆箱操作,做下面的测试
Integer d = null;
//调用d.intValue()方法,但是d是null,所以无法调用Integer类的方法
int e = d;
//Exception in thread "main" java.lang.NullPointerException
System.out.println(e);
}
}
运行结果:
public class Test02 {
public static void main(String[] args) {
Integer f = 2333;
Integer g = 2333;
System.out.println(f == g);
System.out.println(f.equals(g));
System.out.println("==========");
Integer h = -123;
Integer i = -123;
System.out.println(h == i);
System.out.println(h.equals(i));
System.out.println("=============");
Integer integer1 = new Integer(-123);
Integer integer2 = new Integer(-123);
System.out.println(integer1==integer2);
System.out.println(integer1.equals(integer2));
}
}
运行结果:
从运行结果中发现一个问题:明明都是自动装箱,使用相同的方法输出,但是结果却不一样。
经测试:
- 如果使用自动装箱,且被装箱的int型数值处于[-128,127]之间,编译器仍会把自动装箱后的对象当做基本数据类型进行处理,目的是提高运行效率
- 如果不使用自动装箱,直接对int型数值进行包装,那么此时无论int型数值是多大都会被包装成一个对象,多以就出现了上述的结果。
自学java,请多多指教!