1.9(java学习笔记)object类及toString()与equals()方法

时间:2023-02-25 17:07:11

object类

java中objec是所有类公共的父类,一个类只要没有明显的继承某一类,那么它就是继承object类。

例如 class Person {......};和class Person extends Object{......}是一样的。如果我们的Studdent继承了Person类,继承结构就应该是

1.9(java学习笔记)object类及toString()与equals()方法

这时大家可能会想,为什么要默认继承object类,把objec类作为公共的父类有什么用?

object类作为公共的父类,那么所有的子类都可以调用Object类中的方法。

下列结束两个Object类中的方法

1.toString

我们看下列代码

 1 package TestObject;
 2 
 3 public class Person {
 4     public static void main(String[] args){
 5         Student stu1 = new Student();
 6         System.out.println(stu1);
 7         System.out.println(stu1.toString());
 8     }
 9 
10 }
11 
12 class Student extends Person{
13     void study(){
14         System.out.println("学习中...");
15     }
16 }
运行结果:
TestObject.Student@15db9742
TestObject.Student@15db9742

我们会发现运行的结果是一样的。我们在来看看object中toString()f方法的源码

1 public String toString() {
2         return getClass().getName() + "@" + Integer.toHexString(hashCode());
3     }

前面是获取名称,后面是获取地址。

这个方法是Object类中的,是所有子类的公共父类,所以我们可以通过重写toString()方法来达到我们需要的功能。

 1 package TestObject;
 2 
 3 public class Person {
 4     String name = "hcf";
 5     public static void main(String[] args){
 6         Student stu1 = new Student();
 7         System.out.println(stu1);
 8         System.out.println(stu1.toString());
 9     }
10 
11 }
12 
13 class Student extends Person{
14     void study(){
15         System.out.println("学习中...");
16     }
17     public String toString(){
18         return name;
19     }
20 }
运行结果:
hcf
hcf

这样我们就重写了Object类中的toString()方法。

 

2.equals()

我们先看下object类中的equals()方法源码

1 public boolean equals(Object obj) {
2         return (this == obj);

可以看出,这个比较是直接比较地址值是否相等。

我们实际使用时可能认为,两个对象的内容相同就是相同的对象,可这时使用equals比较会出问题。因为对象的内容相同,但它们的存放地址是不同的,即不同的地址存放着相同的内容。

这是我就需要重写object类中equals方法,改写成对象的内容相同就代表它们相同。

 

下面是重写之后的equals方法。

 

 1 package TestObject;
 2 
 3 public class Person {
 4     String name = "hcf";
 5     public static void main(String[] args){
 6         Student stu1 = new Student();
 7         Student stu2 = new Student();
 8         System.out.println(stu1 == stu2);
 9         System.out.println(stu1.equals(stu2));
10     }    
11 }
12 
13 
14 class Student extends Person{
15     void study(){
16         System.out.println("学习中...");
17     }
18     public String toString(){
19         return name;
20     }
21     
22     @Override   //加上这个标记代表重写了该方法。
23     public boolean equals(Object obj) { //因为Object是所有对象的父类,所以可以使用Object来接受任意类型的对象,便于操作。
24         if(this == obj)                //首先判断两个对象地址是否相同,地址相同则肯定是相同对象。
25             return true;
26         if(!(obj instanceof Student))  //然后在判断两个是不是同一类,如果类不想同,则不同。
27             return false;
28         Student stu = (Student)obj;    //先将obj强制转型成Student,然后一个一个属性区比较
29         if(stu.name.equals(this.name)) //此时的equals是String类中的方法,作用是比较字符的内容是否相同。
30             return true;               //stu.name是String形式,所以调用的是String中的equals方法,
31         else                           //String中也重写了equals方法,作用是比较字符串内容是否相等。
32             return false;    
33     }
34     
35 }

 object类中一些方法我们会根据自己需要来重写。