面向對象

面向對象

封裝

  1. 是指隱藏對象的屬性和實現(xiàn)細節(jié)竟稳,僅對外提供公共訪問方式。
  2. 提高了代碼的復用性地啰,安全性

通過對象去給成員變量賦值亏吝,可以賦值一些非法的數(shù)據(jù)盏混。

public class Student(){
    public int age;
}
//main
Student s = new Student();
s.age = -1;                 //這是不合理的

所以我們將屬性封裝起來,并讓外界通過我指定的通道訪問和修改我的屬性
用private修飾屬性

private關鍵字:

  • 是一個權限修飾符止喷。

  • 可以修飾成員(成員變量和成員方法)

  • 被private修飾的成員只在本類中才能訪問

      public class Student(){
          private int age;
    
          public int getAge(){
              return this.age弹谁;
          }
          public void setAge(int age){
              if(age>0&&age<120){
                  this.age = age;
              }else{
                  system.out.println("輸入錯誤");
              }
          }
      }
      //main
      Student s = new Student();
      s.age = -1;                 //輸入錯誤
    

繼承

概述

  1. 多個類中存在相同屬性和行為時,將這些內(nèi)容抽取到單獨一個類中沟于,那么多個類無需再定義這些屬性和行為植康,只要繼承那個類即可销睁。
  2. 通過extends關鍵字可以實現(xiàn)類與類的繼承
    class 子類名 extends 父類名 {}
  3. 單獨的這個類稱為父類,基類或者超類睡毒;這多個類可以稱為子類或者派生類檩赢。
  4. 有了繼承以后,我們定義一個類的時候偶房,可以在一個已經(jīng)存在的類的基礎上军浆,還可以定義自己的新成員乒融。

好處

  1. 提高了代碼的復用性

    • 多個類相同的成員可以放到同一個類中
  2. 提高了代碼的維護性

    • 如果功能的代碼需要修改,修改一處即可
  3. 讓類與類之間產(chǎn)生了關系愧捕,是多態(tài)的前提
    其實這也是繼承的一個弊端:類的耦合性很強

     開發(fā)的原則:低耦合申钩,高內(nèi)聚。
         耦合:類與類的關系
         內(nèi)聚:就是自己完成某件事情的能力
    

java繼承的注意

  1. java只支持單繼承邮偎,不支持多繼承禾进。
    一個類只能有一個父類廉涕,不可以有多個父類艇拍。

     class Son extends Futher{} //ok
     class Son extends Futher,Mother{}//error
    
  2. Java支持多層繼承(繼承體系)

     class GrandFuther{}
     class Futher extends GrandFuther{}
     class Son extends Futher{}
    
  3. 子類只能繼承父類所有非私有的成員(成員方法和成員變量)

  4. 子類不能繼承父類的構造方法淑倾,但是可以通過super關鍵字去訪問父類構造方法征椒。

  5. 不要為了部分功能而去繼承

         class A {
             public void method1(){}
             public void method2(){}
         }
         
         class B {
             public void method2(){}
             public void method3(){}
         }
         
         //我們發(fā)現(xiàn)B類中出現(xiàn)了和A類一樣的method2()方法勃救,所以蒙秒,我們就用繼承來體現(xiàn)
         class B extends A {
             public void method3(){}
         }
         這樣其實不好宵统,因為這樣你不但有了method2(),還多了method1()。
         有可能method1()不是你想要的瓢省。
         
     什么時候考慮使用繼承呢?
     繼承其實體現(xiàn)的是一種關系:"is a"痊班。
         Person
             Student
             Teacher
     Student是Person的一種
    
  6. 直接調用屬性名時涤伐,同名屬性的查找順序(就近原則)

    子類方法局部->子類成員->父類成員->找不到報錯(單層繼承情況下)

    同: 屬性 -> this.屬性 -> super.屬性

this&super

不能在static中使用,static屬于類的

  1. 調用成員變量

    • this.成員變量 調用本類的成員變量
    • super.成員變量 調用父類的成員變量
  2. 調用構造方法

    • this(...) 調用本類的構造方法
    • super(...) 調用父類的構造方法
  3. 調用成員方法

    • this.成員方法 調用本類的成員方法
    • super.成員方法 調用父類的成員方法

