1. 程式人生 > 其它 >繼承和抽象類

繼承和抽象類

技術標籤:javaSE

java物件的三大特徵

  1. 面向物件核心思想:解決問題,先考慮物件
  2. 封裝
    隱藏內部實現細節,對外暴露可訪問的方法
  3. 繼承
    子類繼承父類,擁有父類所有的屬性和方法(特殊除外)
  4. 多型
    父類引用子類物件,父類引用呼叫方法,執行的是子類重寫的方法

一. 封裝

  隱藏內部實現細節,對外暴露可訪問的方法

1. 類(class)

  1. 類是什麼?
    一類事務的抽象描述
    2)為什麼要有類?
    I .要有物件,必先有類
    II. 物件/例項:一類事物某個實際例子
    3)類中包含什麼?
    I. 成員變數
    II. 成員方法
    III. 構造方法
    IV. 程式碼塊
    V. 內部類

2.構造方法和this

 1. 構造方法
   1). 構造的方法名和類名一致
   2)有個隱式宣告:如果一個類沒有宣告任何構造,回有預設public空參構造
 2. 構造方法的主要作用
   1). 建立物件
   2). 通過構造方法對例項的成員屬性進行賦值 
 3. this關鍵字
   1)this:當前物件(誰呼叫就是誰)
   2)隱式宣告
      I. this本身就是隱式內容
      II. 在類中呼叫本類的成員屬性/方法,預設this呼叫
           (當前方法中存在區域性age變數時,隱式的this會被擦除)

3.匿名物件

   1.含義:沒有名字的物件
   2.匿名物件:沒有給一個變數賦值,而是直接呼叫
   3.匿名物件的特點
     1) 好處:語法簡單
     2) 侷限:因為沒有變數記住匿名物件的地址,所以只能一次性使用

二.繼承

生活中的繼承

  父親有的東西,會被兒女所擁有

java中的繼承

 ##  1.概述:子類繼承父類,擁有父類所有的屬性和方法(除構造/private之外)
 ##  2.語法:
     class A extends B{ //類體}
     1)extends:關鍵字
     2)B是一個類,叫做A的父類/超類/基類(super class)
       A也是一個類,叫做B的子類
     3) 作用:B中的定義屬性/方法,A可以直接使用(除構造/private之外)
 ##  3.繼承的作用:
     0) 概括:提高程式碼的複用性
     1)父類是所有子類的共性抽取
     2)共性內容不需要重複定義,避免程式碼冗餘
 ## 4.子類不能繼承的內容
     1.父類的構造不能被繼承
           0)父類的構造,在子類是不存在的
           1)構造方法名跟類名相同
           2) 構造的主要作用就是建立物件
           3) 注意:子類可以呼叫父類的構造
      2. 父類private修飾的內容也認為不能被繼承
           1) 父類的private修飾的內容,子類是有的,只是不能直接呼叫
           2)子類可以通過父類的非private方法進行間接呼叫    
 ##  5.繼承的細節
            0.java執行時的記憶體
                  ### java程式碼生命週期(從建立到消失整個過程)
                     .java(原始碼)  -->  .class(位元組碼)  --> runtime(執行時)
                                      編譯(compile)       執行
                       硬碟(磁碟 disk)  硬碟            記憶體(memory)
             1. 堆(heap):儲存物件         
             2. 棧(stack):執行方法
                                1)方法執行的時候,要先入棧(進棧)   
                                2)方法執行結束,會彈棧(出棧)
              3. 方法區(method area):儲存位元組碼檔案
              4. 本地方法棧(native method stack):執行本地的方法(c/c++)
              5. 程式計數器                           
 ## java執行,為什麼在記憶體中?
        1.積體電路:由電子元件構成的(開關)0 和 1
            cpu  / 記憶體 / 硬碟
        2. cpu:中央處理器
             計算機的資料管理和運算都在cpu執行
         3. cpu速度最快,記憶體次之,硬碟最慢       
             (資料先從硬碟載入到記憶體中,供cpu使用)  

繼承中成員變數的特點

 1. 父子類中成員變數不同名的情況
     1)父類的成員變數被子類所擁有(繼承,除了private之外)
     2) 子類的成員變數是屬於子類的,父類物件不能呼叫
