Java-基礎(chǔ)-多態(tài)

在繼承關(guān)系中,子類如果定義了一個(gè)與父類方法簽名完全相同的方法难咕,被稱為覆寫(Override)
Person類

class Person {
    public void run() {
        System.out.println("Person.run");
    }
}

Student類

class Student extends Person {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}

Override和Overload不同的是诀姚,如果方法簽名如果不同,就是Overload滥朱,Overload方法是一個(gè)新方法员咽;如果方法簽名相同毒涧,并且返回值也相同,就是Override贝室。

注意:

方法名相同契讲,方法參數(shù)相同,但方法返回值不同滑频,也是不同的方法捡偏。#在Java程序中,出現(xiàn)這種情況峡迷,編譯器會(huì)報(bào)錯(cuò)霹琼。

加上@Override可以讓編譯器幫助檢查是否進(jìn)行了正確的覆寫。希望進(jìn)行覆寫,但是不小心寫錯(cuò)了方法簽名枣申,編譯器會(huì)報(bào)錯(cuò)。
但是@Override不是必需的

多態(tài)

Java的實(shí)例方法調(diào)用是基于運(yùn)行時(shí)的實(shí)際類型的動(dòng)態(tài)調(diào)用看杭,而非變量的聲明類型忠藤。

這個(gè)非常重要的特性在面向?qū)ο缶幊讨蟹Q之為多態(tài)

public class Main {
    public static void main(String[] args) {
        // 給一個(gè)有普通收入、工資收入和享受國務(wù)院特殊津貼的小伙伴算稅:
        Income[] incomes = new Income[] {
            new Income(3000),
            new Salary(7500),
            new StateCouncilSpecialAllowance(15000)
        };
        System.out.println(totalTax(incomes));
    }

    public static double totalTax(Income... incomes) {
        double total = 0;
        for (Income income: incomes) {
            total = total + income.getTax();
        }
        return total;
    }
}

class Income {
    protected double income;

    public Income(double income) {
        this.income = income;
    }

    public double getTax() {
        return income * 0.1; // 稅率10%
    }
}

class Salary extends Income {
    public Salary(double income) {
        super(income);
    }

    @Override
    public double getTax() {
        if (income <= 5000) {
            return 0;
        }
        return (income - 5000) * 0.2;
    }
}

class StateCouncilSpecialAllowance extends Income {
    public StateCouncilSpecialAllowance(double income) {
        super(income);
    }

    @Override
    public double getTax() {
        return 0;
    }
}

結(jié)果:800

覆寫Object方法

因?yàn)樗械腸lass最終都繼承自O(shè)bject楼雹,而Object定義了幾個(gè)重要的方法:

1.toString():把instance輸出為String模孩;
2.equals():判斷兩個(gè)instance是否邏輯相等;
3.hashCode():計(jì)算一個(gè)instance的哈希值贮缅。

在必要的情況下榨咐,我們可以覆寫Object的這幾個(gè)方法。例如

class Person {
    ...
    // 顯示更有意義的字符串:
    @Override
    public String toString() {
        return "Person:name=" + name;
    }

    // 比較是否相等:
    @Override
    public boolean equals(Object o) {
        // 當(dāng)且僅當(dāng)o為Person類型:
        if (o instanceof Person) {
            Person p = (Person) o;
            // 并且name字段相同時(shí)谴供,返回true:
            return this.name.equals(p.name);
        }
        return false;
    }

    // 計(jì)算hash:
    @Override
    public int hashCode() {
        return this.name.hashCode();
    }
}

調(diào)用super

在子類的覆寫方法中块茁,如果要調(diào)用父類的被覆寫的方法,可以通過super來調(diào)用桂肌。

class Person {
    protected String name;
    public String hello() {
        return "Hello, " + name;
    }
}

Student extends Person {
    @Override
    public String hello() {
        // 調(diào)用父類的hello()方法:
        return super.hello() + "!";
    }
}

final

繼承可以允許子類覆寫父類的方法数焊。如果一個(gè)父類不允許子類對(duì)它的某個(gè)方法進(jìn)行覆寫,可以把該方法標(biāo)記為final崎场。用final修飾的方法不能被Override:

class Person {
    protected String name;
    public final String hello() {
        return "Hello, " + name;
    }
}

Student extends Person {
    // compile error: 不允許覆寫
    @Override
    public String hello() {
    }
}
如果一個(gè)類不希望任何其他類繼承自它佩耳,那么可以把這個(gè)類本身標(biāo)記#為final。用final修飾的類不能被繼承
final class Person {
    protected String name;
}

// compile error: 不允許繼承自Person
Student extends Person {
}

對(duì)于一個(gè)類的實(shí)例字段谭跨,同樣可以用final修飾干厚。用final修飾的字段在初始化后不能被修改

class Person {
    public final String name = "Unamed";
}

對(duì)final字段重新賦值會(huì)報(bào)錯(cuò)

Person p = new Person();
p.name = "New Name"; //compile error!

可以在構(gòu)造方法中初始化final字段:

class Person {
    public final String name;
    public Person(String name) {
        this.name = name;
    }
}

總結(jié):

1、子類可以覆寫父類的方法(Override)螃宙,覆寫在子類中改變了父類方法的行為蛮瞄;

2、Java的方法調(diào)用總是作用于運(yùn)行期對(duì)象的實(shí)際類型污呼,這種行為稱為多態(tài)裕坊;

3、final修飾符有多種作用:

4燕酷、final修飾的方法可以阻止被覆寫籍凝;

4、final修飾的class可以阻止被繼承苗缩;

4饵蒂、final修飾的field必須在創(chuàng)建對(duì)象時(shí)初始化,隨后不可修改酱讶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末退盯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌渊迁,老刑警劉巖慰照,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琉朽,居然都是意外死亡毒租,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門箱叁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來墅垮,“玉大人,你說我怎么就攤上這事耕漱∷闵” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵螟够,是天一觀的道長灾梦。 經(jīng)常有香客問我,道長齐鲤,這世上最難降的妖魔是什么斥废? 我笑而不...
    開封第一講書人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮给郊,結(jié)果婚禮上牡肉,老公的妹妹穿的比我還像新娘。我一直安慰自己淆九,他們只是感情好统锤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著炭庙,像睡著了一般饲窿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上焕蹄,一...
    開封第一講書人閱讀 51,727評(píng)論 1 305
  • 那天逾雄,我揣著相機(jī)與錄音,去河邊找鬼腻脏。 笑死鸦泳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的永品。 我是一名探鬼主播做鹰,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鼎姐!你這毒婦竟也來了钾麸?” 一聲冷哼從身側(cè)響起更振,我...
    開封第一講書人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饭尝,沒想到半個(gè)月后肯腕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芋肠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年乎芳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帖池。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吭净,靈堂內(nèi)的尸體忽然破棺而出睡汹,到底是詐尸還是另有隱情,我是刑警寧澤寂殉,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布囚巴,位于F島的核電站,受9級(jí)特大地震影響友扰,放射性物質(zhì)發(fā)生泄漏彤叉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一村怪、第九天 我趴在偏房一處隱蔽的房頂上張望秽浇。 院中可真熱鬧,春花似錦甚负、人聲如沸柬焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斑举。三九已至,卻和暖如春病涨,著一層夾襖步出監(jiān)牢的瞬間富玷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來泰國打工既穆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赎懦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓循衰,卻偏偏與公主長得像铲敛,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子会钝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355