Java之Object类常用方法——toString()方法和equals()方法以及Objects的equals()方法详解

Object类概述

java.lang.Object类是Java语言中的根(最顶层)类,即所有类的父(超)类。 它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。 所有对象(包括数组)都实现这个类的方法。 如果一个类没有特别指定父类,那么默认则继承自Object类。
下面以Person类继承自Object类举例,介绍Object类的两种常用方法:toString()方法和equals()方法

toString()方法

Person类默认继承了Object类,所以可以使用Object类当中的toString()方法
String toString():返回该对象的字符串表示

代码展示

首先写一个Person

import java.util.Objects;

public class Person {
    
    
    private String name;
    private int age;

    public Person(String name) {
    
    
        this.name = name;
    }

    public Person(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

然后创建一个Person类的对象,打印输出这个对象

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Demo01ToString {
    
    
    public static void main(String[] args) {
    
    
        
        Person p=new Person("张三",18);
        String s=p.toString();
        System.out.println(s);        //com.code.day01.demo01.Person@1b6d3586  
 
        /*
            看一个类是否重写了toString方法,直接打印这个类对应对象的名字即可
            如果没有重写toString方法,那么打印的就是对象的默认值(默认)
            如果重写了toString方法,那么就按照重写的方式打印
         */

        Random r=new Random();
        System.out.println(r);      //java.util.Random@4554617c,没有重写toString方法

        Scanner scan=new Scanner(System.in);
        System.out.println(scan);  //java.util.Scanner[delimiters=\p{javaWhitespace}+] 重写了toString方法

        ArrayList<Integer> list=new ArrayList<>();
        list.add(1);
        list.add(2);
        System.out.println(list);   //[1,2]  重写了toString方法

    }
}

创建了这个类之后,用toString()方法,直接打印的是对象的地址值,这样是没有意义的,所以我们需要重写Object类中的toString()方法,打印对象的属性值(name,age)。
Person类中重写toString()方法,也可以快捷键生成( alt+insert 选toString)

 //自己写的,打印对象的属性值(name,age)
@Override
 public String toString(){
    
    
     return "Person{name="+name+",age="+age+"}";
 }
//快捷键生成的
@Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

这时候在打印输出对象,输出结果就为 Person{name=``张三,age=18},是这个对象的姓名和年龄了,此时就有意义了。
【注意】
看一个类是否重写了toString()方法,直接打印这个类对应对象的名字即可。如果没有重写toString()方法,那么打印的就是对象的默认值。如果重写了toString()方法,那么就按照重写的方式打印出来。

equals()方法

Person类默认继承了Object类,所以可以使用Object类的equals()方法。
boolean equals(Object obj):指示其他某个对象是否与此对象“相等”
Object类的equals方法源码:

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

代码展示

public class Demo02Equals {
    
    
    public static void main(String[] args) {
    
    
        Person p1=new Person("迪丽热巴",18);
        //Person p2=new Person("古力娜扎",18);
        Person p2=new Person("迪丽热巴",18);

        boolean b=p1.equals(p2);
        System.out.println(b);      //false,比较的是p1和p2的地址值

        Random r=new Random();
        System.out.println(p1.equals(r));       //false
    }
}

Person类中没有重写Object类的equals()方法。Object类的equals()方法是默认比较的两个对象的地址值,没有意义。所以我们需要重写equals()方法,用来比较两个对象的属性值(name,age)对象的属性值一样,返回ture;否则返回false
问题:隐含着一个多态Object obj=p2=new Person(“古力娜扎”,18);
多态弊端:无法使用子类特有的内容(属性,方法)
解决:可以使用向下转型(强转)把Object类型转换为Person
Person类中重写equals()方法,比较的就是name和age的属性值是否一样

  	//自己重写的方法
	@Override
    public boolean equals(Object obj){
    
    

        //增加一个判断,传递的参数是obj本身,直接返回true
        if(obj==this){
    
    
            return true;
        }

        //增加一个判断,传递参数obj是null,直接返回false,提高程序的效率
        if(obj==null){
    
    
            return false;
        }

        //增加一个判断,是Person类型在转换,防止类型转换异常ClassCastException
        if(obj instanceof Person){
    
    
            //使用向下转型(强转)把Object类型转换为Person
            Person p=(Person)obj;
            //比较两个对象的属性;一个是调用方法的this(p1), 一个就是p(obj=p2)
            boolean b=this.name.equals(p.name) && this.age==p.age;
            return b;
        }

        //不是Person类型,直接返回false
        return false;
    }

    //快捷键生成equals方法的重写:alt+insert equals() and hashcode()
    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

import java.util.Random;
public class Demo02Equals {
    
    
    public static void main(String[] args) {
    
    
        Person p1=new Person("迪丽热巴",18);
        //Person p2=new Person("古力娜扎",18);
        Person p2=new Person("迪丽热巴",18);

        boolean b=p1.equals(p2);
        System.out.println(b);      //true
    }
}

Object类——equals()方法概述

Objects的equals方法:对两个对象进行比较,可以防止空指针异常

public static boolean equals(Object a, Object b) {
    
    
     return (a == b) || (a != null && a.equals(b)
);

代码展示

import java.util.Objects;

public class Demo03Objects {
    
    
    public static void main(String[] args) {
    
    
        String s1=null;
        String s2="abc";

        //String的equals()方法会报错NullPointerException,会抛出空指针异常
        //null是不能调用方法的,会抛出空指针异常
        boolean b=s1.equals(s2);  
        System.out.println(b);
        
        boolean b2= Objects.equals(s1,s2);	//Objects.equals()不会报错
        System.out.println(b2);
    }

Objects类的两个常用方法就介绍到这里了,希望能对你有所帮助!!!

猜你喜欢

转载自blog.csdn.net/wtt15100/article/details/108190203