Object类
Object类是Java所有类类型的父类(或者说祖先类更合适)
《Thinking in Java(Java编程思想)》的第一章名字就叫“everything is Object”,一切皆为对象。
toString()方法:自我描述
任何类,都默认继承Object,所以都有toString()方法:
public class Test {
public static void main(String[] args) {
Test a = new Test();
System.out.println(a.toString());
System.out.println(a);
}
}
我们在打印一个对象时,默认就调用了这个类的toString()方法,即使这个类的定义中没有toString()的代码,也会从Object中继承这个方法。
Object类中toString()方法的定义为:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
默认得到的字符串是“类名@hashCode”。
hashCode是一个计算出来的值,有些地方说这个是对象的地址,这种说法不严谨,但问题不大。
可以不严谨地认为这个字符串代表了对象的地址。
重写toString,实现自定义的“自我描述”
class Person {
public Person(String name) {
this.name = name;
}
private String name;
@Override
public String toString() {
return getClass().getName() + "{" + name + "}";
}
}
public class TestToString {
public static void main(String[] args) {
Person a = new Person("孙行者");
System.out.println(a.toString());
}
}
结果:
Person{孙行者}
实际应用举例:
toString()可以自动生成:点击鼠标右键→source→Generate toString()
public class Monkey {
private int id;
private String type;
private String name;
// 访问器略
@Override
public String toString() {
return "Monkey [id=" + id + ", type=" + type + ", name=" + name + "]";
}
}
equals方法和==
Object类中的equals方法和==运算符没有区别(两个对象引用相等才认为相等):
public boolean equals(Object obj) {
return (this == obj);
}
String类重写了equals方法,所以内容相等就判为相等。
具体参见String章节
自定义类时,可以重写equals方法,提供自定义的判等标准:
// 例:两个类name相同,即认为相等
public class TestOverwriteEquals {
public static void main(String[] args) {
Food f1 = new Food("大米");
Food f2 = new Food("大米");
System.out.println("==:" + (f1 == f2));
System.out.println("equals:" + f1.equals(f2));
}
}
class Food {
public Food(String name) {
this.name = name;
}
private String name;
@Override
public boolean equals(Object obj) {
if (obj != null && obj.getClass() == Food.class) {
Food f = (Food) obj;
if (f.name.equals(this.name)) {
return true;
}
}
return false;
}
}
运行结果
==:false
equals:true