Java - 所有类的父类Object类

Java - 所有类的父类Object类

Java中所有的方法都是object类提供的。
在object类中有三个方法比较重要,分别是:toString(); equals(); hasdCode();

1)toString()方法

toString()方法在Java中的原码为:

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

原码中可见当对象调用toString方法时,后面输出的是hashCode值。

2)equals()方法

equals() 方法在Java中的原码:

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

之后在创建类时,对象之间调用equals方法进行比较时,如果不重写则调用的是Object类中的方法,比较的是地址。但是如果要比较的是内容,则必须重写equals方法。
当创建String类型的对象,并且两个对象进行比较时,用String类型的equals方法,String类型的equals原码如下:

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

在String类中Java本身对equals方法已经进行了重写,所以当使用String创建对象并进行对象的内容比较时,直接使用的是Java对String中的equals方法已经重写的方法,直接调用就行。而当自己创建的类对象进行比较内容时,必须自己重写equals方法。当然在后期中,Java框架就对equals方法进行了重写,就不必自己亲自写。

3)hashCode()方法

hashCode() 方法在Java中的原码

public native int hashCode();

hashCode() 看不懂,对,就是。Java不想让咱们看。

我们对hashCode() 方法的理解:
hash算法是一种不可逆的过程,将数字按照某种特定的过程(自己定义或已有的算法),将数字排列成某种代替它不可逆的值。在equals方法中判断hashCode值,是因为当hashCode值不相等时,类的对象肯定不同,后面的代码则不需判断。而值相等时,有可能存在按照某种算法,使得不同的对象hashCode值相等,则需判断后面的代码。hashCode值是对象特征值的编码。hashCode值也是做判断的过程。

4)equals方法与hashCode方法的使用

class ObservObject {

	 private int age;
	 private String name;

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

	 public boolean equals(Object o) {
     	if(this == o) {
       	 	 return true;
    	 }
     	if(o instanceof ObservObject) {
        	 ObservObject that = (ObservObject)o;
         	if(o == null || this.hashCode() != that.hashCode()) {
             	return false;
        	 }
        	 if(this.age != that.age) {
            	 return false;
         	 }
        	 if(!this.name.equals(that.name)) {
            	 return false;
        	 }
        	 return true;
    	 } else {
	       	  return false;
    	 }
	 }

 //随便写,写的过程符合两个特点:代替,不可逆
	 public int hashCode() {
	   	 int code = 0;
    	 code = code + this.age*31 + 31;
    	 return code;
	 }
}

public class instanceofDemo {
	 public static void main(String[] args) {
    	 ObservObject oo1 = new ObservObject(23,"李四");
    	 ObservObject oo2 = new ObservObject(23,"李四");
    	 System.out.println(oo1.equals(oo2));
 	}
}
"C:\Program Files\Java\jdk1.8.0_172\bin\java.exe" ...
true

Process finished with exit code 0

在Object中,就只有这三个方法才会被使用到。也就只有这三个方法重要!

在这里插入图片描述
欢迎大家评论,留言。谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值