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
从上面可以看出,除了 Integer 和 Character 定义的名称与基本数据类型定义的名称相差较大外,其它的 6 种类型的名称都是很好掌握的。

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
posted @ 2023-06-01 10:22  酒剑仙*  阅读(165)  评论(0)    收藏  举报