什么叫包装类呢,我们来看下对应的下面声明,看看大家能不能看明白:
Animal animal = new Animal();
这行代码表示的是,声明Animal类型的引用指向Animal的对象,animal就是它的实例化名称,代表的就是一个animal对象
int number = 16;
这行代码表示的是,声明一个int类型的对象,名称为number,并且初始值为16
number不是一个对象,但是animal表示的是一个对象。前面我们讲面向对象的时候给大家讲解了,对应的Java是一个面向对象的语言。并且我们一直说在Java里面,万物皆对象。
所以number从Java的面向对象理念来说,看作是一个对象,但是从语法层面来说,不是一个对象。这就违背了Java里面万物皆对象这个概念。
所以,Java里面number变成对象,那首先有一个类,才能变成对象。那首先就需要有一个类跟int关联起来
public class MyInt{
private int num = 16;
}
把这个int声明的变成一个私有的成员变量,然后声明这个类,就是new 这个对象,这样我们的number就变成了对象里面包含的。
通常情况下,基本数据类型的变量不是对象,为了满足万物皆对象的理念:需要对基本数据类型的变量进行打包封装处理变成对象,而负责将这些变量声明为成员变量进行对象化处理的相关类,叫做包装类。
主要作用就是把基本数据类型变量变成对象。
分类
以上是我们自己如果写成类的情况下需要这样写,但是真正在Java里面,是不需要我们做这些操作的,因为Java官方已经帮我们写好了这8个基本数据类型的包装类。
基本类型 | 包装类 |
---|---|
byte |
java.lang.Byte |
short |
java.lang.Short |
int |
java.lang.Integer |
long |
java.lang.Long |
float |
java.lang.Float |
double |
java.lang.Double |
char |
java.lang.Character |
boolean |
java.lang.Boolean |
- 可以看到 除了int、char之外其它的都是首字母大写
- 包装类都是在java.lang包下
- 包装类:就是8大基本数据类型的变量打包成对象,满足了Java的万物皆对象。
Integer
通过Integer来给大家看下对应的整数包装类怎么使用
首先,给大家看一下对应的Integer的概念。
概念
java.lang.Integer
类内部包装了一个int
类型的变量作为成员变量。
主要用于实现对==int
类型的包装并提供int
类型到String
类之间的转换==等方法。
常量
常量 | 功能介绍 |
---|---|
MAX_VALUE |
int类型最大值,2^31-1 0x80000000 |
MIN_VALUE |
int类型最小值,即-2^31 0x7fffffff |
SIZE |
int类型采用二进制补码形式的位数,32 |
BYTES |
int类型所占的字节个数 |
TYPE |
int类型的Class实例 |
//1、打印Integer类中常量值
System.out.println("Integer的最大值:" + Integer.MAX_VALUE);
System.out.println("Integer的最小值:" + Integer.MIN_VALUE);
System.out.println("表示二进制的位数:" + Integer.SIZE);
System.out.println("所占字节的个数是:" + Integer.BYTES);
System.out.println("对应int 的 Class 实例:"+ Integer.TYPE);
Integer的最大值:2147483647
Integer的最小值:-2147483648
表示二进制的位数:32
所占字节的个数是:4
对应int 的 Class 实例:int
方法
方法 | 功能介绍 |
---|---|
Integer(int value) |
参数构造方法,过时 |
static String toString(int i) |
重写 |
static Integer valueOf(int i) |
int—>Integer |
static Integer valueOf(String s) |
String—>Integer |
int intValue() |
Integer—>int |
static int parseInt(String s) |
String—>int |
Integer integer = new Integer(99);//被弃用
System.out.println("integer = "+ integer);//自动调用toString 99
可以看到对应的构造方法已经被弃用了,源码里面说明了从java9之后就不这样声明使用了
对应的toString方法重写了,所以可以打印出来内容值。
如果不用这个声明,那应该用什么,使用valueOf来进行声明
int—>Integer
//上述方法过时,建议用valueOf取代,相当于从int类型转到Integer
Integer in1 = Integer.valueOf(66);
System.out.println(in1);
String—>Integer
//相当于从String类型转到Integer
Integer integer1 = Integer.valueOf("34");
System.out.println(integer1);
Integer—>int
//Integer类型转为int类型
int i = integer.intValue();
System.out.println("获取到的整数是:"+ i);
Integer—>String
Integer integer2 = 88;
String s = integer2.toString();
String—>int
int i2 = Integer.parseInt("200");
System.out.println("字符串转换为整数的结果是:"+i2);
//java.lang.NumberFormatException: For input string:
//编译ok,运行报错 数字格式化异常,因为里面有字母
int i3 = Integer.parseInt("200d");
System.out.println(i3);
拆装箱
装箱
int类型转换为Integer,这样的操作叫装箱
就是把箱子打开,然后把对应内容放进去。其实就是一个打包的过程
拆箱
从Integer转换到int类型,这个过程叫拆箱
这个过程像收快递,把里面的东西取出来
自动拆装箱
在java5之前进行装箱需要用到valueOf,拆箱用intValue;但是java5以后就可以自动拆装箱
Integer integer2 = 88; //直接通过赋值运算符实现自动装箱
int i1 = integer2;//直接通过赋值运算符实现自动拆箱
自动拆装箱的底层也是调用那两个方法,只是在书写代码的时候,我们不需要去关注
自动装箱池
在Integer类的内部提供了自动装箱池技术,将-128到127之间的整数已经装箱完毕,当程序中使用
该范围之间的整数时,无需装箱直接取用自动装箱池中的对象即可,从而提高效率。
Integer integer3 = 127;//128;
Integer integer4 = 127;//128;
Integer integer5 = new Integer(127);//new Integer(128);
Integer integer6 = new Integer(127);//new Integer(128);
System.out.println(integer3 == integer4); //true //false //自动装箱池
System.out.println(integer3.equals(integer4)); //true //true
System.out.println(integer5 == integer6); //false //false
System.out.println(integer5.equals(integer6)); //true //true
Java默认装箱范围是-128~127,如果想要调整这个装箱范围「涉及到JVM调优」
可以使用-XX:AutoBoxCacheMax=<size>
进行大小设置
Double
小数类型的包装类,这里我们用浮点类型包装类来演示: Double
概念
java.lang.Double类型内部包装了一个double类型的变量作为成员变量,主要用于实现对double
类型的包装并提供double类型到String类之间的转换等方法。
常量
常量 | 功能介绍 |
---|---|
SIZE |
double类型采用二进制补码形式的位数,64 |
BYTES |
double类型所占的字节个数 |
TYPE |
double类型的Class实例 |
方法
方法 | 功能介绍 |
---|---|
Double(double value) |
参数构造方法,过时 |
static String toString(double d) |
重写 |
static Double valueOf(double d) |
double—>Double |
static Double valueOf(String s) |
String—>Double |
double doubleValue() |
Double—>double |
static double parseDouble(String s) |
String—>double |
static boolean isNaN(double v) |
判断值是否为非数字 |
double—>Double
Double d1 = Double.valueOf(3.14159266);
System.out.println("d1 = :" + d1);
String—>Double
Double d1 = Double.valueOf("3.14159266");
System.out.println("d1 = :" + d1);
Double—>double
double d = d1.doubleValue();
System.out.println("d = :" + d);
Double—>String
String s = d1.toString();
String—>double
double v = Double.parseDouble("2.1545");
是否为非数字
System.out.println("d2对象判断的结果:"+d2.isNaN());
Double d4 = Double.valueOf(0.0d / 0.0);
System.out.println("d4对象判断的结果:"+d4.isNaN());
拆装箱
//java5以后开始自动拆装箱
Double d2 = 3.1415926;
double d3 = d2;
- double没有自动装箱池概念
Number
java.lang.Number
类是个抽象类,是上述类的父类来描述所有类共有的成员
Boolean
概念
java.lang.Boolean类型内部包装了一个boolean类型的变量作为成员变量,主要用于实现对
boolean类型的包装并提供boolean类型到String类之间的转换等方法。
常量
常量 | 功能介绍 |
---|---|
TRUE |
为true的对象 |
FALSE |
为false的对象 |
TYPE |
boolean类型的Class实例 |
方法
方法 | 功能介绍 |
---|---|
Boolean(boolean value) |
参数构造方法,过时 |
static String toString(boolean b) |
重写 |
static Boolean valueOf(boolean b) |
boolean—>Boolean |
static Boolean valueOf(String s) |
String—>Boolean |
boolean booleanValue() |
Boolean—>boolean |
static boolean parseBoolean(String s) |
String—>boolean |
boolean—>Boolean
Boolean aBoolean = Boolean.valueOf(false);
Boolean b2 = true;
String—>Boolean
Boolean b = new Boolean("true");
Boolean b1 = Boolean.valueOf("true");
Boolean—>boolean
Boolean b2 = true;
boolean b4 = b1.booleanValue();
System.out.println(b4);
boolean b3 = b2;
String—>boolean
//方法执行原理:只要参数值不是true,TRUE,则结果就是false
boolean aFalse = Boolean.parseBoolean("dsfa");
System.out.println(aFalse);
包装类(Wrapper)的使用总结
- 基本数据类型转换为对应包装类的方式
调用包装类的构造方法或静态方法valueOf()
- 获取包装类对象中基本数据类型变量数值
调用包装类中的xxxValue方法
- 字符串转换为基本数据类型的方式
调用基本数据类型对应的包装类中的parseXxx方法