Java中特殊的类——包装类
包装类就是将基本数据类型封装在类中。
1、包装类
(1)自定义包装类
将基本数据类型包装成一个类对象的本质就是使用Object进行接收处理。
此时IntDemo类就是int的包装类,利用intValue 可实现基本数据类型转化为对象的需求。
//自定义int包装类 class IntDemo{ private int number; public IntDemo(int number){ this.number = number; } public int intValue(){ return this.number; } } public class Demo { public static void main(String[] args) { //向上转型 Object object = new IntDemo(20); //向下转型 IntDemo intDemo = (IntDemo)object; System.out.println(intDemo.intValue()); } } |
运行结果: |
(2)Java提供包装类
对象型(Object的直接子类):Boolean(boolean)、Character(char)
数值型(Number的直接子类):Byte、Double、Short、Long、Integer(int)、Float.
2、装箱与拆箱
(1)包装类和基本数据类型之间存在的关系:装箱与拆箱
装箱:将基本数据类型转变为包装类对象,利用包装类提供的构造方法实现装箱处理。
拆箱:利用Number提供的六种方法将包装类中的包装的基本数据类型取出。
在jdk5之前采取的是手工拆装箱的机制
//手动装箱 Integer num = new Integer(20); //拆箱 int data = num.intValue(); |
在jdk5之后提供了自动拆装箱的机制,更为重要的是,由于此机制的存在可以直接利用包装类的对象进行各种数学运算。
//自动装箱 Integer num1 = 10; //直接利用包装类对象操作 System.out.println(num1++ *5); System.out.println(num1); |
(2)包装类中“==”和equals问题(推荐使用equals进行比较)
public class Demo { public static void main(String[] args) { Integer num10 = -129; Integer num11 = -129; System.out.println(num10 == num11); System.out.println(num10.equals(num11)); System.out.println(); Integer num12 = -128; Integer num13 = -128; System.out.println(num12 == num13); System.out.println(num12.equals(num13)); System.out.println(); Integer num2 = 18; Integer num3 = 18; System.out.println(num2 == num3); System.out.println(num2.equals(num3)); System.out.println(); Integer num6 = 127; Integer num7 = 127; System.out.println(num6 == num7); System.out.println(num6.equals(num7)); System.out.println(); Integer num4 = 128; Integer num5 = 128; System.out.println(num4 == num5); System.out.println(num4.equals(num5)); } } |
综合上面的代码不难看出:自动装箱 Interger 变量名 = ?在-128——127取值时,“==”和equals的判断结果相同,而超过此范围则用“==”进行判断会出错。
这是因为在“-128——127”范围内Interger对象IntergerCache.cache池上产生,会复用已有对象,而超过此范围,则在堆上产生而并不会复用已有对象。
3、字符串与基本类型的转换
(1)字符串转换成基本数据类型
以后要进行各种数据输入时一定都需要字符串类型来接收,那么如何将字符串转化成基本数据类型就需要包装类的支持。
String ->int(Interger类):public static int parseInt(String s) throws NumberFormatException
String ->doule(Double类):public static double parseDouble(String s) throws NumberFormatException
String ->boolean(Boolean类): public static boolean parseBoolean(String s)等.
public class Demo { public static void main(String[] args) { String str2 = "true"; boolean bol = Boolean.parseBoolean(str2); System.out.println(bol); String str3 = "true1"; boolean bol1 = Boolean.parseBoolean(str3); System.out.println(bol1); String str = "4737284992"; double dou = Double.parseDouble(str); System.out.println(dou); String str1 = "47372@84992"; double dou1 = Double.parseDouble(str1); System.out.println(dou1); } } |
注意:将字符串转化成数字时,若字符串中存在非数字字符,则会出现NumberFormatException异常。而字符串与Boolean转换不受此影响。
(2)基本数据类型转换成String
任何数据类型使用了“+”连接空白字符就会变成字符串类型。
使用String类中提供的valueOf()方法,也可将其转换成字符串(该方法不产生垃圾)
public class Demo { public static void main(String[] args) { //基本数据类型->String String str1 = String.valueOf(100); String str2 = String.valueOf(false); System.out.println(str1); System.out.println(str2); String str3 = 100521+""; System.out.println(str3); } } |