10.9-Object类

Java默认继承object类,Java类都继承了object类的属性及方法

toString()

默认返回值为string类型 类名全称@0x(hashcode值)

例子

package day10_9;

import java.util.Arrays;

public class ObjectDemo {
	public static void main(String[] args) {
		int[] ary = {1,2,3};
		//此处默认调用了object类中的toString方法
		System.out.println(ary/*.toString()*/);
		//输出ary数组的内容
		System.out.println(Arrays.toString(ary));
	}
}

equals()

==作用相同,均为比较引用地址是否相等

引用相等:比的是对象的引用地址,比得是是否为同一个对象

对象相等:比的是对象中的数据,比的是对象中的内容

注意:一般情况下,在子类中需要重写equals(),以实现对象内容(对象数据)的比较

覆盖规则:

  1. 自反性:自己与自己比结果要返回true x.equals(x)->true

  2. 对称性:x.equals(y)->true y.equals(x)->true

  3. 传递性:x.equals(y)->true y.equals(z)->true z.equals(x)->true

  4. 一致性:x.equals(y)一开始的结果为true,后期只要不对x, y的属性做出任何的修改,再次使用x.equals(y)结果依旧为true

hashCode()

​ 原则上不同的对象调用object类中的hashcode()返回的值是不同的

  1. hashCode()要与equals()一同覆盖

    • 当两个对象equals()比较为true时,应该具有相同的hashCode值

    • 当两个对象equals()比较为false时,应具有不同的hashCode值

    • hashCode值要稳定,一个对象创建以后就不应该再发生变化

  2. 一般使用对象的OID值作为hashCode值,OID是对象的唯一编号,在项目中都是根据数据生成一个OID,就是数据库的主键(唯一约束性)

综合例子

package day01;

import java.util.Arrays;

public class ObjectDemo {
	public static void main(String[] args) {
		int[] ary = {1,2,3};
		//此处默认调用Object类中的toString()方法
		System.out.println(ary/*.toString()*/);
		//输出ary数组的内容
		System.out.println(Arrays.toString(ary));
		String s = "abc";
		String s3 = "abc";
		/*
		 * String类型的字面量保存在内存的常量池中
		 * 常量池有常量优化机制,会把相同的字面量
		 * 优化同一个,所以s和s3引用的是同一个"abc"
		 */
		System.out.println(s==s3);//true
		String s1 = new String("abc");
		String s2 = new String("abc");
		System.out.println(s1==s2);//false
		/*
		 * String类已经重写Object类中的equals()
		 * 重写之后的equals()比较的是两个字符串的
		 * 内容是否相等
		 */
		System.out.println(s1.equals(s2));//true
		int[] ary1 = {1,2,3};
		System.out.println(ary==ary1);//false
		//此处默认调用Object类中的equals()
		System.out.println(ary.equals(ary1));//false
		Aoo a1 = new Aoo(23);
		Aoo a2 = new Aoo(23);
		System.out.println(a1==a2);//false
		System.out.println(a1.equals(a2));//true
		System.out.println(a1.hashCode()==a2.hashCode());
	}
}
class Aoo{
	int age;
	public Aoo(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Aoo other = (Aoo) obj;
		if (age != other.age)
			return false;
		return true;
	}
	
	//重写Object类中的equals()
//	@Override
//	public boolean equals(Object obj) {//this
//		if(obj==null) {
//			return false;
//		}
//		if(this==obj) {
//			return true;
//		}
//		if(obj instanceof Aoo) {
//			Aoo aoo = (Aoo)obj;
//			return this.age==aoo.age;
//		}
//		return false;
//	}
}

最后更新于