Object类
在开始学习使用 class 关键字定义类时,就应用到了继承原理,因为在 Java 中所有的类都直接或间接继承了 java.lang.Object 类。Object 类是比较特殊的类,它是所有类的父类,是 Java 类层中的最高层类。用户创建一个类时,除非已经指定它从其他类继承,否则它就是从 java.lang.Object 类继承而来的。Java 中的每个类都源自 java.lang.Object 类,如 String 类、Integer 类等都是继承自 Object 类。除此之外,自定义的类也都继承自 Object 类。由于所有类都是 Object 类的子类,因此在定义类时可省略 extends Object,如图7.1所示。
在 Object 类中,主要包括 clone()、finalize()、equals()、toString() 等方法,其中常用的两个方法为 equals() 和 toString()。由于所有的类都是 Object 类的子类,因此任何类都可以重写 Object 类中的方法。

Object 类中的 getClass()、notify()、notifyAll()、wait() 等方法不能被重写,因为这些方法被定义为 final 类型。 |
下面详细讲述 Object 类中的几个重要方法。
getClass()方法
getClass() 方法是 Object 类定义的方法,它会返回对象执行时的 Class 实例,然后使用此实例调用 getName() 方法可以取得类的名称。语法如下:
getClass().getname();
可以将 getClass() 方法与 toString() 方法联合使用。
toString()方法
toString() 方法的功能是将一个对象返回为字符串形式,它会返回一个 String 实例。在实际的应用中通常重写 toString() 方法,为对象提供一个特定的输出模式。当这个类转换为字符串或与字符串连接时,将自动调用重写的 toString() 方法。
【例7.3】让学生自我介绍(实例位置:资源包\TM\sl\7\3)
创建 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岁。
equals()方法
在 Java 语言中,有两种比较对象的方式,分别为 “==” 运算符与 equals() 方法。二者的区别在于:“==” 比较的是两个对象引用内存地址是否相等,而 equals() 方法比较的是两个对象的实际内容。来看下面的实例。
【例7.4】根据身份证号判断是否为同一人(实例位置:资源包\TM\sl\7\4)
为 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.print(p1+"与"+p3+"是否为同一人?");
System.out.println(p1.equals(p3));
System.out.print(p1+"与"+o+"是否为同一人?");
System.out.println(p1.equals(o));
}
}
运行结果如下:
tom与汤姆是否为同一人?
equals()方法的结果:true
==运算符的结果:false
tom与张三是否为同一人?false
tom与java.lang.Object@48cf768c是否为同一人?false
从这个结果中可以看出,“tom” 和 “汤姆” 虽然名字不同,但是二者的身份证号相同,因此 equals() 方法判断出了这两个对象实际上是同一个,而 “==” 运算符无法做出有效判断。如果两个对象的身份证号不同,或者两个对象类型都不同,那么 equals() 方法就会认为二者不是同一个人。
编程训练(答案位置:资源包\TM\sl\7\编程训练)
【训练3】输出水果类价格 重写toString()方法,将如下信息输出到控制台上:红色的苹果被称为“糖心富士”,每500克4.98元,买了2500克“糖心富士”,需支付多少元。
【训练4】让猫狗是同类 重写equals()方法,得到一个荒唐的结果:猪和狗是同类。