Java包装类
一、Java包装类、装箱和拆箱
在 Java 的是基于面向对象的四想设计程序,即一切皆对象。但是从数据类型的划分中知道 Java 中的数据类型分为基本数据类型和引用数据类型,但是基本数据类型不能够称为对象,于是 Java 为每种基本数据类型分别设计了对应的类,称之为包装类(Wrapper Classes),也有地方称为外覆类或数据类型类。
包装类和基本数据类型的关系如下表所示。
| 序号 | 基本数据类型 | 包装类 |
|---|---|---|
| 1 | byte | Byte |
| 2 | short | Short |
| 3 | int | Integer |
| 4 | long | Long |
| 5 | char | Character |
| 6 | float | Float |
| 7 | double | Double |
| 8 | boolean | Boolean |
1.1.装箱和拆箱
在了解包装类后,下面介绍包装类的装箱与拆箱的概念。其实这两个概念本身并不难理解,
- 基本数据类型转换为包装类的过程称为装箱,例如把 int 包装成 Integer 类的对象;
- 包装类变为基本数据类型的过程称为拆箱,例如把 Integer 类的对象重新简化为 int。
手动实例化一个包装类称为手动拆箱装箱。Java 1.5 版本之前必须手动拆箱装箱,之后可以自动拆箱装箱,也就是在进行基本数据类型和对应的包装类转换时,系统将自动进行装箱及拆箱操作,不用在进行手工操作,为开发者提供了更多的方便。例如:
public class Test08 { public static void main(String[] args) { int i = 500; Integer obj = i;//自动装箱 int n = obj;//自动拆箱 System.out.println("n的值为:"+n); } }
1.2.包装类的应用
下面我们讲解 8 个包装类的使用,下面是常见的应用场景。
1) 实现 int 和 Integer 的相互转换
可以通过 Integer 类的构造方法将 int 装箱,通过 Integer 类的 intValue 方法将 Integer 拆箱。例如:
public class Test08 { public static void main(String[] args) { int i = 500; Integer obj = i;//自动装箱 int n = obj;//自动拆箱 System.out.println("n的值为:"+n); } }
2) 将字符串转换为数值类型
在 Integer 和 Float 类中分别提供了以下两种方法:
① Integer 类(String 转 int 型)
int parseInt(String s);
s 为要转换的字符串。
② Float 类(String 转 float 型)
float parseFloat(String s)
注意:使用以上两种方法时,字符串中的数据必须由数字组成,否则转换时会出现程序错误。
public class Test08 { public static void main(String[] args) { String str1 = "12"; String str2 = "12.33"; //将字符串变为int int i = Integer.parseInt(str1); System.out.println("i的值为:"+i); //将字符串变为float float v = Float.parseFloat(str2); System.out.println("v的值为:"+v); } }
3) 将整数转换为字符串
Integer 类有一个静态的 toString() 方法,可以将整数转换为字符串。例如:
public class Test08 { public static void main(String[] args) { int m = 120; String s = Integer.toString(m); System.out.println(s); } }
二、Java Object类详解
Object 是 Java 类库中的一个特殊类,也是所有类的父类。也就是说,Java 允许把任何类型的对象赋给 Object 类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类。因此,以下两个类表示的含义是一样的。
public class MyClass{…}
等价于
public class MyClass extends Object {…}
由于 Java 所有的类都是 Object 类的子类,所以任何 Java 对象都可以调用 Object 类的方法。常见的方法如表 1 所示。
| 方法 | 说明 |
|---|---|
| Object clone() | 创建与该对象的类相同的新对象 |
| boolean equals(Object) | 比较两对象是否相等 |
| void finalize() | 当垃圾回收器确定不存在对该对象的更多引用时,对象垃圾回收器调用该方法 |
| Class getClass() | 返回一个对象运行时的实例类 |
| int hashCode() | 返回该对象的散列码值 |
| void notify() | 激活等待在该对象的监视器上的一个线程 |
| void notifyAll() | 激活等待在该对象的监视器上的全部线程 |
| String toString() | 返回该对象的字符串表示 |
| void wait() | 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待 |
其中,toString()、equals() 方法和 getClass() 方法在 Java 程序中比较常用。
2.1.toString() 方法
toString() 方法返回该对象的字符串,当程序输出一个对象或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的 toString() 方法返回该对象的字符串表示。
Object 类的 toString() 方法返回“运行时类名@十六进制哈希码”格式的字符串,但很多类都重写了 Object 类的 toString() 方法,用于返回可以表述该对象信息的字符串。
哈希码(hashCode),每个 Java 对象都有哈希码属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。
public class Test08 { public static void main(String[] args) { MyException myException = new MyException(); System.out.println("不加toString()输出:" + myException); System.out.println("加上toString()输出:" + myException.toString()); } }
输出结果为:
- 不加toString()输出:com.anomaly.MyException
- 加上toString()输出:com.anomaly.MyException
从程序的运行结果可以清楚的发现,加和不加 toString() 的最终输出结果是一样的,也就是说对象输出时一定会调用 Object 类中的 toString() 方法打印内容。所以利用此特性就可以通过 toString() 取得一些对象的信息,如下面代码。
public class Person { private String name; private int age; private int sex; public Person(String name, int age, int sex) { this.name = name; this.age = age; this.sex = sex; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", sex=" + sex + '}'; } public static void main(String[] args) { Person p = new Person("张媛", 23, 0); System.out.println("对象信息:"+p); } }
执行结果如下:
对象信息:Person{name='张媛', age=23, sex=0}
程序中的 Person 类中重写了 Object 类中的 toString() 方法,这样直接输出对象时调用的是被子类重写过的 toString() 方法。
2.2.equals() 方法
在前面学习字符串比较时,曾经介绍过两种比较方法,分别是==运算符和 equals() 方法,
==运算符是比较两个引用变量是否指向同一个实例,- equals() 方法是比较两个对象的内容是否相等,通常字符串的比较只是关心内容是否相等。
其使用格式如下:
boolean result = obj.equals(Object o);
其中,obj 表示要进行比较的一个对象,o 表示另一个对象。
package com.anomaly; import java.util.Scanner; /** * @author : Augus * @date: 2023/6/1 13:46 * @Description: com.anomaly * @version: 1.0 */ public class Test09 { /** * 登录功能用户名、密码校验 * @param username * @param password * @return */ public static boolean checkLogin(String username,String password){ boolean state = false; if(username.equals("admin") && password.equals("123456")){ state = true; }else { state = false; } return state; } public static void main(String[] args) { //创建scanner Scanner scanner = new Scanner(System.in); System.out.print("请输入用户名:"); String name = scanner.next(); System.out.print("请输入密码:"); String pwd = scanner.next(); boolean b = checkLogin(name, pwd); if (b){ System.out.println("登录成功:"); }else { System.out.println("用户名或者密码错误"); } } }
2.3.getClass() 方法
getClass() 方法返回对象所属的类,是一个 Class 对象。通过 Class 对象可以获取该类的各种信息,包括类名、父类以及它所实现接口的名字等。
public class Test10 { public static void printClassInfo(Object object){ //获取类名 System.out.println("类名:"+object.getClass().getName()); //获取父类名 System.out.println("父类:"+object.getClass().getSuperclass().getName()); //输出父类实现的接口 object.getClass().getInterfaces().length 获取接口的数量 System.out.print("实现的接口有:"); for (int i = 0; i < object.getClass().getInterfaces().length; i++) { //object.getClass().getInterfaces()取出的值在一个集合中 System.out.println(object.getClass().getInterfaces()[i]); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //调用方法 printClassInfo(scanner); } }
2.4.接收任意引用类型的对象
既然 Object 类是所有对象的父类,则所有的对象都可以向 Object 进行转换,在这其中也包含了数组和接口类型,即一切的引用数据类型都可以使用 Object 进行接收。
interface A { public String getInfo(); } class B implements A { public String getInfo() { return "Hello World!!!"; } } public class ObjectDemo04 { public static void main(String[] args) { // 为接口实例化 A a = new B(); // 对象向上转型 Object obj = a; // 对象向下转型 A x = (A) obj; System.out.println(x.getInfo()); } }
代码执行结果如下:
Hello World!!!
通过以上代码可以发现,虽然接口不能继承一个类,但是依然是 Object 类的子类,因为接口本身是引用数据类型,所以可以进行向上转型操作。同理,也可以使用 Object 接收一个数组,因为数组本身也是引用数据类型。
public class ObjectDemo { public static void main(String[] args) { int[] nums = {2,13,56,6,7,89}; //使用obj接受数组 Object object = nums; //向下转型 int[] x = (int[]) object; //循环输出 for (int i : x) { System.out.println(i); } } }
三、Java Integer类详解
Integer 类在对象中包装了一个基本类型 int 的值。Integer 类对象包含一个 int 类型的字段。此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。
3.1.Integer 类的构造方法
Integer 类中的构造方法有以下两个:
- Integer(int value):构造一个新分配的 Integer 对象,它表示指定的 int 值。
- Integer(String s):构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
例如,以下代码分别使用以上两个构造方法来获取 Integer 对象:
Integer integer1 = new Integer(100); // 以 int 型变量作为参数创建 Integer 对象 Integer integer2 = new Integer("100"); // 以 String 型变量作为参数创建 Integer 对象
3.2.Integer 类的常用方法
在 Integer 类内部包含一些和 int 类型操作有关的方法如下:
| 方法 | 返回值 | 功能 |
|---|---|---|
| byteValue() | byte | 以 byte 类型返回该 Integer 的值 |
| shortValue() | short | 以 short 类型返回该 Integer 的值 |
| intValue() | int | 以 int 类型返回该 Integer 的值 |
| toString() | String | 返回一个表示该 Integer 值的 String 对象 |
| equals(Object obj) | boolean | 比较此对象与指定对象是否相等 |
| compareTo(Integer anotherlnteger) |
int | 在数字上比较两个 Integer 对象,如相等,则返回 0; 如调用对象的数值小于 anotherlnteger 的数值,则返回负值; 如调用对象的数值大于 anotherlnteger 的数值,则返回正值 |
| valueOf(String s) | Integer | 返回保存指定的 String 值的 Integer 对象 |
| parseInt(String s) | int | 将数字字符串转换为 int 数值 |
实际中,经常将字符串转换为 int 类型的数值,或者将 int 类型的数值转换为对应的字符串。以下代码演示如何实现这两种功能:
public class IntegerDeo { public static void main(String[] args) { String str1 = "4396"; int i = Integer.parseInt(str1);//将字符串转换为int类型的数值 System.out.println(i); int num = 8907; String s = Integer.toString(num); //将int类型的数值转换为字符串 System.out.println(s); } }
注意:在实现将字符串转换为 int 类型数值的过程中,如果字符串中包含非数值类型的字符,则程序执行将出现异常。
案例:创建一个 String 类型变量,然后将它转换为二进制、八进制、十进制和十六进制输出。
public class IntegerDemo01 { public static void main(String[] args) { int num = 4396; String s1 = Integer.toString(num);//将数字串转换成字符串 String s2 = Integer.toBinaryString(num);//将数字转换为二进制 String s3 = Integer.toHexString(num);//将数字转换为八进制 String s4 = Integer.toOctalString(num);//将数字转换为十六进制 System.out.println(num + "的二进制数是:" + s1); System.out.println(num + "的八进制数是:" + s2); System.out.println(num + "的十进制数是:" + s3); System.out.println(num + "的十六进制数是:" + s4); } }
执行后结果如下:
- 4396的二进制数是:4396
- 4396的八进制数是:1000100101100
- 4396的十进制数是:112c
- 4396的十六进制数是:10454
3.3.Integer 类的常量
Integer 类包含以下 4 个常量。
- MAX_VALUE:值为 231-1 的常量,它表示 int 类型能够表示的最大值。
- MIN_VALUE:值为 -231 的常量,它表示 int 类型能够表示的最小值。
- SIZE:用来以二进制补码形式表示 int 值的比特位数。
- TYPE:表示基本类型 int 的 Class 实例。
public class IntegerDemo02 { public static void main(String[] args) { int maxValue = Integer.MAX_VALUE;//获取int类型可取的最大值 int minValue = Integer.MIN_VALUE;//获取int类型可取的最小值 int size = Integer.SIZE;//获取int类型的二进制位 Class<Integer> type = Integer.TYPE;//获取基本类型 int 的class实例 System.out.println("获取int类型可取的最大值:"+maxValue); System.out.println("获取int类型可取的最小值:"+minValue); System.out.println("获取int类型的二进制位:"+size); System.out.println("获取基本类型int的class实例:"+type.getName()); } }
输出结果如下:
- 获取int类型可取的最大值:2147483647
- 获取int类型可取的最小值:-2147483648
- 获取int类型的二进制位:32
- 获取基本类型int的class实例:int

浙公网安备 33010602011771号