久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

java方法的編寫過程中要注意哪些地方

144次閱讀
沒有評論

共計 2997 個字符,預計需要花費 8 分鐘才能閱讀完成。

這篇文章主要介紹“java 方法的編寫過程中要注意哪些地方”,在日常操作中,相信很多人在 java 方法的編寫過程中要注意哪些地方問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”java 方法的編寫過程中要注意哪些地方”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

不要在構造函數中調用可以被重寫的方法

一般來說在構造函數中只能調用 static,final 或者 private 的方法。為什么呢?

如果父類在執行構造函數的時候調用了一個可以被重寫的方法,那么在該方法中可能會使用到未初始化的數據,從而導致運行時異?;蛘咭馔饨Y束。

另外,還可能到方法獲取到未初始化完畢的實例,從而導致數據不一致性。

舉個例子,我們定義了一個 Person 的父類:

public class Person { public void printValue(){
 System.out.println( this is person! 
 }
 public Person(){ printValue();
 }
}

然后定義了一個 Boy 的子類,但是在 Boy 子類中,重新了父類的 printValue 方法。

public class Boy extends Person{ public void printValue(){
 System.out.println( this is Boy! 
 }
 public Boy(){ super();
 }
 public static void main(String[] args) { Person persion= new Person();
 Boy boy= new Boy();
 }
}

輸出結果:

this is person!
this is Boy!

可以看到 Boy 調用了自己重寫過的 printValue 方法。

注意,這里并不是說會產生語法錯誤,而是這樣會導致業務邏輯看起來非常混亂。

怎么解決呢?簡單辦法就是將 Person 中的 printValue 置位 final 即可。

不要在 clone() 方法中調用可重寫的方法

同樣的,我們在定義 clone 方法的時候也不要調用可重寫的方法,否則也會產生意想不到的變化。

還是上面的例子,這次我們添加了 clone 方法到 Person 類:

public Object clone() throws CloneNotSupportedException { Person person= (Person)super.clone();
 person.printValue();
 return person;
 }

接下來我們添加 clone 方法到 Boy 類:

public Object clone() throws CloneNotSupportedException { Boy clone = (Boy) super.clone();
 clone.printValue();
 return clone;
 }

因為在 clone 方法中調用了可重寫的方法,從而讓系統邏輯變得混亂。不推薦這樣使用。

重寫 equals() 方法

考慮一下父類和子類的情況,如果在父類中我們定義了一個 equals 方法,這個方法是根據父類中的字段來進行比較判斷,最終決定兩個對象是否相等。

如果子類添加了一些新的字段,如果不重寫 equals 方法,而是使用父類的 equals 方法,那么就會遺漏子類中新添加的字段,最終導致 equals 返回意想不到的結果。

所以一般來說,子類需要重寫 equals 方法。

如果重新 equals 方法,需要滿足下面幾個特性:

reflexive 反射性

對于一個 Object a 來說,a.equals(a) 必須成立。

symmetric 對稱性

對于一個 Object a 和 Object b 來說,如果 a.equals(b)==true,那么 b.equals(a)==true 一定成立。

transitive 傳遞性

對于 Object a,b,c 來說,如果 a.equals(b)==true,b.equals(c)==true, 那么 a.equals(c)==true 一定成立。

consistent 一致性

對于 Object a,b 來說,如果 a 和 b 沒有發生任何變化,那么 a.equals(b) 的結果也不能變。

對于非空的引用 a,a.equals(null) 一定要等于 false

具體代碼的例子,這里就不寫了,大家可以自行練習一下。

hashCode 和 equals

hashCode 是 Object 中定義的一個 native 方法:

@HotSpotIntrinsicCandidate
 public native int hashCode();

根據 Oracle 的建議,如果兩個對象的 equals 方法返回的結果是 true,那么這兩個對象的 hashCode 一定要返回同樣的 int 值。

為什么呢?

我們看下下面的一個例子:

public class Girl {
 private final int age;
 public Girl(int age) {
 this.age = age;
 }
 @Override
 public boolean equals(Object o) { if (o == this) {
 return true;
 }
 if (!(o instanceof Girl)) {
 return false;
 }
 Girl cc = (Girl)o;
 return cc.age == age;
 }
 public static void main(String[] args) { HashMap Girl,Integer  hashMap= new HashMap ();
 hashMap.put(new Girl(20), 20);
 System.out.println(hashMap.get(new Girl(20)));
 }
}

上面的 Girl 中,我們定義了 equals 方法,但是并沒有重寫 hashCode,最后返回的結果是 null。

因為我們 new 了兩次 Girl 這個對象,最后導致 native 方法中兩個不同對象的 hashCode 是不一樣的。

我們可以給 Girl 類中添加一個 hashCode 方法:

public int hashCode() {
 return age;
 }

這樣就可以返回正確的值。

compareTo 方法的實現

我們在實現可比較類的時候,通常需要實現 Comparable 接口。Comparable 接口定義了一個 compareTo 方法,用來進行兩個對象的比較。

我們在實現 compareTo 方法的時候,要注意保證比較的通用規則,也就是說,如果 x.compareTo(y) 0 y.compareTo(z) 0 那么表示 x.compareTo(z) 0.

所以,我們不能使用 compareTo 來實現特殊的邏輯。

最近看了一個日本的電影,叫做 dubo 默示錄,里面有一集就是石頭,剪刀,布來判斷輸贏。

當然,石頭,剪刀,布不滿足我們的通用 compareTo 方法,所以不能將邏輯定義在 compareTo 方法中。

到此,關于“java 方法的編寫過程中要注意哪些地方”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-17發表,共計2997字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 桃园县| 准格尔旗| 林州市| 蕲春县| 潮州市| 呼伦贝尔市| 子长县| 兴山县| 长沙市| 长阳| 宜兴市| 彭州市| 龙陵县| 庆阳市| 六盘水市| 安康市| 开阳县| 仙桃市| 孝感市| 北安市| 昆明市| 常宁市| 将乐县| 多伦县| 克拉玛依市| 青浦区| 贡觉县| 徐水县| 泰和县| 清新县| 平果县| 金塔县| 扎赉特旗| 威宁| 石林| 始兴县| 新化县| 汉川市| SHOW| 饶平县| 石林|