目录

一.Object类的toString方法

二.Object类的equals方法

三.重写Object类的equals方法

四.Objects类

五.重写Object类的Objects方法

 六.Object类7Objects类总结

(一)Object类1.Object类介绍        Object类是所有类的父类。一个类都会直接或者间接的继承自该类        该类中提供了一些非常常用的方法!2.toString()方法        A:作用:打印对象的信息        B:重写前:打印的是包名类名@地址值        C:重写后:打印的是对象中的属性值3.equals()方法

        A:作用:比较两个对象的        B:重写前:比较的是对象的地址值        C:重写后:比较的是对象中的属性值(二)Objects类1.equals()方法        比较两个对象是否相同,但是加了一些健壮性的判断!


一.Object类的toString方法

java.lang.Object类

类 Object是类层次结构的根(最顶层)类。每个类都使用Object作为超(父)类。

所有对象(包括数组)都实现这个类的方法。

public class Demo01ToString {
    public static void main(String[] args) {
/*
person类默认继承类Object类,所以可以使用Object类中的toString方法
String toString()返回值对象的字符串表示。
 */
        Person p = new Person("张三",18);
        String s = p.toString();
        System.out.println(s);//Day1.Demo1.Person@75b84c92

        //直接打印对象的名字,其实就是调用对象的toString方法 p = p.toString();
        System.out.println(p);//Day1.Demo1.Person@75b84c92

        /*
        看一个类是否重写类toString方法,直接打印这个类对应对象的名字即可
        如果没有重写同String方法,那么打印的就是对象的地址值(默认)
        如果重写toString方法,那么就按照重写的方式打印
         */
        Random r = new Random();
        System.out.println(r);//java.util.Random@6bc7c054

        Scanner sc = new Scanner(System.in);
        System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+][position=0][match valid=false][need input=false][source closed=false][skipped=false][group separator=\x{2c}][decimal separator=\x{2e}][positive prefix=][negative prefix=\Q-\E][positive suffix=][negative suffix=][NaN string=\Q�\E][infinity string=\Q∞\E]

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        System.out.println(list);//[1,2] 重写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 "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;
    }
}

二.Object类的equals方法

Person类默认继承了Object类,可以使用Object类的equals方法。

boolean equals(Object obj)指示其他某个对象是否此对象“相等”。

Object类equals方法的源码:

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

    参数:

        Object obj:可以传递任意的对象。      

    方法体:

        ==:比较运算符,返回的就是一个布尔值 true,false

        基本数据类型:比较的是值

        引用数据类型:比较的是两个对象的地址值

    this是谁?那个对象调用的方法,方法中的this就是那个对象;p1调用的equals方法,所以this就是p1

    obj是谁?传递过来的参数p2

    this==obj —> p1==p2

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

        p1=p2;

        System.out.println("p1"+p1);
        System.out.println("p2"+p2);

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

三.重写Object类的equals方法

Object类的equals方法默认比较的是两个对象的地址值,没有意义

所以我们需要写equals方法,比较两个对象的属性值(name,age)

    对象的属性值一样,返回true;否则返回false

问题:

    隐含一个多态

    Object obj = p2 = new Preson(“古力娜扎”,18);

    多态弊端:无法使用子类特有的内容(属性,方法)

解决:可以使用用向下转型(强转)把Object类型转换为Person

private String name;
    private int age;
    @Override
    public boolean equals(Object obj) {
        //增加一个判断,传递的参数obj是this本身,直接返回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;
    }
}

四.Objects类

在刚才IDEA自动重写equals代码中,使用到了javautilobjects类,那么这个类是什么呢?
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是 null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。

在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:
 -  public static boolean equals(Object a,Object b);判断两个对象是否相等。

我们可以查看一下源码,学习一下:

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

五.重写Object类的Objects方法

public class Demo03Object {
    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);

        /*
        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);
    }
}

 六.Object类7Objects类总结

(一)Object类
1.Object类介绍
        Object类是所有类的父类。一个类都会直接或者间接的继承自该类
        该类中提供了一些非常常用的方法!
2.toString()方法
        A:作用:打印对象的信息
        B:重写前:打印的是包名类名@地址值
        C:重写后:打印的是对象中的属性值
3.equals()方法

        A:作用:比较两个对象的
        B:重写前:比较的是对象的地址值
        C:重写后:比较的是对象中的属性值
(二)Objects类
1.equals()方法
        比较两个对象是否相同,但是加了一些健壮性的判断!