Java——Object

一、概念

Object是类层结构的根,每个类都把Object作为超类。所有对象(包括数组)都实现了这个类的方法。

二、toString

2.1、源码

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

2.2、介绍

toString方法的功能是将对象转换为字符串的形式,执行时机是每次打印对象,或者与字符串进行拼接,都会默认调用toString方法。

2.3、代码示例

public class Test {
    public static void main(String[] args) {
        Student stu = new Student();
        System.out.println(stu);   // com.itheima.obj.Student@1540e19d
    }
}

Student类型继承了Object没有对toString方法重写,因此这个结果就是由Object的toString方法所定义的。

2.4、重写toString

我们如果对打印的内容不满意,可以去重写方法,也可以借助IDEA的快捷键生成:先按Alt + Insert,然后再选择toString()选项,选择需要打印的属性结果就可以了。

// Student.java
public class Student {
    private String name;
    private int age;

    // 空参、有参构造方法
    // get、set...  

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

// Test.java
public class Test {
    public static void main(String[] args) {
        Student stu = new Student("张三", 27);
        System.out.println(stu);   // Student{name='张三', age=27}
    }
}

这样打印的结果内容就不一样了,比较直观。

三、equals

3.1、源码

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

3.2、介绍

equals方法的功能是比较两个对象是否相同。源码中可以看出默认是比较两个对象的地址。this指的是调用equals方法的对象,obj是方法传入的对象。

3.3、代码示例

// Phone.java
public class Phone {
    private String brand;
    private int price;

    // 空参、有参、get、set、toString
}

// Test.java
public class Test {
    public static void main(String[] args) {
        Phone p1 = new Phone("苹果", 5999);
        Phone p2 = new Phone("苹果", 5999);
        System.out.println(p1 == p2);   // false
        System.out.println(p1.equals(p2));   // false
    }
}

因为p1和p2两次创建的不同对象,地址不同。equals内部就是比较对象地址的,因此返回false。

3.4、重写equals

上述例子我们期望的值是true,因为这两个对象的类型相同,而且属性值内容相同,我们认为两个对象是相等的。就可以重写该方法。

我们可以自己去重写方法,也可以借助IDEA的快捷键生成:先按Alt + Insert,然后再选择equals() and hashCode()选项,选择需要比较的属性结果就可以了。

// Phone.java
public class Phone {
    private String brand;
    private int price;

    // 空参、有参、get、set、toString

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Phone phone = (Phone) o;
        return price == phone.price &&
                Objects.equals(brand, phone.brand);
    }

    @Override
    public int hashCode() {
        return Objects.hash(brand, price);
    }
}

// Test.java
public class Test {
    public static void main(String[] args) {
        Phone p1 = new Phone("苹果", 5999);
        Phone p2 = new Phone("苹果", 5999);
        System.out.println(p1 == p2);   // false
        System.out.println(p1.equals(p2));   // true
    }
}

这样打印的就是true了。

四、Objects工具类

4.1、介绍

Objects是JDK1.7新增的一个对象工具类,里面都是静态方法可以用来操作对象。比如对象的比较,计算对象的hash值,判断对象是否为空...

比如里面的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));
}

a.equals(b);   // 如果a为null值,肯定会空指针异常

Objects.equals(a, b);   // 如果a为null值,不会空指针异常

以后如果要比较两个对象是否相同,可以借助Objects的equals静态方法去比较。

posted @ 2021-05-14 15:16  徐林俊  阅读(188)  评论(0编辑  收藏  举报