構造函數(shù)的關系

子類不繼承父類的構造函數(shù)祝迂,可以用super調用

子類中所有的構造方法再不寫super的情況下默認都會訪問父類中空參數(shù)的構造方法

因為子類會繼承父類中的數(shù)據(jù)型雳,可能還會使用父類的數(shù)據(jù)掌动。

所以,子類初始化之前柑晒,一定要先完成父類數(shù)據(jù)的初始化眷射。

注意:子類每一個構造方法的第一條語句默認都是:super()佛掖,即使刪除也有;

當子類沒有構造函數(shù)的時候芥被,系統(tǒng)默認提供一個無參構造方法

public class Fu {       //父類坐榆,提供了有參構造,所有系統(tǒng)不會提供一個無參構造匹中,即沒有無參構造
    private String str = "name";
    private int i = 1;

    public Fu(String str, int i) {
        this.str = str;
        this.i = i;
    }
}
//--------------------
public class Zi extends Fu{//子類沒有提供構造函數(shù)顶捷,系統(tǒng)自動提供一個無參構造屎篱,但是無參構造第一句默認super(),父類沒有重虑,報錯
                        //error:Implicit super constructor Fu() is undefined. Must explicitly invoke another constructor
                        //隱式的父類構造函數(shù)fu()是未定義的堪侯。必須顯式調用另一個構造函數(shù) 
}
//--------------------
public class Zi extends Fu{//子類也無法提供無參構造
    public Zi() {
                        //error:Implicit super constructor Fu() is undefined. Must explicitly invoke another constructor
                        //隱式的父類構造函數(shù)fu()是未定義的伍宦。必須顯式調用另一個構造函數(shù) 
    }
}
  • 子類通過super去顯示調用父類其他的帶參的構造方法
  • 子類通過this去調用本類的其他構造方法
  • 本類其他構造也必須首先訪問了父類構造

一定要注意:

super(…)或者this(….)必須出現(xiàn)在第一條語句
否則,就會有父類數(shù)據(jù)的多次初始化

所以一般建議任何類都提供無參構造

繼承中的方法

子類與父類的方聲明不一樣关贵,一般情況

  • 首先在子類中找
  • 然后在父類中找
  • 如果還是沒有就報錯卖毁。(不考慮多重繼承)

重寫(Override)

子類中出現(xiàn)了和父類中一模一樣的方法聲明,也被稱為方法覆蓋

  • 當子類需要父類的功能炭剪,而功能主體子類有自己特有內(nèi)容時翔脱,可以重寫父類中的方法

注意:

  1. 父類中私有方法不能被重寫(子類寫了相當于自己的創(chuàng)建方法届吁,不算重寫)

  2. 子類重寫父類方法時绿鸣,訪問權限不能更低

  3. 父類靜態(tài)方法潮模,子類也必須通過靜態(tài)方法進行重寫痴施。(不算是重寫,但現(xiàn)象是這樣)

     public class Fu {
         public static void pri() {
             System.out.println("a");
         }
     }
     //----------------------
     public class Zi extends Fu{         //This instance method cannot override the static method from Fu
         public void pri() {
             System.out.println("b");
         }
     }
    

多態(tài)

有繼承關系
有方法重寫(沒有方法重寫的多態(tài)將沒有意義)
有父類引用指向子類對象

多態(tài)中的成員訪問特點:
不能調用調用子類特有的屬性和方法

  1. 成員變量
    • 編譯看左邊锉矢,運行看左邊齿尽。
  2. 構造方法
    • 創(chuàng)建子類對象的時候循头,訪問父類的構造方法炎疆,對父類的數(shù)據(jù)進行初始化。
  3. 成員方法
    • 編譯看左邊全跨,運行看右邊浓若。
  4. 靜態(tài)方法
    • 編譯看左邊蛇数,運行看左邊。(靜態(tài)和類相關碌上,算不上重寫浦徊,所以,訪問還是左邊的)

class Fu {
    public int num = 100;

    public void show() {
        System.out.println("show Fu");
    }
    
    public static void function() {
        System.out.println("function Fu");
    }
}

class Zi extends Fu {
    public int num = 1000;
    public int num2 = 200;

    public void show() {
        System.out.println("show Zi");
    }
    
