Object类的toString和Equals方法,以及Objects类的Equals方法

Object类

toString()方法

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

    public Person() {
    }

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

    /*
    直接打印对象的地址值没有意义,需要重写Object类中的toString方法
    打印对象的属性(name,age)
     */

    /*
    @Override
    public String toString() {
        //return "abc";
        return "Person{name="+name+",age="+age+"}";
    }*/

    //alt+fn+insert直接插入toString(),可默认重写
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", 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;
    }
}
==========================================================
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

/*
java.lang.Object
类Object是类层次结构的根类
每个类(Person,Student...)都使用Object作为超(父)类
所有对象(包括数组)都实现这个类的方法
 */
public class Demo01 {
    public static void main(String[] args) {
        /*
        Person类默认继承了Object类,所以可以使用Object类中的toString方法
        String toString()返回该对象的字符串表示
         */

        Person p=new Person("zhangsan",18);
        String s=p.toString();
        System.out.println(s);  
        //com.Object.Person@1b6d3586    /abc    /Person{name=zhangsan,age=18}

        //直接打印对象的名字,其实就是调用对象的toString方法 p=p.toString();
        //打印对象在堆内存中的地址值
        System.out.println(p);  
        //com.Object.Person@1b6d3586    /abc    /Person{name=zhangsan,age=18}

        //看一个类是否重写了toString,直接打印这个类的对象即可;如果没有重写toString方法那么打印的是对象的地址值
        Random r=new Random();      //未重写toString方法
        System.out.println(r);//java.util.Random@4554617c

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

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

    }
}

Equals方法

import java.util.Objects;

public class Demo03_Objects {
    public static void main(String[] args) {
        String s1 = "abc";
        //String s1 = null;
        String s2 = "abc";
        //boolean b = s1.equals(s2); //NullPointerException null是不能调用方法的,会抛出空指针异常
        //System.out.println(b);

        /*
        Object类的equals方法:对两个对象进行比较,防止空指针异常
        public static boolean equals(Object a, Object b){
            return (a == b) || (a != null && a.equals(b));
        }
         */

        boolean b2 = Objects.equals(s1, s2);
        System.out.println(b2);
    }
}
================================================================================
import java.util.Objects;

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

    public Person() {
    }

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

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

    /*@Override
    public boolean equals(Object obj) {
        //增加一个判断,传递的参数obj如果是this本身,直接返回true,提高程序效率
        if (obj==this){
            return true;
        }

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

        //增加一个判断,防止类型转换异常ClassCastException
        if (obj instanceof Person){
            //使用向下转型,把obj转换为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;
    }
*/

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        //getClass() != o.getClass() 使用反射技术判断o是否是Person类型   等效于 obj instanceof Person
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, 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;
    }
}

posted @ 2021-11-18 23:32  wydilearn  阅读(63)  评论(0编辑  收藏  举报