package cn.itcast_03;

public class Student {
private String name;
private int age;

public Student() {
super();

}

public Student(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;
Student other = (Student) 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;
}

// @Override
// public boolean equals(Object obj) {
// // return true;
// //这里要改进,根据这里比较的成员变量来决定返回true还是false
// //这里其实要比较的就是name和age
// //但是,name是String类型的,而String是引用类型的,所以在这里不能直接用==比较,应该用equals()比较
// //String的equals()方法是重写自Object类的,比较的是字符串的内容是否相同。
// //this--s1
// //obj--s2
// //我们要使用的是学生类的特有成员变量,所以要向下转型
// Student s = (Student)obj;//s -- obj -- s2
// if(this.name.equals(s.name) && this.age == s.age){
// return true;
// }else{
// return false;
// }
// }

// @Override
// public boolean equals(Object obj) {
// //为了提高效率
// if(this == obj){
// return true;
// }
//
// //一日停锁
// //为了提高程序建壮性
// //判断,obj是不是学生的一个对象,如果是,再做向下转型,如果不是直接返回false。
// //这个时候,要判断的是对象是否是某个类的对象?
// //格式:对象名 instanceof 类名
// //表示:判断该对象名是否是该类名的一个对象
// if(!(obj instanceof Student)){
// return false;
// }
// //如果是就继续
//
// Student s = (Student)obj;//s -- obj -- s2
// System.out.println("同一个对象,还需要向下转型并比较吗?");
// return this.name.equals(s.name) && this.age == s.age;
//
// }


}


package cn.itcast_03;

/*
* public boolean equals(Object obj):指示其他某个对象是否与此对象“相等”。
* 这个方法,默认情况下比较的是地址值。比较地址值一般来说意义不大,所以我们要重写该方法。
* 怎么重写呢?
* 一般都是用来比较对象的成员变量值是否相同。
* 重写的代码优化:提高效率,提高程序建壮性
* 最终版:
* 其实还是自动生成。Alt+Shift+s+h
*
* 看源码:
* public boolean equals(Object obj) {
* //this - s1
* //obj - s2
* return (this == obj);
* }
*
* ==:
* 基本类型:比较的就是值是否相同
* 引用类型:比较的就是地址值是否相同
* equals:
* 引用类型:默认情况下,比较的是地址值。
* 不过,我们可以根据情况自已重写该方法。一般重写都是自动生成,比较对象的成员变量值是否相同
*/
public class StudentDemo {
public static void main(String[] args) {
Student s1 = new Student("王亮", 22);
Student s2 = new Student("王亮", 22);
System.out.println(s1 == s2);// false
Student s3 = s1;
System.out.println(s1 == s3);// true
System.out.println("-------------------");

System.out.println(s1.equals(s2));// obj = s2 //true
System.out.println(s1.equals(s1));//true
System.out.println(s1.equals(s3));//true
Student s4 = new Student("风清杨",30);
System.out.println(s1.equals(s4));//false

Demo d = new Demo();
System.out.println(s1.equals(d));//ClassCastException
}
}

class Demo{}