這篇文章主要介紹“java方法的編寫過程中要注意哪些地方”,在日常操作中,相信很多人在java方法的編寫過程中要注意哪些地方問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”java方法的編寫過程中要注意哪些地方”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!
創(chuàng)新互聯(lián)建站網(wǎng)站建設(shè)公司是一家服務(wù)多年做網(wǎng)站建設(shè)策劃設(shè)計(jì)制作的公司,為廣大用戶提供了成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè),成都網(wǎng)站設(shè)計(jì),1元廣告,成都做網(wǎng)站選創(chuàng)新互聯(lián)建站,貼合企業(yè)需求,高性價(jià)比,滿足客戶不同層次的需求一站式服務(wù)歡迎致電。
一般來說在構(gòu)造函數(shù)中只能調(diào)用static,final或者private的方法。為什么呢?
如果父類在執(zhí)行構(gòu)造函數(shù)的時(shí)候調(diào)用了一個(gè)可以被重寫的方法,那么在該方法中可能會(huì)使用到未初始化的數(shù)據(jù),從而導(dǎo)致運(yùn)行時(shí)異常或者意外結(jié)束。
另外,還可能到方法獲取到未初始化完畢的實(shí)例,從而導(dǎo)致數(shù)據(jù)不一致性。
舉個(gè)例子,我們定義了一個(gè)Person的父類:
public class Person { public void printValue(){ System.out.println("this is person!"); } public Person(){ printValue(); } }
然后定義了一個(gè)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(); } }
輸出結(jié)果:
this is person! this is Boy!
可以看到Boy調(diào)用了自己重寫過的printValue方法。
注意,這里并不是說會(huì)產(chǎn)生語法錯(cuò)誤,而是這樣會(huì)導(dǎo)致業(yè)務(wù)邏輯看起來非?;靵y。
怎么解決呢?簡(jiǎn)單辦法就是將Person中的printValue置位final即可。
同樣的,我們?cè)诙xclone方法的時(shí)候也不要調(diào)用可重寫的方法,否則也會(huì)產(chǎn)生意想不到的變化。
還是上面的例子,這次我們添加了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; }
因?yàn)樵赾lone方法中調(diào)用了可重寫的方法,從而讓系統(tǒng)邏輯變得混亂。不推薦這樣使用。
考慮一下父類和子類的情況,如果在父類中我們定義了一個(gè)equals方法,這個(gè)方法是根據(jù)父類中的字段來進(jìn)行比較判斷,最終決定兩個(gè)對(duì)象是否相等。
如果子類添加了一些新的字段,如果不重寫equals方法,而是使用父類的equals方法,那么就會(huì)遺漏子類中新添加的字段,最終導(dǎo)致equals返回意想不到的結(jié)果。
所以一般來說,子類需要重寫equals方法。
如果重新equals方法,需要滿足下面幾個(gè)特性:
reflexive反射性
對(duì)于一個(gè)Object a來說,a.equals(a)必須成立。
symmetric對(duì)稱性
對(duì)于一個(gè)Object a和Object b來說,如果a.equals(b)==true,那么b.equals(a)==true一定成立。
transitive傳遞性
對(duì)于Object a,b,c來說,如果a.equals(b)==true,b.equals(c)==true,那么a.equals(c)==true一定成立。
consistent一致性
對(duì)于Object a,b來說,如果a和b沒有發(fā)生任何變化,那么a.equals(b)的結(jié)果也不能變。
對(duì)于非空的引用a,a.equals(null) 一定要等于false
具體代碼的例子,這里就不寫了,大家可以自行練習(xí)一下。
hashCode是Object中定義的一個(gè)native方法:
@HotSpotIntrinsicCandidate public native int hashCode();
根據(jù)Oracle的建議,如果兩個(gè)對(duì)象的equals方法返回的結(jié)果是true,那么這兩個(gè)對(duì)象的hashCode一定要返回同樣的int值。
為什么呢?
我們看下下面的一個(gè)例子:
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) { HashMaphashMap= new HashMap<>(); hashMap.put(new Girl(20), 20); System.out.println(hashMap.get(new Girl(20))); } }
上面的Girl中,我們定義了equals方法,但是并沒有重寫hashCode,最后返回的結(jié)果是null。
因?yàn)槲覀僴ew了兩次Girl這個(gè)對(duì)象,最后導(dǎo)致native方法中兩個(gè)不同對(duì)象的hashCode是不一樣的。
我們可以給Girl類中添加一個(gè)hashCode方法:
public int hashCode() { return age; }
這樣就可以返回正確的值。
我們?cè)趯?shí)現(xiàn)可比較類的時(shí)候,通常需要實(shí)現(xiàn)Comparable接口。Comparable接口定義了一個(gè)compareTo方法,用來進(jìn)行兩個(gè)對(duì)象的比較。
我們?cè)趯?shí)現(xiàn)compareTo方法的時(shí)候,要注意保證比較的通用規(guī)則,也就是說,如果x.compareTo(y) > 0 && y.compareTo(z) > 0 那么表示 x.compareTo(z) > 0.
所以,我們不能使用compareTo來實(shí)現(xiàn)特殊的邏輯。
最近看了一個(gè)日本的電影,叫做dubo默示錄,里面有一集就是石頭,剪刀,布來判斷輸贏。
當(dāng)然,石頭,剪刀,布不滿足我們的通用compareTo方法,所以不能將邏輯定義在compareTo方法中。
到此,關(guān)于“java方法的編寫過程中要注意哪些地方”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!