Java面向?qū)ο笾R點整理

不定期更新夕春,歡迎指正

1. 重載污呼、重寫和隱藏

1). 重載(overload):

方法重載就是多個方法名稱相同但是參數(shù)類型或者參數(shù)個數(shù)不同的方法银择,與返回值類型和修飾符無關(guān)

class Test {
    public int test(int a) {
        return a;
    }
    
    public String test(String a) {
        return a;
    }

    public float test(int a, String b) {
        return 0f;
    }

    public float test(String a, int b) {
        return 1.0f;
    }

    String test(float a) {
        return "";
    }

    String test(int a) {//該方法不是重載  
        return "";
    }
}  

前面五個互為重載斑司,第一個和第六個雖然返回值類型不同妙蔗,但參數(shù)相同,所以第一個和第六個參數(shù)不是重載

2). 重寫(override):

子類繼承父類時免猾,子類的方法名稱是辕、參數(shù)類型、參數(shù)個數(shù)與父類完全相同猎提,則認為子類重寫了父類的方法获三。

方法重寫規(guī)則:

  • 參數(shù)列表和原方法完全相同
  • 返回值類型和原方法相同或者為父類返回值類型的子類型
  • 不能比原方法限制更嚴格的訪問級別(舉例:父類方法為public,那么子類不能為protected锨苏、private)
  • 父類方法被定義為final時疙教,則不能被重寫
  • 父類方法被定義為static時,不能被重寫伞租,但是可以重寫聲明一個相同的方法(參考隱藏
  • 不能拋出新的異痴晡剑或比原方法更廣泛的異常(父類拋出IOException,重寫方法不能拋出Exception只能拋出IOException或者IOException子類異常)
3). 隱藏:

隱藏是針對于父類的成員變量和靜態(tài)方法而言的葵诈。子類中聲明了和父類相同的變量名或靜態(tài)方法(方法名相同裸弦、參數(shù)列表相同、返回類型相同)則實現(xiàn)了對父類成員變量和靜態(tài)方法的隱藏作喘,下面舉個例子有助理解:

class A {  
    static int a = 1;  
    static int b = 2;  
    int c = 33;
  
    public static void printA() {  
        System.out.print(a);  
    }  
  
    public static void printB() {  
        System.out.print(b);  
    }  
  
}

class B extends A {  
    static int a = 3;  
    static int b = 4;
    int c = 44;
  
    public static void printB() { 
        System.out.print(b);  
    }  
}

public class Test {  
    public static void main(String[] args) {  
        B.printA();
        B.printB();
        System.out.print(B.a);  
        
        A a = new B();
        B b = new B();

        a.printB();
        b.printB();
        System.out.print(a.c);
        System.out.print(b.c);
    }  
}  

輸出結(jié)果:
1 4 3 2 4 33 44

如果子類中有相同名稱的靜態(tài)方法或變量父類的會被隱藏理疙,如果子類中存在同名的靜態(tài)方法或變量,則會隱藏父類中得靜態(tài)方法或變量泞坦,此時子類調(diào)用的就是子類中自己的靜態(tài)方法或變量窖贤;如果子類中不存在同名的靜態(tài)方法或變量,則會調(diào)用父類中的靜態(tài)方法或變量;父類調(diào)用的始終是其本身的靜態(tài)方法和變量赃梧。

2. 封裝:

封裝是把對象的屬性和操作結(jié)合為一個獨立的整體择吊,隱藏對象內(nèi)部操作的實現(xiàn),用戶只需要通過其對外提供的方法來訪問該對象槽奕,無需知道其內(nèi)部實現(xiàn)細節(jié)几睛。

優(yōu)點:

  • 隱藏內(nèi)部實現(xiàn)細節(jié),提供公共訪問方式
  • 類內(nèi)部可以自由修改不影響其調(diào)用者
  • 減少耦合度粤攒,提高安全性

3. 繼承:

繼承是一個對象獲取另一個對象屬性的過程所森,關(guān)鍵字為extendsimplements

1). IS-A關(guān)系(一個對象所屬于另一個對象):
方式一. 用extends來實現(xiàn)繼承:
public class Animal {
    public void eat() {
        System.out.println("Animal eating...");
    }
}

public class Mammal extends Animal {
    public void eat() {
        System.out.println("Mammal eating...");
    }
}

public class Dog extends Mammal {
    public void eat() {
        System.out.println("Dog eating...");
    }
}
方式二. 用implements來實現(xiàn)繼承:
public interface Animal {
    void eat();
}

public class Mammal extends Animal {
    public void eat() {
        System.out.println("Mammal eating...");
    }
}

public class Dog extends Mammal {
    public void eat() {
        System.out.println("Dog eating...");
    }
}

無論方式一還是方式二夯接,我們都可以用instanceof關(guān)鍵字檢查得出:Mammal是一個Animal(哺乳動物也是動物)焕济;Dog既是一個Mammal,也是一個Animal(狗既是哺乳動物也是動物)盔几。

