java面向对象思想-超类Object(equals方法,hashcode方法,toString方法)

谈到继承就不得不提起所有类的超类Object类.在java中每一个类都是由他拓展而来.但是不需要显式的写到extends object.如果一个类并没有明确的指出超类是什么,那么这个类就会被认为是object的子类.object类都有哪些用处呢.首先介绍一些比较简单易懂的.首选由于object是所有类的超类,因此我们可以用object类引用任何类型的对象:

Object object = new Employee();

这样做试试完全合法的.在java中,只有基本类型不是对象,其他的引用类型包括数组类型,不管是对象数组还是引用数组都拓展了object类.

下面要介绍的是object类的一些方法:

equals方法:

object中的equals检查的是一个对象的引用是否等于另外一个独享.在object类中,这个方法架构判断的是两个对象的引用是否相等.然而对于多数的类来说,这样的判断并没有太多意义.有时候我们需要通过一些业务逻辑来判断两个类是否相等.就比如我们判断两个雇员是否相等只需要判断他的员工id是否相等就可以,而并不需要判断两个员工是否引用了同一个员工对象.这时我们就需要对object类中的equals方法进行覆写.

例:

	@Override
	public boolean equals(Object other) {
		Employee otherEm = (Employee) other;
		return this.id == otherEm.getId();
	}

但是我们这么写是不严谨的,为了防止id为null的情况我们需要将这个判断的逻辑进行更加严谨的封装

	@Override
	public boolean equals(Object other) {
		if(this == other ){
			return true;
		}
		if(other != null){
			if(getClass()!=other.getClass()) return false;
			
			Employee emp = (Employee) other ;
			
			return id.equals(emp.id);
			
		}
		
		 return false;
		
		
	}

Hashcode方法

散列码(hash code)是由对象导出的一个整形值,散列码是没有规律的,如果x和y是两个对象,x.hashcode()和y.hashcode()基本上不会相同.由于hashcode方法定义在object类中,因此没一个对象都有一个默认的hashcode的值,其值为存储地址值.

例:

		String s = "OK";
		
		StringBuilder sb = new StringBuilder();
		
		System.out.println(s.hashCode()+"  "+sb.hashCode());
		
		String t = "OK";
		
		StringBuilder tb = new StringBuilder();
		
		System.out.println(t.hashCode()+"  "+tb.hashCode());

结果;

2524  30533424
2524  27334345

请注意:字符串s和t拥有相同的散列码是由于字符串的散列码是由内容导出的.而StringBuilder类的sb和tb拥有不同的散列码是由于他们的散列码是对象存储地址.

如果我们重新定义了equals方法  那么我们就应该重新定义hashcode方法  并且两个方法的定义必须一致.

toString方法:

toString方法是object类中的一个重要的方法,它用于返回表示对象值得字符串.绝大多数的toString方法都遵循这样的格式:类的名字,虽有是一对方括号括起来的域值.

例如java.awt.Point[x=1,y=2]

当然我们也可以重写toString方法

例如:

	@Override
	public String toString() {
		return "Employee [id=" + id + ", name=" + name + ", salary=" + salary + ", joinDate=" + joinDate + "]";
	}

随处可见toString的原因就是由于只要一个对象与一个字符串通过操作符" + "连接起来,java就会自动的调用toString方法,以便获得这个对象的描述.

猜你喜欢

转载自blog.csdn.net/xiaoai1994/article/details/81943009
今日推荐