详解Object类下的equals()方法和toString()方法

object类

在这里插入图片描述所以:Object类中的功能(属性、方法)就具有通用性。

== 运算符与equals()方法的区别:

① 回顾==运算符
"=="比较的是基本数据类型时,比较两变量保存的数据是否相等。(类型未必要相等);比较引用数据类型时,比较地址值是否相同。

代码理解:

package com.atguigu.java;
//==
public class EqualsTest {
	public static void main(String[] args) {
		int i=10;
		int j=10;
		double d =10.0;
		System.out.println(i==j);   //true
		//"=="比较的是基本数据类型时,比较两变量保存的数据是否相等。(类型未必要相等);比较引用数据类型时,比较地址值是否相同
		System.out.println(i==d);   //true。
		char c=10;     //不会报错,c字符对应的数是10。如A对应65,a对应97。
		System.out.println(i==c);   //true。
		
		char c1='A';
		char c2=65;
		System.out.println(c1==c2);  //true
	
}


在这里插入图片描述

②equals()方法:

Customer类:

package com.atguigu.java;

public class Customer {
	private String name;
	private int age;
	
	public Customer() {
		super();
	}
	public Customer(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}

EqualsTest类:

package com.atguigu.java;
import java.util.Date;
/*
 * equals()方法的使用:
 * ①equals是一个方法,而非运算符
 * ②只能适用于引用数据类型
 * ③ Object类中equals()的定义:(Object类中equals()的定义和“==”功能相同,即比较两对象地址是否相同)
 * 		public boolean equals(Object obj) {
        		return (this == obj);
    	}
 * ④像String、Date、File、包装类等都重写了Object类中的equals()方法,不比较两个引用地址是否相同,而是为比较两个对象“实体内容”是否相同	
 */
public class EqualsTest {
	public static void main(String[] args) {
		Customer cust1=new Customer("Tom", 21);
		Customer cust2=new Customer("Tom",21);
		//多态。equals()方法形参为Object类型,放入其子类对象(Customer型)
		System.out.println(cust1.equals(cust2));  //false。Object类中equals()的定义和“==”功能相同
		
		System.out.println("*********");
		String str1=new String("atguigu");
		String str2=new String("atguigu");
		System.out.println(str1.equals(str2));  //true
		Date date1=new Date(32432525324L);
		Date date2=new Date(32432525324L);
		System.out.println(date1.equals(date2));  //true
	}
}

String、Date、File、包装类等都重写了Object类中的equals()方法,不比较两个引用地址是否相同,而是为比较两个对象“实体内容”是否相同

上述代码中Object类中equals()的定义和“==”功能相同,为比较两对象地址是否相同。但通常情况下,我们自定义的类如果使用equals()的话,通常是比较两个对象的内容是否相同所以如果我们想像String、Date一样,比较两个对象实体内容是否相同,则需要对Object类中的equals()方法进行重写。

在Customer类中重写equals()方法:
①手动生成方式

package com.atguigu.java;

public class Customer {
	private String name;
	private int age;
	
