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

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() 方法就会认为二者不是同一个人。

相关文章