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 类中的方法。

image 2024 02 29 17 26 02 045
Figure 1. 图7.1 定义类时可以省略extends 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()方法,得到一个荒唐的结果:猪和狗是同类。