Java Object类详解

樵夫2021-08-30 10:53

Object是Java类库中的一个特殊类,也是所有类的父类。也就是说,Java允许把任何类型的对象赋给Object类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是Object类。因此,以下两个类表示的含义是一样的。

public class MyClass{…}

等价于

public class MyClass extends Object {…}

由于Java所有的类都是Object类的子类,所以任何Java对象都可以调用Object类的方法。常见的方法如表1所示。

表1 Object类的常用方法

方法 说明
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程序中比较常用。

toString()方法

toString()方法返回该对象的字符串,当程序输出一个对象或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。

Object类的toString()方法返回“运行时类名 十六进制哈希码”格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。

哈希码(hashCode),每个 Java 对象都有哈希码属性,哈希码可以用来标识对象,提高对象在集合操作中的执行效率。

先看以下代码:

// 定义Demo类,实际上继承Object类
class Demo {
}
public class ObjectDemo01 {
    public static void main(String[] args) {
        Demo d = new Demo(); // 实例化Demo对象
        System.out.println("不加toString()输出:" + d);
        System.out.println("加上toString()输出:" + d.toString());
    }
}

输出结果为:

不加toString()输出:Demo@15db9742
加上toString()输出:Demo@15db9742

以上的程序是随机输出了一些地址信息,从程序的运行结果可以清楚的发现,加和不加toString()的最终输出结果是一样的,也就是说对象输出时一定会调用Object类中的toString()方法打印内容。所以利用此特性就可以通过toString()取得一些对象的信息,如下面代码。

public class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String toString() {
        return "姓名:" + this.name + ":年龄" + this.age;
    }
    public static void main(String[] args) {
        Person per = new Person("开课吧", 8);// 实例化Person对象
        System.out.println("对象信息:" + per);// 打印对象调用toString()方法
    }
}

输出结果为:

对象信息:姓名:开课吧:年龄8

程序中的Person类中重写了Object类中的toString()方法,这样直接输出对象时调用的是被子类重写过的toString()方法。

equals()方法

在前面学习字符串比较时,曾经介绍过两种比较方法,分别是==运算符和equals()方法,==运算符是比较两个引用变量是否指向同一个实例,equals()方法是比较两个对象的内容是否相等,通常字符串的比较只是关心内容是否相等。

其使用格式如下:

boolean result = obj.equals(Object o);

其中,obj表示要进行比较的一个对象,o表示另一个对象。

例1

编写一个Java程序,实现用户登录的验证功能。要求用户从键盘输入登录用户名和密码,当用户输入的用户名等于admin并且密码也等于admin时,则表示该用户为合法用户,提示登录成功,否则提示用户名或者密码错误信息。

在这里使用equals()方法将用户输入的字符串与保存admin的字符串对象进行比较,具体的代码如下:

import java.util.Scanner;
public class Test01 {
    // 验证用户名和密码
    public static boolean validateLogin(String uname, String upwd) {
        boolean con = false;
        if (uname.equals("admin") && upwd.equals("admin")) { // 比较两个 String 对象
            con = true;
        } else {
            con = false;
        }
        return con;
    }
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.println("------欢迎使用大数据管理平台------");
        System.out.println("用户名:");
        String username = input.next(); // 获取用户输入的用户名
        System.out.println("密码:");
        String pwd = input.next(); // 获取用户输入的密码
        boolean con = validateLogin(username, pwd);
        if (con) {
            System.out.println("登录成功!");
        } else {
            System.out.println("用户名或密码有误!");
        }
    }
}

上述代码在validateLogin()方法中又使用equals()方法将两个String类型的对象进行了比较,当uname对象与保存admin的String对象相同时,uname.equals("admin")为true;与此相同,当upwd对象与保存admin的String对象相同时,upwd.equals("admin")为true。当用户输入的用户名和密码都为admin时,表示该用户为合法用户,提示登录成功信息,否则提示用户名或密码有误的错误信息。

该程序的运行结果下所示:

------欢迎使用大数据管理平台------
用户名:
adinm
密码:
admin
用户名或密码有误!
------欢迎使用大数据管理平台------
用户名:
admin
密码:
admin
登录成功!

getClass()方法

getClass()方法返回对象所属的类,是一个Class对象。通过Class对象可以获取该类的各种信息,包括类名、父类以及它所实现接口的名字等。

例2

编写一个实例,演示如何对String类型调用getClass()方法,然后输出其父类及实现的接口信息。具体实现代码如下:

public class Test02 {
    public static void printClassInfo(Object obj) {
        // 获取类名
        System.out.println("类名:" + obj.getClass().getName());
        // 获取父类名
        System.out.println("父类:" + obj.getClass().getSuperclass().getName());
        System.out.println("实现的接口有:");
        // 获取实现的接口并输出
        for (int i = 0; i < obj.getClass().getInterfaces().length; i++) {
            System.out.println(obj.getClass().getInterfaces()[i]);
        }
    }
    public static void main(String[] args) {
        String strObj = new String();
        printClassInfo(strObj);
    }
}

该程序的运行结果如下:

类名:java.lang.String
父类:java.lang.Object
实现的接口有:
interface java.io.Serializable
interface java.lang.Comparable
interface java.lang.CharSequence

接收任意引用类型的对象

既然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 ObjectDemo05 {
    public static void main(String[] args) {
        int temp[] = { 1, 3, 5, 7, 9 };
        // 使用object接收数组
        Object obj = temp;
        // 传递数组引用
        print(obj);
    }
    public static void print(Object o) {
        // 判断对象的类型
        if (o instanceof int[]) {
            // 向下转型
            int x[] = (int[]) o;
            // 循环输出
            for (int i = 0; i < x.length; i++) {
                System.out.print(x[i] + "\t");
            }
        }
    }
}

输出结果为:

1 3 5 7 9

以上程序使用Object接收一个整型数组,因为数组本身属于引用数据类型,所以可以使用Object接收数组内容,在输出时通过instanceof判断类型是否是一个整型数组,然后进行输出操作。

提示:因为Object类可以接收任意的引用数据类型,所以在很多的类库设计上都采用Object作为方法的参数,这样操作起来会比较方便。

以上就是小编为大家整理发布的“Java Object类详解”一文,更多相关内容尽在开课吧Java教程频道。

Java Object类详解

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营