【客户类】
public class Customer {
private String name;
private int 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;
}
public Customer(){
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
【测试类】
public class EqualsTest {
public static void main(String[] args) {
int i=10;
int j =10;
double d = 10.0;
System.out.println(i ==j);
System.out.println(i==d);
// == 比较的可以不是 相同的类型
char c1 = 'A';
char c2 = 65;
System.out.println(c1==c2);
Customer cust1 = new Customer("tom",21);
Customer cust2 = new Customer("tom",21);
System.out.println(cust1 == cust2); //false 比较的地址值
// 比的是 两个对象的引用 是不是 指向同一个对象实体
System.out.println("************************");
}
}
【结果】
先看 运算符 "==",
1. i ==j 明显true, 2i与d不是相同的类型(也可能自动类型转换了?) true 3.不同的类型可以比 true
4. 比较的是引用数据类型,== 比较的是内存中的地址值。
如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.也就是说比较的是引用数据类型变量,比较的是两个对象的地址值是否相同。
1.可以在基本数据类型变量和引用数据类型变量中 2.如果比较的是基本数据类型的变量,比较的两个变量保存的数据是否相等(不一定类型要相同) 如果比较的是引用数据类型变量,比较的是两个对象的地址值是否相同
【注意】不同类型可以比较但是: 除了布尔型,八大基本数据类型应该都可以比
【代码】 equals
public class EqualsTest {
public static void main(String[] args) {
Customer cust1 = new Customer("tom",21);
Customer cust2 = new Customer("tom",21);
System.out.println(cust1 == cust2); //false 比较的地址值
// 两个对象的引用 是不是 指向同一个对象实体
System.out.println("************************");
String str1 = new String("atguigu");
String str2 = new String("atguigu");
System.out.println(str1 == str2);
System.out.println("************************");
// System.out.println(cust1.equals(cust1));
System.out.println(cust1.equals(cust2)); //1
System.out.println(str1.equals(str2)); // 2
Date date1 = new Date(324325524523L);
Date date2 = new Date(324325524523L);
System.out.println(date1.equals(date2)); // 3
}
}
【结果】 1 2 3 都为true ,比较的是实体内容, 但是此时的equals是重写了的,也就是说自己定义了的
equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equal()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法.
【如果没有重写的话】,结果:
所以可以发现:
1.是一个方法,而非运算 2.只能适用于引用数据类型, 3.Object类中equals()的定义, public boolean equals (Object obj){ return (this == obj) } 说明: Object类中定义的equals()和==的作用是相同的,比较的是地址值, 4.像String Date File 包装类等都重写了Object类中的equals()方法 ,这样的话比较的就不是地址值了,而是比较的两个对象的‘实体内容’是否相等 5.自定义类如何重写equals()的话,也通常比较两个对象的的实体内容,需要对 Object类中的方法equals方法进行重写
【重写equals代码】
@Override
// 比较两个对象的实体内容是否相同 即name 和age
public boolean equals(Object obj){ // obj 对象
if(this == obj){ // 如果当前对象和引用地址一样
return true;
}
// 对象 类型 true 进入判断
if(obj instanceof Customer){// 具体作用: 测试左边的对象是否是右边类或者该类的子类创建的实例对象
Customer cust = (Customer) obj; //强制类型转化 Customer实体对象
//比较两个对象的每个属性是否相同
//刚讲字符串类型String中被重写了,比较内容,name是String类型,所以比较内容
return this.age ==cust.age && this.name.equals(cust.name);
}
return false;
}