    public void method() {
        System.out.println("method zi");
    }
    
    public static void function() {
        System.out.println("function Zi");
    }
}

class DuoTaiDemo {
    public static void main(String[] args) {
        //要有父類引用指向子類對象霞丧。
        //父 f =  new 子();
        Fu f = new Zi();
        System.out.println(f.num);
        //System.out.println(f.num2); //num2 cannot be resolved or is not a field(Fu中找不到num2)
        f.show();
        //f.method();   //The method method() is undefined for the type Fu(Fu中找不到method)
        f.function();
    }
}   

好處與弊端

  1. 多態(tài)的好處:
    • 提高了代碼的維護性(繼承保證)
    • 提高了代碼的擴展性(由多態(tài)保證)
  2. 多態(tài)的弊端
    • 不能調用調用子類特有的屬性和方法

向上向下轉型

向上轉型

Fu f = new Zi();

向下轉型:把父類的引用強轉為子類的引用

Zi z = (Zi)f;

多態(tài)繼承中的內(nèi)存圖解

B0iOfer.png

多態(tài)中的對象變化內(nèi)存圖解

  1. 不可以訪問子類的方法
  2. 不可以強轉成其他子類(ClassCastException)
image
//ClassCastException
DuoTaiDemo f1 = new Zi();
DuoTaiDemo f2 = new DuoTaiDemo();
DuoTaiDemo f3 = (Zi2)f1;
DuoTaiDemo f4 = (Zi)f2;
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敷燎,一起剝皮案震驚了整個濱河市硬贯,隨后出現(xiàn)的幾起案子陨收,更是在濱河造成了極大的恐慌,老刑警劉巖拄衰,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饵骨,死亡現(xiàn)場離奇詭異,居然都是意外死亡妖混,警方通過查閱死者的電腦和手機轮洋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門弊予,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人误褪,你說我怎么就攤上這事碾褂。” “怎么了渡八?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵传货,是天一觀的道長。 經(jīng)常有香客問我逮壁,道長粮宛,這世上最難降的妖魔是什么卖宠? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任扛伍,我火速辦了婚禮词裤,結果婚禮上,老公的妹妹穿的比我還像新娘逆航。我一直安慰自己渔肩,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布女揭。 她就那樣靜靜地躺著,像睡著了一般磷仰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灶平,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天逢享,我揣著相機與錄音,去河邊找鬼弓柱。 笑死侧但,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的禀横。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼酿箭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缔御?” 一聲冷哼從身側響起械巡,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎有勾,沒想到半個月后古程,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡雇逞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年塘砸,在試婚紗的時候發(fā)現(xiàn)自己被綠了晤锥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡女轿,死狀恐怖壕翩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情北救,我是刑警寧澤芜抒,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站膛壹,受9級特大地震影響,放射性物質發(fā)生泄漏肩民。R本人自食惡果不足惜链方,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望工窍。 院中可真熱鬧前酿,春花似錦、人聲如沸罢维。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽平窘。三九已至,卻和暖如春瑰艘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背磅叛。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工弊琴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杖爽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓腋寨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親萄窜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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

  • 第四章 面向對象 面向對象思想 面向對象思想的引入前面我們講過數(shù)組键兜,當有多個數(shù)組都需要遍歷時普气,我們可以將遍歷的代碼...
    chongsheng閱讀 548評論 0 0
  • 1 面向對象No6 面向對象 OO Object Oriented 編程時以對象為單元佃延,封裝數(shù)據(jù)和邏輯,以此提...
    征程_Journey閱讀 1,132評論 0 2
  • 什么是對象 1.對象的概念:對特定一個存在事物2.什么是面向對象:以自我為中心對待一個特定事物存在仔沿,需要自己描述出...
    joshul閱讀 688評論 0 1
  • 1.面向對象思想的特點 (1)是一種更符合我們思想習慣的思想(懶人思想于未,我把事情自己不做,交給別人去做) (2)可...
    夢游的沙師弟閱讀 402評論 0 0
  • 關于北京,在我這里它是一個夢想的代名詞脊阴。它曾讓我明白自己太過于天真,卻也告訴我這一切還有很多可能品擎,雖然這可能中間必...
    漢堡是晗寶閱讀 295評論 1 6