一、基本数据类型的局限

在java中一切皆对象,但是8种基本数据类型除外,这就导致了一些问题。

  • 基本数据类型与引用数据类型不可相互赋值,不可相互比较
  • 有些java类只能处理引用数据类型

二、什么是包装类

Java在java.lang包中提供了8个类代表8种基本数据类型

java 中的包装类Wrapper_基本数据类型

注1:java.lang是Java的核心包,使用其中的类可以不需要显示引用,eg:String

注2:包装类同String类一样,具有不可变性


三、包装类的实例化

实例化的方法

1.使用包装类的构造方法

除了Character类,其他包装类都提供了两种构造方法

public class Demo
{
    public static void main(String[] args)
    {
        Integer i1 = new Integer(200);	
        //第一种使用与包装类对应的基本数据类型,比如说Integer对应int,所以使用200
        Integer i2 = new Integer("200"); 
        //第二种使用字符串,但字符串里的内容必须是数字,否则报错
        
        Boolean b1 = new Boolean(true);	
        Boolean b2 = new Boolean("TUre");	
        //对于Boolean包装类字符串形式的true或false不区分大小写
        Boolean b3 = new Boolean("FalTU"); //结果为false
        //如果输入了其他字符串结果就为false
  		
        //字符的包装类的构造方法只有这一种写法
        Character ch = new Character('a');
    }
}

2.调用包装类的valueOf()方法
public class Demo
{
    public static void main(String[] args)
    {
        Integer i1 = Integer.valueOf(200)
        Integer i2 = Integer.valueOf("200"); 
    }
}

3.构造方法与valueOf()的区别
  • new关键字总是会创建一个新的对象
  • valueOf()方法会缓存范围在-128到127之间的整型数值(int、long、byte、short)
Integer n1 = new Integer(300);
Integer n2 = new Integer(300);

System.out.println(n1 == n2); //false 表示n1和n2所保存的堆内存地址不同

Integer n3 = Integer.valueOf(100);//没超过127
Integer n4 = Integer.valueOf(100);//没超过127

System.out.println(n3 == n4); //true
/*
*java中为了提高效率,在使用Integer时,如果新建的Integer对象是小于128的,
*会直接从缓存中取对应的地址值复制给这个变量,所以n3和n4内存地址是一样的
*/

Integer n5 = Integer.valueOf(200);//超过127
Integer n6 = Integer.valueOf(200);//超过127

System.out.println(n5 == n6); //false 超过127,ValueOf不会进行缓存

四、包装类的基本使用

这里会介绍一些包装类常用的属性和方法,其他的方法可以在需要使用的时候去查文档

1.数字包装类

数字包装类有:Byte、Short、Integer、Long、Float、Double

每个数字包装类都提供了两种方法:

  • xxxValue()
  • parseXxx()
///xxxValue(),将包装类转换成相应的基本数据类型
Integer n1 = new Integer(100);
int num1 = n1.intValue();

Double d2 = new Double("12.34");
double num2 = d2.doubleValue();

//parseXxx(),将字符串转换成相应的包装类,这个方法的参数是字符串
int num3 = Integer.parseInt("123");
double num4 = Double.parseDouble("12.34");

每个数字包装类还提供了一些常量,表示这些数字的范围

Integer.MAX_VALUE //127
Integer.MIN_VALUE //-128
Double.MAX_VALUE //2147483647

2.字符包装类(Character)

常用方法:

//isDigit()	是否为数字
    
System.out.println(Character.isDigit("1"));	//true
System.out.println(Character.isDigit("a"));	//false

//isLowerCase()	是否是小写
//isUpperCase()	是否是大写    
    
//toUpperCase()	变成大写
//toLowerCase()	变成小写
    
System.out.println(Character.toUpperCase("a")); //A

3.布尔包装类(Boolean)

Boolean包装类有两个常量

//Boolean.TURE
//Boolean.FALSE
    
Boolean b1 = Boolean.TURE;
Boolean b2 = Boolean.FALSE;
//这里涉及自动装箱的原理,后面会讲

System.out.println(b1.booleanValue());//true
System.out.println(b2.booleanValue());//false

五、自动装箱与自动拆箱
1.基本概念

基本数据类型与对应的包装之间自动互相转换,该转换是在编译时执行的

  • 装箱:基本数据类型转换成对应的包装类
  • 拆箱:包装类能转换成对应的基本数据类型

2.没有自动装箱/拆箱会怎样

包装类变量保存的是地址,不能直接进行算术运算,需要借助一些方法

Integer add(Integer num1,Integer num2)
{
	int n1 = num1.intValue();
    int n2 = num2.intValue();

    return new Integer(n1 + n2);
}
/*
*这里进行包装类的加法操作写起来十分繁琐
*如果再按前面说的使用构造方法或者valueOf()去定义两个实参包装类那么就显得更繁琐了
*为此引入了自动装箱与自动拆箱的概念
*/

3.自动装箱/拆箱的实例
public class Demo
{
    static int add(int num1,int num2) //设为静态方法,可以不用new一个Demo对象直接调用
    {
        return num1 + num2;
    }
    
    public static void main(String[] args)
    {
        Integer n1 = 100; //自动装箱	这里基本数据类型自动包装成了它所对应的包装类
        int n2 = n1;	//自动拆箱 	这里包装类自动拆箱,直接把堆内存中的值赋值给对应的基本数据类型
        
        Integer sum = add(100,200);	//300
    }
}

错误例子:

Integer n = null;
int a = n; //运行时抛出异常

//包装类变量为null,拆箱会报错

4.再谈比较运算符
  • 只有==,!=能用于基本数据类型和引用数据类型,其他的只能用于基本数据类型。但==,!=用于引用数据类型,比较的是地址。
  • 包装类之间比较大小时,会自动拆箱
  • 包装类的值是自动装箱获得时,比较时需要考虑缓存
Integer n1 = 100;
Integer n2 = 120;
System.out.println(n1 < n2); //自动拆箱,true

Integer n3 = 200;
Integer n4 = 200;
System.out.println(n3 == n4);
//false ==比较引用数据类型比较的是内存地址

Integer n5 = 100;
Integer n6 = 100;
System.out.println(n3 == n4);
//true 包装类的值是自动装箱获得时,需要考虑缓存,同valueOf()