在Java中,包装类(Wrapper Class)是一种将基本数据类型封装为对象的类。它们提供了一些额外的功能,使得基本数据类型可以像对象一样被使用。主要的包装类包括:Integer、Double、Boolean、Character 等。
包装类的存在有以下几个主要原因:
- 对象化:Java是面向对象的编程语言,基本数据类型(如int、double、boolean 等)并不是对象。为了使基本数据类型具有对象的特性,引入了包装类。通过包装类,可以将基本数据类型转换为对象,从而可以使用对象的特性,如调用方法、存储在集合中等。
- 泛型支持:在使用泛型时,只能使用引用类型(包括包装类),而不能使用基本数据类型。因此,如果要在泛型中使用基本数据类型,就需要将其转换为对应的包装类。
- 可为null:基本数据类型不能表示为null,而包装类可以。这在某些情况下非常有用,例如在数据结构中,如果要表示某个数据项的缺失或空值,可以使用包装类的对象,将其设为null。
- 自动装箱和拆箱:Java提供了自动装箱(Autoboxing)和拆箱(Unboxing)的机制,可以在基本数据类型和对应的包装类之间进行自动转换。这使得在需要基本数据类型的地方可以直接使用对应的包装类,而不需要显式地进行类型转换。
需要使用包装类的情况包括:
- 在集合类中存储基本数据类型的值,因为集合类只能存储对象。
- 在使用泛型时,如果需要使用基本数据类型,就需要将其转换为对应的包装类。
- 在需要将基本数据类型作为方法参数或返回值时,因为方法只能接受对象作为参数和返回值。
总之,包装类提供了将基本数据类型转换为对象的功能,并提供了一些额外的特性和灵活性,以满足特定的编程需求。
下面列出了 8 种基本数据类型 和 对应的包装类:
- boolean: 对应的包装类是 Boolean。
- byte: 对应的包装类是 Byte。
- short: 对应的包装类是 Short。
- int: 对应的包装类是 Integer。
- long: 对应的包装类是 Long。
- float: 对应的包装类是 Float。
- double: 对应的包装类是 Double。
- char: 对应的包装类是 Character。
通常情况下,在开发中我们可以按照以下原则选择使用基本数据类型或包装数据类型:
- 声明类的成员变量时:通常会使用包装类型。包装类型提供了更多的方法和功能,无需手动处理,使用起来更加方便。此外,包装类型也可以表示空值(null),这在某些情况下非常有用。
- 声明方法内部的局部变量时:我们通常会尽量使用基本类型。使用基本类型的好处是它们占用的内存空间较小,并且在使用完毕后会自动释放内存,从而节约内存空间。
综上所述,选择基本数据类型还是包装数据类型取决于具体的情况和需求。如果需要更多的功能和处理选项,或者需要表示空值,可以选择包装类型。而对于局部变量等临时数据,使用基本数据类型可以节约内存空间。
每个包装类都提供了用于获取其对应基本数据类型的最大值和最小值的方法。
public class Review_baozhuang01 {
public static void main(String[] args) {
byte b = Byte.MAX_VALUE;
byte b1 = Byte.MIN_VALUE;
System.out.println("byte的取值范围"+b1+"~"+b);
short shortMin = Short.MIN_VALUE;
short shortMax = Short.MAX_VALUE;
System.out.println("short的取值范围"+shortMin+"~"+shortMax);
int charMax = Character.MAX_VALUE;//char charMax不会输出取值范围,必须转化为数值
int charMin = Character.MIN_VALUE;
System.out.println("char的取值范围"+charMin+"~"+charMax);
}
}
打印结果:
byte的取值范围-128~127
short的取值范围-32768~32767
char的取值范围0~65535
Integer包装类
如何创建Integer包装类?
public class Review_baozhuang01 {
public static void main(String[] args) {
Integer a = Integer.valueOf(20);//Integer(int value) -- 构造一个新分配的Integer对象,它表示指定的 int 值(JDK9中已过时)
Integer b = Integer.valueOf("20");//Integer(int value) -- 构造一个新分配的Integer对象,它表示指定的 String 值(JDK9中已过时)
Integer c = Integer.valueOf(20);//返回一个表示指定int值的Integer实例
Integer d = Integer.valueOf("20");//返回一个表示指定String值的Integer实例
}
}
Integer 是 Java 中的包装类,此外,该类还提供多个方法,其中最常用的是:将int数值与字符串之间的互相转换。
字符串转换:Integer 类提供了用于将字符串转换为 int 类型的方法 parseint(),以及将 int 类型转换为字符串的方法 toString()。这些方法使得在字符串和整数之间进行转换非常方便。
将int类型转化为字符串
Integer i1 = new Integer(100);
System.out.println(i1);
Integer包装类在输出时会自动调用toString方法
Integer获取值的时候会默认调用toString方法,
System.out.println(i1.toString());//.toString()被隐藏了
结果是输出100。
欸?不应该输出一堆字符吗?
因为如果调用toString()
方法的话,将会打印出对象的默认字符串表示形式,即对象的类名,后跟字符@
和对象的哈希码。例如,对于Integer
对象,将会打印出类似于java.lang.Integer@7ef20235
的字符串。
那是因为toString方法被自动重写了。在Java中,Integer类是继承自Number类的一个包装类,它用于表示整数。Integer类重写了Number类中的toString()方法,以便将整数以字符串的形式进行表示。
toString()方法的解释:
/**
* Returns a {@code String} object representing this
* {@code Integer}'s value. The value is converted to signed
* decimal representation and returned as a string, exactly as if
* the integer value were given as an argument to the {@link
* java.lang.Integer#toString(int)} method.
*
* @return a string representation of the value of this object in
* base 10.
*/
public String toString() {
return toString(value);
}
当你将一个Integer对象打印到控制台或者使用字符串拼接时,toString()方法会被自动调用,将Integer对象转换为相应的字符串表示形式。这是因为Java中的所有类都隐式继承了Object类,而Object类中定义了一个默认的toString()方法,用于将对象转换为字符串。由于Integer类重写了toString()方法,因此它提供了自定义的字符串表示形式。
Java的其他基本类型的包装类(如Double、Float、Long等)也提供了类似的toString()方法,用于将其对应的值转换为字符串形式。
字符串转换为 int 类型
Integer中提供了将纯数值字符串转换为数值的操作。
用ParseInt()方法
Static int parseInt(String s)
String i5 = "123";
System.out.println(Integer.parseInt(i5));//123 把字符串转化为数值
Double包装类
创建Double对象和创建Integer对象同理。
可以通过构造方法和调用Valueof()方法去创建对象。
Double cc = new Double(123.45);
Double dd = new Double("123.45");
Double aa = Double.valueOf(123.45);
Double bb = Double.valueOf("123.45");
如果要把小数值字符串转化为数值,还是用parseDouble()方法
String ee = "123.45";
System.out.println(Double.parseDouble(ee));
打印结果 123.45
也可以把整数值字符串转化为float值
String ee = "12345";
System.out.println(Double.parseDouble(ee));
打印结果 12345.0