繼承和抽象類
阿新 • • 發佈:2021-02-07
技術標籤:javaSE
java物件的三大特徵
- 面向物件核心思想:解決問題,先考慮物件
- 封裝
隱藏內部實現細節,對外暴露可訪問的方法 - 繼承
子類繼承父類,擁有父類所有的屬性和方法(特殊除外) - 多型
父類引用子類物件,父類引用呼叫方法,執行的是子類重寫的方法
一. 封裝
隱藏內部實現細節,對外暴露可訪問的方法
1. 類(class)
- 類是什麼?
一類事務的抽象描述
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("一路狂飆");
}
}