public class Test {  
     /**
      * instanceof關(guān)鍵字檢查代碼
      */
    public static void main(String[] args) {
        Mammal m = new Mammal();
        Dog d = new Dog();
        System.out.print(m instanceof Animal);
        System.out.print(d instanceof Mammal);
        System.out.print(d instanceof Animal);
    }
}

輸出結(jié)果:
true true true
2). HAS-A關(guān)系(一個對象含有另一個對象的一些屬性):
public class Car{}

public class Speed{}

public class Benz extends Car{
    private Speed sp; 
}

Benz含有Spend屬性晴弃,但Benz不是Spend

4. 多態(tài):

實現(xiàn)多態(tài)的三個必要條件:繼承、重寫逊拍、父類引用指向子類對象上鞠。

1). 向上轉(zhuǎn)型:

我們實例化一個Dog對象可以用 Dog d = new Dog(); 我們也可以用 Animal d = new Dog();,后者就是向上轉(zhuǎn)型(父引用指向子對象)芯丧,上面兩種方式創(chuàng)建出來的對象d芍阎,調(diào)用d.eat();輸出的結(jié)果都是Dog eating...,這就體現(xiàn)出了java得多態(tài)缨恒。向上轉(zhuǎn)型創(chuàng)建的對象會遺失掉和父類不同的方法和變量(不能用來調(diào)用子類特有的方法和變量)谴咸。

2). 舉例說明:
class A {
    public String show(D obj) {
        return ("A and D");
    }

    public String show(A obj) {
        return ("A and A");
    }
}

class B extends A {
    public String show(B obj) {
        return ("B and B");
    }

    public String show(A obj) {
        return ("B and A");
    }
}

class C extends B {}

class D extends B {}

class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        System.out.println(a1.show(b)); //  ①
        System.out.println(a1.show(c)); //  ②
        System.out.println(a1.show(d)); //  ③
        System.out.println(a2.show(b)); //  ④
        System.out.println(a2.show(c)); //  ⑤
        System.out.println(a2.show(d)); //  ⑥
        System.out.println(b.show(b));  //  ⑦
        System.out.println(b.show(c));  //  ⑧
        System.out.println(b.show(d));  //  ⑨
    }
}

輸出結(jié)果:
A and A //  ①
A and A //  ②
A and D //  ③
B and A //  ④
B and A //  ⑤
A and D //  ⑥
B and B //  ⑦
B and B //  ⑧
A and D //  ⑨

前三個比較簡單不容易出錯,看看下面幾個:

  • ④:a2是A的引用指向B對象骗露,向上轉(zhuǎn)型創(chuàng)建的對象會遺失掉和父類不同的方法和變量岭佳,所以a2只能調(diào)用show(D obj)show(A obj)兩個方法萧锉,所以a2.show(b)應(yīng)該調(diào)用show(A obj)方法珊随,B中重寫了該方法,所以運行時JVM會調(diào)用B類中重寫的show(A obj)方法驹暑,所以輸出B and A玫恳;
  • ⑤: 原理同④;
  • ⑥:a2.show(d)應(yīng)該調(diào)用show(D obj)方法优俘,B中沒有重寫該方法所以調(diào)用的為A類中的該方法,所以輸出為A and D;
  • ⑦⑧⑨:b為B類對象掀序,可調(diào)用A類中show(D obj)帆焕、B類中show(B obj)、B類中show(A obj)方法,所以輸出如上叶雹。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末财饥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子折晦,更是在濱河造成了極大的恐慌钥星,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件满着,死亡現(xiàn)場離奇詭異谦炒,居然都是意外死亡,警方通過查閱死者的電腦和手機风喇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門宁改,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魂莫,你說我怎么就攤上這事还蹲。” “怎么了耙考?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵谜喊,是天一觀的道長。 經(jīng)常有香客問我倦始,道長锅论,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任楣号,我火速辦了婚禮最易,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炫狱。我一直安慰自己藻懒,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布视译。 她就那樣靜靜地躺著嬉荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪酷含。 梳的紋絲不亂的頭發(fā)上鄙早,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音椅亚,去河邊找鬼限番。 笑死,一個胖子當(dāng)著我的面吹牛呀舔,可吹牛的內(nèi)容都是我干的弥虐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼霜瘪!你這毒婦竟也來了珠插?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤颖对,失蹤者是張志新(化名)和其女友劉穎捻撑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤底,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡顾患,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了训堆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片描验。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖坑鱼,靈堂內(nèi)的尸體忽然破棺而出膘流,到底是詐尸還是另有隱情,我是刑警寧澤鲁沥,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布呼股,位于F島的核電站,受9級特大地震影響画恰,放射性物質(zhì)發(fā)生泄漏彭谁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一允扇、第九天 我趴在偏房一處隱蔽的房頂上張望缠局。 院中可真熱鬧,春花似錦考润、人聲如沸狭园。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唱矛。三九已至,卻和暖如春井辜,著一層夾襖步出監(jiān)牢的瞬間绎谦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工粥脚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留窃肠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓阿逃,卻偏偏與公主長得像铭拧,于是被迫代替她去往敵國和親赃蛛。 傳聞我的和親對象是個殘疾皇子恃锉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容