	public Customer() {
		super();
	}
	public Customer(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	//重写的原则:比较两个对象的实体内容(即name和age)是否相同
	@Override
	public boolean equals(Object obj) {
		if(this==obj){   //如果二者连地址都一样,那内容一定一样
			return true;
		}
		if(obj instanceof Customer){  //传入的obj如果是Customer型才有可比性
			Customer cust=(Customer)obj;  //强转
			//比较两个对象的每个属性内容是否都相同
			if(this.age==cust.age&&this.name.equals(cust.name)){   //注意此处比较name时使用this.name.equals(cust.name)
				return true;
			}else{
				return false;
			}
		}
		return false;
	}

}

②开发常用自动生成方式(eclipse使用alt+shift+s):
在这里插入图片描述
属性全部勾选后自动生成重写的equals()方法,两种方式结果相同。

再次运行

package com.atguigu.java;
import java.util.Date;
public class EqualsTest {
	public static void main(String[] args) {
		Customer cust1=new Customer("Tom", 21);
		Customer cust2=new Customer("Tom",21);
		//多态。equals()方法形参为Object类型,放入其子类对象(Customer型)
		System.out.println(cust1.equals(cust2));   //重写equals()方法后此处变为true 
		
		System.out.println("*********");
		String str1=new String("atguigu");
		String str2=new String("atguigu");
		System.out.println(str1.equals(str2));  //true
		Date date1=new Date(32432525324L);
		Date date2=new Date(32432525324L);
		System.out.println(date1.equals(date2));  //true
	}
}
	

在这里插入图片描述注意:
在这里插入图片描述

总结:==与equals()的区别(面试题)
在这里插入图片描述Object类练习
在这里插入图片描述

package com.atguigu.exer;
/*
1.编写Order类,有int型的orderId,String型的orderName,相应的
getter()和setter()方法,两个参数的构造器,重写父类的equals()方法:
public boolean equals(Object obj),并判断测试类中创建的两个对象是否
相等。
*/
public class OrderTest {
	public static void main(String[] args) {
		Order order1=new Order(1001, "aA");
		Order order2=new Order(1001, "bB");
		Order order3=new Order(1001, "bB");
		System.out.println(order1.equals(order2)); //false
		System.out.println(order2.equals(order3)); //true
	}	
}

class Order{
	private int orderId;
	private String orderName;
	
	public Order(int orderId, String orderName) {
		super();
		this.orderId = orderId;
		this.orderName = orderName;
	}
	
	public int getOrderId() {
		return orderId;
	}
	public void setOrderId(int orderId) {
		this.orderId = orderId;
	}
	public String getOrderName() {
		return orderName;
	}
	public void setOrderName(String orderName) {
		this.orderName = orderName;
	}
	
	//自己手写重写父类equals方法
	@Override
	public boolean equals(Object obj) {
		if(this==obj){
			return true;
		}
		if(obj instanceof Order){
			Order order=(Order)obj;  //不强转的话,通过obj.无法调用Order里的属性
			return this.orderId==order.orderId && this.orderName.equals(order.orderName);	//String可以调用equals()方法,因为它已经重写过了		
		}
		return false;
	}
	
}

在这里插入图片描述在这里插入图片描述

package com.atguigu.exer;

public class MyDateTest {
	public static void main(String[] args) {
		MyDate m1 = new MyDate(14, 3, 1976);
		MyDate m2 = new MyDate(14, 3, 1976);
		if (m1 == m2) {
			System.out.println("m1==m2");
		} else {
			System.out.println("m1!=m2"); // m1 != m2
		}
		if (m1.equals(m2)) { //没有重写,相当于==
			System.out.println("m1 is equal to m2");   //在后面重写equals()之后结果为 : m1 is equal to m2
		} else {
			System.out.println("m1 is not equal to m2");      
				}
		}
}

class MyDate{
	private int day;
	private int month;
	private int year;
	
	public MyDate(int day, int month, int year) {
		super();
		this.day = day;
		this.month = month;
		this.year = year;
	}

	public int getDay() {
		return day;
	}

