java object类、toString()、equals()、hashcode()

1、概念
Object类是所有类的父类,也就是说任何一个类的定义的时候如果没有明确的继承一个父类的话,那么它就是Object的子类。既然Object是所有类的父类,那么最大的一个好处就在于:利用Object类可以接收全部类的对象,因为向上自动转型。
所有对象(包括数组)都实现这个类的方法。
Object有三个比较重要的方法:
取得对象信息:public String toString()。
对象比较:public boolean equals(Object obj)。
取得对象HASH码:public hashCode()。
2、toString()方法

class Book extends Object {}
public class TestDemo{
    public static void main(String args[]) {
        Book b = new Book();
        String s = "Hello";
        System.out.println(b);
        System.out.println(b.toString());
        System.out.println(s);
    }
}
输出结果:
Book@659e0bfd
Book@659e0bfd
Hello

发现现在如果直接输出对象与调用toString()方法后输出对象的功能是完全一样的。在进行对象输出的时候,输出操作会自动调用对象中的toString()方法,将对象变为字符串后再输出,而默认情况下Object类中的toString()为了适应所有对象的输出,所以只输出了对象的编码。如果现在有需要,也可以自己根据实际情况来覆写此方法。

//覆写toString()方法
class Book {
    private String title;
    private double price;
    public Book(String title, double price) {
        this.title = title;
        this.price = price;
    }
    public String toString() {
        return "书名:" + this.title + "价格:" + this.price;
    }
}

public class TestDemo {
    public static void main(String args[]){
        Book b = new Book("Java开发", 79.8);
        System.out.println(b);
        System.out.println(b.toString());
    }
}
//输出结果:
//书名:Java开发价格:79.8
//书名:Java开发价格:79.8

3、equals()方法
用于测试某个对象是否同另一个对象相等。它在Object类中的实现是判断两个对象是否指向同一块内存区域。这中测试用处不大,因为即使内容相同的对象,内存区域也是不同的。如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。

class Employee{
... //此例子来自《java核心技术》卷一
    public boolean equals(Object otherObj){
        //快速测试是否是同一个对象
        if(this == otherObj) return true;
        //如果显式参数为null,必须返回false
        if(otherObj == null) reutrn false;
        //如果类不匹配,就不可能相等
        if(getClass() != otherObj.getClass()) return false;
        //现在已经知道otherObj是个非空的Employee对象
        Employee other = (Employee)otherObj;
        //测试所有的字段是否相等
        return name.equals(other.name)
            && salary == other.salary
            && hireDay.equals(other.hireDay);
    }
}

Java语言规范要求equals方法具有下面的特点:
**自反性:**对于任何非空引用值 x,x.equals(x) 都应返回 true。
**对称性:**对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
**传递性:**对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
**一致性:**对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
从这里看出,上面的例子是Java规范的equals方法的标准实现,推荐用上面例子的写法实现类的equals方法。

覆写equals方法之后,一定要覆写hashCode!!!为什么?首先这个是Object规范中要求的,两个相等的实例必须有相同的hashCode。

equals()和==的区别:
== 的作用:
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
  
equals 的作用:
  引用类型:默认情况下,比较的是地址值。
4、hashcode()方法
hashCode是一个native方法。hashCode()方法给对象返回一个hash code值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值