文章目录
简介
Object类是Java中所有类的始祖,Java中每一个类都扩展了Object。所以没有见过extends Object
的写法,当然也可以写,但没必要。
以下是Object类的全部方法,目前先介绍最常见的两个。
toString方法
调用toString方法,会将所调用的参数最终以字符串的形式打印。我们最常用的做法就是将toString
方法重写,可以打印我们自己想打印的内容。不过在此之前,我们先了解一下toString
的调用机制。
下面是演示案例
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person("zhangsan" , 18);
System.out.println(person);
}
}
这里打印的是:类名@散列码
现在我们需要查看println
的源码(IDEA中按住Ctrl然后点击要查看的内容)
println
方法重载了很多个,但是我们传递过去的是person
引用,所以我们只看下面那个,由于person
是Object的子类对象的引用,所以可以向上转型为Object。之后参数又传递给了valueOf()
因为引用不为空,所以执行obj.toString()
最终就来到了Object的toString
,我们可以看到它的返回内容。(至于里面到底是什么,现在先不讲)
如果不想打印Object的toString
的内容,就需要我们在自定义的类中重写方法。如果我们重写了Object的方法,那么在调用的时候就会发生动态绑定(在多态那一章详细讲解过),最终调用我们重写的方法。
一般来说,我们重写toString
方法是为了直接打印我们类的信息,而在IDEA中可以通过一些操作自动生成。鼠标右键,选中Generate,再选中toString。
这样就打印出自定义类的信息了。
equals方法
equals
方法用于检测一个对象是否等于另一个对象,判断两个对象的引用是否相同。
看以下案例:
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person("zhangsan" , 18);
Person person1 = new Person("zhangsan" , 18);
System.out.println(person.equals(person1));
}
}
这里也许会有同学问:这两个对象不都叫“zhangsan”,年龄不都是18岁吗,怎么就false了。
Object的equals
方法,比较对象的引用,因为创建了两个对象,地址不同,所以返回false
如果我们假定张三确实只有一个人,世界上只有一个张三,那他自己的名字肯定等于自己的名字。
这时我们就要重写Object的equals
方法
@Override
public boolean equals(Object obj) {
return this.name.equals(((Person)obj).name);
}
@Override
public boolean equals(Object obj) {
Person tmp = (Person) obj;
return tmp.name.equals(this.name);
}
这时调用equals
就可以以名字来测试是否相等。以上两个写法均可,不过需要注意的是,我们调用的名字是自定义类的属性,而Object没有这一属性,所以要进行强制类型转换。
这里也许会有同学问,怎么在重写的
equals
又调用了equals
。这啥啊这?
还是需要源码来解释
Object是所有类的始祖,那String类肯定也继承了它,只不过String类觉得需要一个自己用起来适合的equals
方法,所以就把它给重写了。String重写的equals
方法对于同一个字符串会返回 true,不同的才会返回 false。
来看以下的代码
public static void main(String[] args) {
String str1 = "zhangsan";
String str2 = "zhangsan";
System.out.println(str1.equals(str2));
}
总之,我们在今后会根据自己需要的逻辑去重写equals
方法。