	public void setDay(int day) {
		this.day = day;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}
	//重写equals()方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MyDate other = (MyDate) obj;
		if (day != other.day)
			return false;
		if (month != other.month)
			return false;
		if (year != other.year)
			return false;
		return true;
	}
	
	
	
	
}

toString()方法

问题引入:

package com.atguigu.java;
import java.util.Date;

/*Object类中定义的toString():
 	 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
 */
public class ToStringTest {
	public static void main(String[] args) {
		Customer cust1=new Customer("Tom", 21);  
		System.out.println(cust1.toString());  //com.atguigu.java.Customer@15db9742
		System.out.println(cust1);   //当我们输出一个对象的引用时,实际上就是调用当前对象的toString()方法,所以此处与上一句输出结果相同
		//String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息
		String str=new String("MM");
		System.out.println(str);  //结果为:MM。因为String都重写了Object类中的toString()方法
		Date date= new Date(453453453543L);
		System.out.println(date.toString()); //Tue May 15 15:17:33 CST 1984,说明也重写过
	} 

}

String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息

自定义类也可以重写toSring()方法,当调用此方法时,返回对象的实体内容。

此处我们在Customer中重写toString()方法:
自动生成toString()重写:
Alt+shift+s–>Generate toString()–>勾选后finish即可自动生成。

package com.atguigu.java;

public class Customer {
	private String name;
	private int age;
	
	public Customer() {
		super();
	}
	public Customer(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Customer other = (Customer) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	//重写toString方法;
	@Override
	public String toString() {
		return "Customer [name=" + name + ", age=" + age + "]";
	}

}

运行CustomerTest():

package com.atguigu.java;
import java.util.Date;

/*Object类中定义的toString():
 	 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
 */
public class ToStringTest {
	public static void main(String[] args) {
		Customer cust1=new Customer("Tom", 21);  
		System.out.println(cust1.toString()); //成功显示内容  
		System.out.println(cust1);   //成功显示内容  
		//String、Date、File、包装类等都重写了Object类中的toString()方法,使得调用对象的toString()方法时,返回“实体内容”信息
		String str=new String("MM");
		System.out.println(str);  //结果为:MM。因为String都重写了Object类中的toString()方法
		Date date= new Date(453453453543L);
		System.out.println(date.toString()); //Tue May 15 15:17:33 CST 1984,说明也重写过		
	} 
}

在这里插入图片描述练习:
在这里插入图片描述

在这里插入图片描述

package com.atguigu.exer;

public class GeometricObject {    //几何图形
	protected String color;
	protected double weight;
	
	public GeometricObject() {
		super(); 
		this.color="white";
		this.weight=1.0;
	}
	public GeometricObject(String color, double weight) {
		super();
		this.color = color;
		this.weight = weight;
	}
	
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	
}

package com.atguigu.exer;

public class Circle extends GeometricObject {
	private double radius;
	
	public Circle() {
		super();
		radius=1.0;
//		color="white";    实际上此二行不用写,因为父类中已经进行初始化
//		weight=1.0;
	}
	public Circle(double radius) {
		super();
		this.radius=radius;
	}
	public Circle(double radius,String color, double weight) {
		super(color,weight);
		this.radius=radius;
	}

	public double getRadius() {
		return radius;
	}

	public void setRadius(double radius) {
		this.radius = radius;
	}
	//求圆面积
	public double findArea(){
		return 3.14*radius*radius;
	}
	//重写equals()方法	
	@Override
	public boolean equals(Object obj) {
		if(this==obj){
			return true;
		}
		if(obj instanceof Circle){
			Circle c=(Circle)obj;  //强转
				return c.radius==this.radius;
		}
		return false;
	}
	//重写toString(输出圆的半径)
	@Override
	public String toString() {
		return "Circle [radius=" + radius + "]";
	}
	
	
}

在这里插入图片描述

package com.atguigu.exer;

public class CircleTest {
	public static void main(String[] args) {
		Circle circle1=new Circle(2.3);
		Circle circle2=new Circle(3.3,"white",2.0);
		//颜色是否相等
		System.out.println("颜色是否相等:"+circle1.color.equals(circle2.color));  //一定要用equals()(此equals()是String里的)比较,不可以用“==”(比地址)
//		circle1.equals(obj);
		System.out.println("半径是否相等:"+circle1.equals(circle2)); //false
		//调用toString输出半径值
		System.out.println(circle1.toString());   //Circle [radius=2.3]
		System.out.println(circle2);     //默认也是调用toString,输出:Circle [radius=3.3]
	}

}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

过期动态

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值