JavaSE基础之包装类
一.概念:
Java语言的8种基本类型分别对应了8种“包装类”。每一种包装类都封装了一个对应的基本类型成员变量,同时还提供了针对该数据类型的实用方法。
1)包装类的目的:用于将基本类型数据当作引用类型看待。
2)包装类的名字:除了Integer(int),Character(char)外,其余包装类名字都是基本类型名首字母大写。
3)拆、装箱:Integer i=new Integer(1);创建一个以对象形式存在的整数1,这种从基本类型转为引用类型的过程称之为“装箱”,反之叫“拆箱”。
4)装箱:方式一:Double d=new Double(2.2);//装箱
方式二:Double d=Double.valueOf(2.2);//基本类型都有valueOf方法
5)拆箱:double num=d.doubleValue();//拆箱
6)包装类使用前提:JDK1.5+
public static void say(Object obj){ System.out.println(obj); }
int a=1;//基本类型,不是Object子类!
say(a);//在java 1.4版本的时候,这里还是语法错误的!因为int是基本类型,不是Object对象,要自己写8种基本类型对应的方法
7)包装类的使用:实例化一个对象,该对象代表整数1;Integer的作用是让基本类型int作为一个引用类型去看待。这样就可以参与到面向对象的编程方式了。由此我们可以将一个int当作一个Object去看待了,也成为了Object的子类。
Integer i=new Integer(a);//装箱,或者写Integer i=new Integer(1);
Integer ii=Integer.valueOf(a);//装箱另一种方式
int num=i.intValue();//拆箱 say(i);//Integer是Object的子类,可以调用!
8)JDK1.5包装类自动拆装箱(原理):
在编译源程序的时候,编译器会预处理,将未作拆箱和装箱工作的语句自动拆箱和装箱。可通过反编译器发现。
say(Integer.valueOf(a));自动装箱 num=i;//引用类型变量怎么能复制给基本类型呢?
//num=i.intValuse();//自动拆箱
9)包装类的一些常用功能:将字符串转换为其类型,方法是:parseXXX,XXX代表其类型。这里要特别注意!一定要保证待转换的字符串描述的确实是或者兼容要转换的数据类型!否则会抛出异常!
String numStr="123"; System.out.println(numStr+1);//1231
int num=Integer.parseInt(numStr); System.out.println(num+1)//124
long longNum=Long.parseLong(numStr); System.out.println(longNum);//123
double doubleNum=Double.parseDouble(numStr); System.out.println(doubleNum);//123.0
10)Integer提供了几个有趣的方法:
将一个整数转换为16进制的形式,并以字符串返回;将一个整数转换为2进制的形式,并以字符串返回。
String bStr=Integer.toBinaryString(num); String hStr=Integer.toHexString(num);
11)所有包装类都有几个共同的常:获取最大、最小值。
int max=Integer.MAX_VALUE;//int最大值 int min=Integer.MIN_VALUE;//int最小值
System.out.println(Integer.toBinaryString(max)); System.out.println(Integer.toBinaryString(min));
二.代码
/**
* 包装类
* 基本类型由8个,由于他们是以值的形式存在,没有继承
* 也不是引用类型,所以不继承自Object。
* 那么基本类型是不能参与面向对象开发的。
* 包装类的作用主要解决了基本类型不能参与面向对象开发
* 的问题。
*
* 其中6个表示数字的包装类全部继承自Number类
* Number类中定义了:
* int intValue()
* 将当前对象表示的数字已基本类型的int值返回
*
* double doubleValue()
* 将当前对象表示的数字已基本类型的double值返回
* ...6个数字类型的方法全有
*
*
*/
public class IntegerDemo {
public static void main(String[] args) {
//该对象表示小数1.2
Double doub = new Double(1.2);
double d = doub.doubleValue();
System.out.println(d);//1.2
//还可以转换为其他的基本类型数据,但可能丢失精度
int i = doub.intValue();
System.out.println(i);//1
}
}
/**
* 数字包装类有两个常量,分别表示其对应的基本类型
* 数据的取值范围:
* MIN_VALUE
* MAX_VALUE
*
*/
public class IntegerDemo2 {
public static void main(String[] args) {
int max = Integer.MAX_VALUE;
int min = Integer.MIN_VALUE;
System.out.println(max);
System.out.println(min);
}
}
/**
* 包装类最常用的一个方法
* 数字包装类有一个静态方法:parseXXX()
* 可以将字符串转换为对应的基本类型
* @author Administrator
*
*/
public class IntegerDemo3 {
public static void main(String[] args) {
String intStr = "123";
/*
* 若想将字符串转换为对应的数字,前提是该字符串
* 描述的所有字符必须表示当前类型的数字才可以!
*/
int i = Integer.parseInt(intStr);
System.out.println(i+1);
double d = Double.parseDouble(intStr);
System.out.println(d);
}
}
public class IntegerDemo4 {
public static void main(String[] args) {
dosome(1);
/*
* java自1.5之后推出了一个新的特性
* 自动拆装箱
* 有了这个特性后,我们在写程序的时候就不用特别
* 注意基本类型与对应的包装类互转的问题了。
* 但是这个不是JVM认可的。而是编译器认可的,原因
* 在于编译器将转换的代码帮我们补全后写入了字节码
* 文件中。
*/
/*
* 这里就用到了自动装箱特性
* 编译器在生成字节码文件时,将代码改为了:
* Integer inte = Integer.valueOf(1);
*/
Integer inte = 1;
/*
* 这里就用到了自动拆箱特性
* 编译器在生成字节码文件时,将代码改为了:
* int i = inte.intValue();
*/
int i = inte;
}
public static void dosome(Object o){
}
}
/**
* 基本类型转换为包装类时建议使用
* 静态方法 valueOf()
* @author Administrator
*
*/
public class IntegerDemo5 {
public static void main(String[] args) {
/*
* valueOf在有些包装类中会重用对象
* 比如Integer,会缓存1字节的整数。-128到127之间
*/
Integer i1 = Integer.valueOf(1);
Integer i2 = Integer.valueOf(1);
System.out.println(i1==i2);
System.out.println(i1.equals(i2));
}
}