Java中基元类型的封装类

时间:2019-04-29 03:17:57  来源:igfitidea点击:

在Java中,有两种重要的数据类型:引用(references)基元数据类型(primitives)。大多数情况下,数值、字符和布尔值都是基元数据类型,因为它在处理速度和内存需求方面更有效。尽管如此,当需要在对象中存储基元类型值时,仍有一些场景(如使用集合Collections)。为此,Java提供了一组类,用于在对象中包装基元类型值

每个基元类型都有一个包装类:

基元类型(Primitive type)包装类(Wrapper class)
booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

除了主要角色(管理基元值)之外,包装类还包含一组实用程序方法,用于将值转换为不同类型或将字符串值解析为数字值。

如何定义和创建包装器对象

包装器对象是使用以下方法创建的:

  • 类构造函数和[new]运算符;
  • 静态方法: valueOf()

除了[Character],其余的包装类都提供了构造函数,可以基于数值或字符串创建对象,如下所示:

Integer intObject1 = new Integer(34);
Integer intObject2 = new Integer("35");

Boolean boolValue1 = new Boolean("true");
Boolean boolValue2 = new Boolean(true);

Character charObject = new Character('a');  //the only way

布尔类Boolean构造函数定义了一个构造函数,该构造函数接受一个字符串值,该字符串值仅解释为[不区分大小写]值“true”(如““TRUE””、“True”、“tTuE”…)。任何其他值都转换为false:

Boolean boolValue1 = new Boolean("true");	//true
Boolean boolValue2 = new Boolean(true);		//true
Boolean boolValue3 = new Boolean("True");	//true

Boolean boolValue4 = new Boolean("ZZZ");	//false

valueOf()方法有两种形式,分别接收字符串和表示所需数值基数的字符串:

Integer intObject3 = Integer.valueOf("36");
Integer intObject4 = Integer.valueOf("1001", 2);    // 相当于10进制9

包装类的实用方法

作为类,包装器还定义了一组用于处理数值的实用程序方法:

[byte|short|int|long|float|double]Value()每个包装类都有6个这种类型的方法,用于将当前对象值转换为任何原始数值类型:

Float floatObject = new Float(520.3f);
byte byteValue = floatObject.byteValue();   	//it is 8
short shortValue = floatObject.shortValue();    //it is 520

parse–每个包装类都有一个静态方法(Integer有parseInt),用于将字符串转换为原始值(与方法名类型相同); valueOf()方法有两种形式,因为它还接受数值转换的基;如果字符串无效,则该方法抛出一个NumberFormatException:

int intValue = Integer.parseInt("234");
long longValue = Integer.parseInt("ffff", 16);  //65535 in base 16

int value = Integer.parseInt("12a");    //NumberFormatException

toString()–从返回值的字符串表示形式的对象(与任何其他Java类一样)继承的方法;它被隐式调用;数值包装类还提供静态toString()方法;Integer和Long提供第三种形式的toString(),它是静态的,允许将任何基10值转换为另一个基:

Double doubleObject = new Double(123.4);
System.out.println("double value = " + doubleObject.toString());
System.out.println("boolean value " + Boolean.toString(true));
System.out.println("65000 in hex is "+Long.toString(65000, 16));

to[Binary | Octal | Hexadecimal]String()–仅以整数定义的静态方法,用于将基数10转换为基数2、8或16:

String hexValue = Integer.toHexString(32);
String octValue = Integer.toOctalString(32);
String bynaryValue = Integer.toBinaryString(32);
System.out.println("32 is " + hexValue + " (16), " + 
                octValue + "(8) or " + bynaryValue + "(2)");

什么是Java自动装箱(autoboxing)和拆箱(unboxing)

装箱(boxing)是自Java1.5以来的一个可用功能,它允许程序员以更方便的方式使用包装类。在此之前,我们必须编写大量代码来执行一些简单的操作,例如在包装器和基元类型之间传输值:

Integer intObj1 = new Integer(23);
        int intPrimitive = intObj1.intValue();
        intPrimitive += 10;
        Integer intObj2 = new Integer(intPrimitive);

使用autoboxing,同样的事情很容易完成,因为编译器为我们进行转换

Integer intObj1 = 23;		//自动装箱
        int intPrimitive = intObj1;	//unboxing
        intPrimitive++;
        Integer intObj2 = intPrimitive;	//autoboxing

装箱(boxing)是将基元类型值包装到对象中的过程。

自动装箱(autoboxing)是在不显式调用构造函数的情况下完成的过程。
取消装箱(拆箱)是一个相反的过程,它允许在不显式调用[[byte | short | int | long | float | double]value()方法的情况下提取值。

因为,在Java 1.5之前,我们没有自动装箱和取消装箱功能,因此无法(现在可以)在条件语句中使用布尔对象:

Boolean boolValue = true;
if(boolValue)   //unboxing
    System.out.println("It's true !");