首页 > 编程笔记 > Java笔记 阅读:21

Java Object类的用法(新手必看)

大家最开始学习用 class 关键字定义类时,就应用到了继承原理,因为在 Java 中,所有的类都直接或间接继承了 java.lang.Object 类。

Object 类是比较特殊的类,它是所有类的父类,是 Java 类层中的最高层类。用户创建一个类时,除非已经指定它从其他类继承,否则它就是从 java.lang.Object 类继承而来的。

Java 中的每个类都源自 java.lang.Object 类,如 String 类、Integer 类等都是继承自 Object 类。除此之外,自定义的类也都继承自 Object 类。由于所有类都是 Object 类的子类,因此在定义类时可省略 extends Object,如下图所示。
 

图 1 定义类时可以省略 extends Object

Object类常用方法

在 Object 类中,主要包括 clone()、finalize()、equals()、toString() 等方法,其中常用的两个方法为 equals() 和 toString()。由于所有的类都是 Object 类的子类,因此任何类都可以重写 Object 类中的方法。

注意,Object 类中的 getClass()、notify()、notifyAll()、wait() 等方法不能被重写,因为这些方法被定义为 final 类型。

下面详细讲述 Object 类中的几个重要方法:

1) getClass()方法

getClass() 方法是 Object 类定义的方法,它会返回对象执行时的 Class 实例,然后使用此实例调用 getName() 方法可以取得类的名称。

语法如下:
getClass().getname();
可以将 getClass() 方法与 toString() 方法联合使用:

2) toString()方法

toString() 方法的功能是将一个对象返回为字符串形式,它会返回一个 String 实例。在实际的应用中通常重写 toString() 方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的 toString() 方法。

【实例】让学生自我介绍。创建 Student 类,重写 toString() 方法,使该类的对象可以自定义输出自己的姓名和年龄。
public class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {
        return "我叫" + name + ",今年" + age + "岁。";
    }

    public static void main(String[] args) {
        Student s1 = new Student("张三", 16);
        System.out.println(s1);
        Student s2 = new Student("李四", 19);
        System.out.println(s2);
    }
}
运行结果如下:

我叫张三,今年16岁。
我叫李四,今年19岁。

3) equals()方法

在 Java 语言中,有两种比较对象的方式,分别为“==”运算符与 equals() 方法。二者的区别在于:
【实例】根据身份证号判断是否为同一人。为 People 类创建身份证号和姓名两个属性,重写 equals() 方法,仅以身份证号作为区分条件。创建 n 个 People 对象,用 equals() 方法和“==”运算符来判断是否存在多个对象代表同一个人。
public class People {
    int id;                // 身份证号
    String name;           // 名字

    public People(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public boolean equals(Object obj) {    // 重写 Object 类的 equals() 方法
        if (this == obj)                 // 如果参数与本类是同一个对象
            return true;
        if (obj == null)                 // 如果参数是 null
            return false;
        if (getClass() != obj.getClass()) // 如果参数与本类类型不同
            return false;
        People other = (People) obj;     // 将参数强转成本类对象
        if (id != other.id)             // 如果二者的身份证号不相等
            return false;
        return true;
    }

    public String toString() {           // 重写 Object 类的 toString() 方法
        return name;                    // 只输出名字
    }

    public static void main(String[] args) {
        People p1 = new People(220, "tom");
        People p2 = new People(220, "汤姆");
        People p3 = new People(330, "张三");
        Object o = new Object();

        System.out.println(p1 + "与" + p2 + "是否为同一人? ");
        System.out.println("equals()方法的结果:" + p1.equals(p2));
        System.out.println("==运算符的结果:" + (p1 == p2));

        System.out.println();
        System.out.println(p1 + "与" + p3 + "是否为同一人? ");
        System.out.println(p1.equals(p3));

        System.out.println(p1 + "与" + o + "是否为同一人? ");
        System.out.println(p1.equals(o));
    }
}
运行结果如下:

tom与汤姆是否为同一人?
equals()方法的结果:true
==运算符的结果:false
tom与张三是否为同一人?false
tom与java.lang.Object@48cf768c是否为同一人?false

从这个结果中可以看出,“tom”和“汤姆”虽然名字不同,但是二者的身份证号相同,因此 equals() 方法判断出了这两个对象实际上是同一个,而“==”运算符无法做出有效判断。如果两个对象的身份证号不同,或者两个对象类型都不同,那么 equals() 方法就会认为二者不是同一个人。

相关文章