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{}