天天看點

常見對象_常見對象_Object類的equals()方法

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