java中的重写与重载_java中的重写与重载
1.重寫
重寫(Override)是父類與子類之間的多態性,實質是對父類的函數進行重新定義,如果在子類中定義某方法與其父類有相同的名稱和參數則該方法被重寫,不過子類函數的訪問修飾權限不能小于父類的;若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法,如需父類中原有的方法則可使用 super 關鍵字。
重寫的規則:參數列表必須完全與被重寫的方法相同,否則不能稱其為重寫;返回類型必須一直與被重寫的方法相同,否則不能稱其為重寫;訪問修飾符的限制一定要大于等于被重寫方法的訪問修飾符;重寫方法一定不能拋出新的檢查異常或者比被重寫方法申明更加寬泛的檢查型異常,譬如父類方法聲明了一個檢查異常 IOException,在重寫這個方法時就不能拋出 Exception,只能拋出 IOException 的子類異常,可以拋出非檢查異常。
1 packageFinalDemo;2
3 //父類
4 public classAnimal {5
6 String name;7 intno;8 public voideat(){9 System.out.println("動物會吃飯");10 }11
12 }
1 packageFinalDemo;2
3 //子類
4 public class Cat extendsAnimal{5
6 public static voidmain(String[] args){7
8 Cat c=newCat();9 c.eat();10
11 }12
13 /*
14 * 重寫父類的eat()方法15 */
16 public voideat(){17 super.eat(); //如果需要保留父類中的方法,采用:super.方法名 的格式調用
18 System.out.println("白貓會吃飯");19 }20 }
運行結果:
1.1 toString()方法的重寫
(1)不重寫
packageFinalDemo;public classAnimal {
String name;intno;
String gender;
Animal(String name,intno,String gender){this.name=name;this.no=no;this.gender=gender;
}public static voidmain(String[] args){
Animal a=new Animal("動物",1,"M");
System.out.println(a.toString());//沒有重寫toString()方法
}
}
運行結果:
(2)重寫toString()方法
運行結果:
1.2 equals()方法的重寫
(1)不重寫
1 packageFinalDemo;2
3 public classAnimal {4
5 String name;6 intno;7 String gender;8
9 Animal(String name,intno,String gender){10 this.name=name;11 this.no=no;12 this.gender=gender;13 }14
15
16 public static voidmain(String[] args){17 Animal a=new Animal("動物",1,"M");18 Animal b=new Animal("動物",1,"M");19
20 System.out.println(a.equals(b));21 }22
23 }
運行結果:
false
分析為什么為false呢?
而:
1 String a1="小狗";2 String b1="小狗";3 System.out.println(a1.equals(b1));
運行結果是:true
原因分析:
equals()在java.lang.Object下,而在Object中,equals()方法只是判斷兩者是否為同一個對象的引用,如下圖所示:
而在String類中,對equals()方法進行了重寫:
所以輸出的是true
(2)重寫:
1 packageFinalDemo;2
3 public classAnimal {4
5 String name;6 intno;7 String gender;8
9 Animal(String name,intno,String gender){10 this.name=name;11 this.no=no;12 this.gender=gender;13 }14
15 //重寫hashCode()
16 @Override17 public inthashCode() {18 final int prime = 31;19 int result = 1;20 result = prime * result + ((gender == null) ? 0: gender.hashCode());21 result = prime * result + ((name == null) ? 0: name.hashCode());22 result = prime * result +no;23 returnresult;24 }25
26
27 //重寫equals()
28 @Override29 public booleanequals(Object obj) {30 if (this ==obj)31 return true;32 if (obj == null)33 return false;34 if (getClass() !=obj.getClass())35 return false;36 Animal other =(Animal) obj;37 if (gender == null) {38 if (other.gender != null)39 return false;40 } else if (!gender.equals(other.gender))41 return false;42 if (name == null) {43 if (other.name != null)44 return false;45 } else if (!name.equals(other.name))46 return false;47 if (no !=other.no)48 return false;49 return true;50 }51
52 public static voidmain(String[] args){53 Animal a=new Animal("動物",1,"M");54 Animal b=new Animal("動物",1,"M");55 String a1="小狗";56 String b1="小狗";57 //System.out.println(a1.equals(b1));
58 System.out.println(a.equals(b));59 }60
61 }
運行結果:
true
結果分析:
為什么要重寫hashCode()?
因為比較時,首先比較兩者的hash值,若兩者的hash值不同,那么兩者肯定不同,所以無需進行equals()比較,而當兩者的hash值相同時,再進行equals()比較。這樣做,首先會節省時間,其次,若不進行hash()的重寫,會產生一下這樣情況:
1 packageFinalDemo;2
3 public classAnimal {4
5 String name;6 intno;7 String gender;8
9 Animal(String name,intno,String gender){10 this.name=name;11 this.no=no;12 this.gender=gender;13 }14
15
16
17 //重寫equals()
18 @Override19 public booleanequals(Object obj) {20 if (this ==obj)21 return true;22 if (obj == null)23 return false;24 if (getClass() !=obj.getClass())25 return false;26 Animal other =(Animal) obj;27 if (gender == null) {28 if (other.gender != null)29 return false;30 } else if (!gender.equals(other.gender))31 return false;32 if (name == null) {33 if (other.name != null)34 return false;35 } else if (!name.equals(other.name))36 return false;37 if (no !=other.no)38 return false;39 return true;40 }41
42 public static voidmain(String[] args){43 Animal a=new Animal("動物",1,"M");44 Animal b=new Animal("動物",1,"M");45 //String a1="小狗";46 //String b1="小狗";47 //System.out.println(a1.equals(b1));
48 System.out.println("a的hash值:"+a.hashCode());49 System.out.println("b的hash值:"+b.hashCode());50 System.out.println(a.equals(b));51 }52
53 }
結果:
可以看到,兩者的hash值不同,但是用equals()判定的返回值確實ture,這部滿足之前的要求,即hash值不同,equals為false,至于為什么這里出現了兩者的hash值不同,而equals判定為true,我也不清楚,后面再查資料解決。
所以修改為:
1 packageFinalDemo;2
3 public classAnimal {4
5 String name;6 intno;7 String gender;8
9 Animal(String name,intno,String gender){10 this.name=name;11 this.no=no;12 this.gender=gender;13 }14
15
16
17
18 //重寫hash方法
19 @Override20 public inthashCode() {21 final int prime = 31;22 int result = 1;23 result = prime * result + ((gender == null) ? 0: gender.hashCode());24 result = prime * result + ((name == null) ? 0: name.hashCode());25 result = prime * result +no;26 returnresult;27 }28
29 //重寫equals方法
30 @Override31 public booleanequals(Object obj) {32 if (this ==obj)33 return true;34 if (obj == null)35 return false;36 if (getClass() !=obj.getClass())37 return false;38 Animal other =(Animal) obj;39 if (gender == null) {40 if (other.gender != null)41 return false;42 } else if (!gender.equals(other.gender))43 return false;44 if (name == null) {45 if (other.name != null)46 return false;47 } else if (!name.equals(other.name))48 return false;49 if (no !=other.no)50 return false;51 return true;52 }53
54 public static voidmain(String[] args){55 Animal a=new Animal("動物",1,"M");56 Animal b=new Animal("動物",1,"M");57 //String a1="小狗";58 //String b1="小狗";59 //System.out.println(a1.equals(b1));
60 System.out.println("a的hash值:"+a.hashCode());61 System.out.println("b的hash值:"+b.hashCode());62 System.out.println(a.equals(b));63 }64
65 }
運行結果:
可以看到,重寫了hash方法和equals方法后,兩者的hash值相同了,equals判定的返回值也為true.
2. 重載
重載(overloading) 是在一個類里面,方法名字相同,而參數不同。返回類型可以相同也可以不同。每個重載的方法(或者構造函數)都必須有一個獨一無二的參數類型列表。
最常用的地方就是構造器的重載。
2.1 重載規則
被重載的方法必須改變參數列表(參數個數或類型不一樣);
被重載的方法可以改變返回類型;
被重載的方法可以改變訪問修飾符;
被重載的方法可以聲明新的或更廣的檢查異常;
方法能夠在同一個類中或者在一個子類中被重載。
無法以返回值類型作為重載函數的區分標準。
總結
以上是生活随笔為你收集整理的java中的重写与重载_java中的重写与重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 分页查询_java开发之分页查
- 下一篇: 字节增强java_提高byte的效率