Object类(toString equals)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/82946396

1、即使是没有写继承,其实也是继承于Object类,是Object类的子类

在这里插入图片描述


2、toString方法

(1)返回类型是String类型的

public String toString()

(2)一个引用,经常需要访问一个字符串或者需要当做字符串来处理的时候,这个时候,需要调用这个引用所指对象的toString方法,也就是说,把引用当字符串处理的时候,都会调用toString方法。

(3)如果+一边是字符串,一边是引用的时候,这个时候,需要将引用当成字符串来处理,java中一般都是调用这个引用所指对象的toString方法

在这里插入图片描述

(4)因为没有重写toString方法,所以调用的是Rectangle类从Object类中继承来的方法,或者是实现的是Object类中toString类的默认输出,包名.类型@逻辑地址

(5)但是有时候想要输出的是比如长、宽等,所以这个时候,需要对toString进行重写
注意:在System.out.println()中,如果括号中的形参仅仅是一个引用,没有+的时候,实际上打印的是形参也就是引用的toString

在这里插入图片描述

注意:
JAVA非main函数里不能System.out.println();
在这里插入图片描述
这样是错误的。
在这里插入图片描述这样是正确的。


3、equals方法
(1)a.(equals)b :比较的是内容是否相同

public boolean equals(Object o)

形参必须是Object

(2)== :a==b是判断a和b的地址是否相同,或者是说a和b是否指向同一个对象,即使有时内容相同,但是指向的逻辑地址不一定相同

(3)equals方法在Object中有默认实现的,但是满足不了子类的要求,因为默认实现与==类似,满足不了看内容是否相等的要求。

在这里插入图片描述

(4)因为没有重写,所以是默认方法,也就是看逻辑地址是否相同(是否指向同一个对象)

在这里插入图片描述

因为指向的是两个对象,所以返回的是false;

(5)重写equals方法
因为判断内容是否相同有多种,比如面积相同则相同、长相同则相同等,现在这里假设是长和宽同时相同的时候才为相同,则如下所示

在这里插入图片描述

但是,上面的写法是有问题的,因为如果没有Rectangle rec2=new Rectangle(3,4);这句话,而是Cat c=new Cat();那么在Sysem.out.println(rec1.equals(c));这个时候会出错,编译没有问题,因为o是Object类型的,所以可以传过Cat类型的,强制类型转换可能也是可以的,但是调用属性的时候会报错,因为c所指的对象中没有a和b,所以,猫无法和矩形进行比较,因此运行的时候会报错。

改进方法:

在这里插入图片描述

public boolean equals(Object o)
	{
		if(o==null) return false;
		else
		{
			boolean result=false;
			if(o instanceof Rectangle)
			{
				Rectangle rec1=(Rectangle)o;
				if(this.a==rec1.a&&this.b==rec1.b)
				{
					result=true;
				}
			}
			return result;
		}
	}

(6)自动生成equals
右击——源码——生成hashCode()和Equals()

这个是可以直接使用的。
(7)

在这里插入图片描述

注意:1、stu1.equals()调用的是stu1中重写的equals方法
pg1.equals()调用的是pg1中的equals方法
2、equals中的形参是Object类

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/82946396