Object类详解

Object类详解

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

public class MyClass{}

等价于

public class MyClass extends Object {}

由于 Java 所有的类都是 Object 类的子类,所以任何 Java 对象都可以调用 Object 类的方法。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() 方法,用于返回可以表述该对象信息的字符串。

先看以下代码:

// 定义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("寒山", 20);// 实例化Person对象
        System.out.println("对象信息:" + per);// 打印对象调用toString()方法
    }
}

输出结果为:

对象信息:姓名:寒山:年龄20

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

equals() 方法

在前面学习字符串比较时,曾经介绍过两种比较方法,分别是==运算符和 equals() 方法,==运算符是比较两个引用变量是否指向同一个实例,equals() 方法是比较两个对象的内容是否相等,当然,这是String类对equals()重写后的效果,像toString()一样,很多类都对Object类中的equals()方法进行了重写,用于返回判断两个对象的内容是否相等,通常字符串的比较只是关心内容是否相等,而equals()在Object中的实现却是这样的:

    public boolean equals(Object obj) {
        return (this == obj);
    }

equals()方法使用格式如下:

boolean result = obj.equals(Object o);

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

getClass() 方法

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

编写一个实例,演示如何对 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 判断类型是否是一个整型数组,然后进行输出操作。

提示:
1.因为 Object 类可以接收任意的引用数据类型,所以在很多的类库设计上都采用 Object 作为方法的参数,这样操作起来会比较方便。
2.上表中剩余的一些方法,放到以后的Java集合以及线程等章节中进行讲解。

你可能感兴趣的:(java)