2. 父子類中成員變數同名的情況
     1)為什麼父類和子類可以擁有同名的成員變數?
            因為在子類物件中,父類的屬性和子類的屬性是分開存放的
      2)this和super
             I this:誰呼叫就是誰
                        先呼叫子類的屬性,後呼叫父類的屬性
             II super:this的父類區域
                             是this的子集

方法重寫

       1.子類擁有跟父類完全一樣的方法,稱之為方法重寫
             1)方法名相同
             2)引數列表相同
             3)返回值相同
         2.方法重寫的作用
             1)父類的方法不適用於子類,子類需要重新定義
              2)父類的方法過於簡單,子類需要增強
                           super.父類的方法
                            子類增強的內容

方法過載和方法重寫

 1. 方法過載(overload)
     1)發生在同一個類中
     2)方法名相同,引數列表不同的方法
             引數個數
              引數順序
              引數型別
   2. 方法重寫(override)
     1) 發生在由繼承關係的兩個類中
     2)在子類中定義與父類完全一致的方法
             方法名
             引數列表
             返回值

繼承中構造方法的特點

         # 原則:子類必須呼叫到父類的構造方法
               1.構造方法不可被繼承
               2.子類呼叫父類的構造方法的語法:
                        super(引數列表)
                        子類呼叫父類的構造,必須在子類的構造中
                 3. 子類為什麼要呼叫父類的構造方法:
                        1)在通過子類構造建立物件的時候,子類構造會呼叫父類的構造
                        2)父類的屬性由父類構造自己賦值,子類的屬性由子類自己賦值,更符合面向物件的封裝

三. this和super關鍵字

    # this和super的含義
      1. this:當前物件(誰呼叫就是誰)
      2. super:this的父類區域
    # this和super在繼承關係中使用
    1. 屬性
        this.屬性:呼叫當前物件的屬性
        super.屬性:呼叫當前物件的父類屬性
     2. 方法
         this.方法:呼叫當前物件的方法
                   如果子類有,先呼叫子類,沒有呼叫父類
          super.方法:呼叫當前物件的父類方法
     3. 構造
               this(引數列表):呼叫本類的構造
               super (引數列表):呼叫父類的構造
           規定:以上兩個語法都必須在構造方法中使用,而且必須在有效程式碼第一行

四. 抽象類

         ## 抽象方法
         1.當我們定義一個類的時候,知道這個類有某方法,但是不知道具體的實現:就有了抽象方法
         2.抽象方法是沒有方法體的方法,在方法宣告中,需要關鍵字abstract
         3.擁有抽象方法的類,必須是抽象類,用abstract修飾
        ## 抽象類
         1.抽象類不能例項化(不能建立物件)
         2.抽象類的主要作用是被其他類所繼承
         3. 一個類B繼承抽象類A,也會擁有A的抽象方法
             1)要麼B宣告為抽象類
             2) 要麼B重寫這些抽象方法
         4.擁有抽象方法的類一定是抽象類,抽象類可以沒有抽象方法
         ## 抽象類存在的意義之一:模板設計模式
          1.設計模式:解決一類問題的固定套路,就是前任總結的最優方法
          2.模板設計模式的案例:
              類:司機
              方法:開車
                         1.啟動:踩離合,點火,掛擋起步
                         2.開車中 style(因為不同的老司機開車的風格不同,所以抽象)
                         3.停火:踩剎車,熄火
              子類:A老司機  B 老司機
                         繼承老司機,只要重寫style方法即可
             3.模板設計模式的好處:
                         固定的內容抽取到父類中,形成一個模板
                         不固定內容抽象化,交給子類去實現                                          
public abstract class Driver{
 //模板
    public void driver(){
      System.out.println("啟動:踩離合,點火,掛擋起步");
      this.style();
      System.out.println("停車:踩剎車,熄火")
    }
    //開車風格
    public abstract void style();
}

class ADriver extends Driver{
    @Override
    public void style() {
        System.out.println("單手漂移");
    }
}
class BDriver extends Driver{
    @Override
    public void style() {
        System.out.println("一路狂飆");
    }
}