Object是所有類的父親,這個類有很多方法,我們都可以直接調用,但有些方法並不適合,例如下面的student類
1 public class Student { 2 //姓名、學號、年紀 3 private String name; 4 private int sid; 5 private int age; 6 7 //定義構造方法,給對象初始化 8 public Student(){ 9 10 } 11 public Student(String name,int sid,int age){ 12 this.name=name; 13 this.sid=sid; 14 this.age=age; 15 } 16 17 public String getName() { 18 return name; 19 } 20 public void setName(String name) { 21 this.name = name; 22 } 23 public int getSid() { 24 return sid; 25 } 26 public void setSid(int sid) { 27 this.sid = sid; 28 } 29 public int getAge() { 30 return age; 31 } 32 public void setAge(int age) { 33 this.age = age; 34 } 35 }
測試類:
1 package com.cn.reequlas; 2 //equals是比較2個對象是否相等,因為stu1和stu2是2個對像,在內在中是存了2個地址,所以不相同,找的是內存地址、 3 public class TestStudent { 4 public static void main(String[] args) { 5 Student stu1=new Student("張三",1,1); 6 Student stu2=new Student("張三",1,1); 7 boolean flag=stu1.equals(stu2); 8 System.out.println(flag); 9 } 10 11 }
因為對於Object類中的equals方法來講,它是用來對比,2個對像的在內存中的地址是否相同,很顯然,stu1 new了一個新地址,stu2也new了一個新地址,當然不同
而實際應用中,2個學生都叫張三,學號都一樣,因為學號是唯一的,所以他倆就是同一個人來着。那么我們就得重寫equals方法,當name和學號一樣的時候,就是相同的一個對像咯
這里有一個知識點:instanceof
//instanceof是指obj對像屬於Student if(!(obj instanceof Student))
添加重寫后的equals方法如下:
1 package com.cn.reequlas; 2 3 public class Student { 4 //姓名、學號、年紀 5 private String name; 6 private int sid; 7 private int age; 8 9 //定義構造方法,給對象初始化 10 public Student(){ 11 12 } 13 public Student(String name,int sid,int age){ 14 this.name=name; 15 this.sid=sid; 16 this.age=age; 17 } 18 19 public String getName() { 20 return name; 21 } 22 public void setName(String name) { 23 this.name = name; 24 } 25 public int getSid() { 26 return sid; 27 } 28 public void setSid(int sid) { 29 this.sid = sid; 30 } 31 public int getAge() { 32 return age; 33 } 34 public void setAge(int age) { 35 this.age = age; 36 } 37 //重寫equlas方法,判斷姓名、學號相等,就是同一個學生 38 //obj是給我們的一個學生對像 39 //this是我們自己的學生對像equals 40 41 public boolean equals(Object obj){ 42 boolean flag=false; 43 //判斷對像是否相同,基本是不可能的 44 if(obj==this){ 45 flag=true; 46 } 47 // 48 if(!(obj instanceof Student)){ 49 flag=false; 50 }else{ 51 Student stu=(Student)obj; 52 if(stu.name.equals(this.name) && stu.sid==this.sid){ 53 flag=true; 54 } 55 } 56 System.out.println(flag); 57 return flag; 58 } 59 }
測試類不變,輸出結果就是true
package com.cn.reequlas; //equals是比較2個對象是否相等,因為stu1和stu2是2個對像,在內在中是存了2個地址,所以不相同,找的是內存地址、 public class TestStudent { public static void main(String[] args) { Student stu1=new Student("張三",1,1); Student stu2=new Student("張三",1,1); /*Pet pet=new Pet("張三",1,1);*/ //使用重寫后的equlas方法,第1個if里面,判斷對像是否相同,這個(stu1)就是是obj,stu1是this /*boolean flag1=stu1.equals(stu1); System.out.println(flag1); */ //驗證Student類中重寫object方法的第2個if,不是同等類型 /*boolean flag2=stu1.equals(pet); System.out.println(flag2);*/ //驗證Student類中重寫object方法的第2個if中的else /*boolean flag4=stu1.getName().equals(stu2.getName()); System.out.println(flag4); boolean flag5=stu1.getSid()==(stu2.getSid()); System.out.println(flag5);*/ boolean flag=stu1.equals(stu2); System.out.println(flag); } }