溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2021-11-24 14:59:45 來源:億速云 閱讀:155 作者:iii 欄目:云計(jì)算

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

不要在構(gòu)造函數(shù)中調(diào)用可以被重寫的方法

一般來說在構(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。

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

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

同樣的,我們在定義clone方法的時(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)邏輯變得混亂。不推薦這樣使用。

重寫equals()方法

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

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

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

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

  • reflexive反射性

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

  • symmetric對稱性

對于一個(gè)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沒有發(fā)生任何變化,那么a.equals(b)的結(jié)果也不能變。

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

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

hashCode和equals

hashCode是Object中定義的一個(gè)native方法:

@HotSpotIntrinsicCandidate
    public native int hashCode();

根據(jù)Oracle的建議,如果兩個(gè)對象的equals方法返回的結(jié)果是true,那么這兩個(gè)對象的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) {

        HashMap<Girl,Integer> hashMap= 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è)對象,最后導(dǎo)致native方法中兩個(gè)不同對象的hashCode是不一樣的。

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

public int hashCode() {
        return age;
    }

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

compareTo方法的實(shí)現(xiàn)

我們在實(shí)現(xiàn)可比較類的時(shí)候,通常需要實(shí)現(xiàn)Comparable接口。Comparable接口定義了一個(gè)compareTo方法,用來進(jìn)行兩個(gè)對象的比較。

我們在實(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í),請繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI