面向物件進階第二天
權限修飾符
作用:約束成員變數,構造器,方法等的訪問范圍
自己定義成員(方法,成員變數,構造器等)一般需要滿足如下要求:
-
成員變數一般私有,
-
方法一般公開,
-
如果該成員只希望本類訪問,使用private修飾,
-
如果該成員只希望本類,同一個包下的其他類和不同包下的子類訪問,使用protected修飾,
final關鍵字
final最終的意思
-
final修飾類:類不能被繼承,工具類可以用final修飾,
-
final修飾方法:該方法被稱為最終方法,特點是不能被重寫了, 模板方法可以用final
-
final修飾變數:總規則:有且僅能被賦值一次,
注意:final修飾基本資料型別的變數,其存盤的資料不能改變,final修飾參考型別的變數,其存盤的地址不能改變,但是指向的物件內容可以改變,
常量
-
是什么?
-
public static final 修飾的成員變數,必須有初始化值,執行程序中值不能改變,
-
-
作用:做系統的配置資訊,做資訊標志和分類
-
規范:名稱全部大寫,多個單詞用下劃線連接
-
常量在編譯階段會進行“宏替換”:把使用常量的地方全部替換成真實的字面量
-
// 請在下方聲名一個常量VERSION_NAME,值為"v1.0.0",用于記錄系統的版本名稱, public static final String VERSION_NAME = "v1.0.0";
抽象類
抽象類是什么?abstract修飾的類
抽象方法是什么?abstract修飾的方法,不能寫方法體,
作用:
-
被子類繼承,
-
如果父類知道子類一定要做這件事,但是每個子類做的不一樣,父類可以宣告抽象方法,交給子類重寫來實作,這個類就是抽象類了,
抽象類的特點:
-
類有的成員(成員變數、方法、構造器)抽象類都具備
-
抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
-
一個類繼承了抽象類必須重寫完抽象類的全部抽象方法,否則這個類也必須定義成抽象類,
-
不能用abstract修飾變數、代碼塊、構造器,
-
最重要的特征:得到了抽象方法,失去了創建物件的能力(有得有失)
模板方法設計模式
-
模板方法模式解決了什么問題?
-
提高了代碼的復用性
-
模板方法已經定義了通用結構,模板方法不能確定的部分定義成抽象方法,交給子類實作,因此,使用者只需要關心自己需要實作的功能即可,
-
模板方法模式中的通用結構建議加上final修飾,好處是可以防止子類重寫模板方法,
-
多型
面向物件的三大特征之一:封裝、繼承、多型
含義? 指的是物件有多種形態
-
人型別的物件:學生物件
-
人型別的物件:老師物件
-
人型別的物件:丈夫物件
語法形式:
-
父型別別 變數名稱 = new 子類構造器;
Animal a = new Cat(); -
介面 變數名稱 = new 實作類構造器;
多型的呼叫方式
-
對于方法的呼叫:編譯看左邊,運行看右邊
Animal a = new Cat();
a.run(); -
對于變數的呼叫
-
編譯看左邊,運行也看左邊(注意)
-
-
多型更多用在行為多型
多型的使用前提
1、必須繼承、實作
2、父型別別的變數指向子型別別的物件
Animal a = new Cat();
3、存在方法重寫
Animal a = new Cat();
a.run();
多型的優勢
-
a、多型可以實作解耦合
Animal a = new Dog();
a.run(); -
b、多型下,父型別別作為方法的入參,可以接收一切子類物件,這樣更利于方法的擴展和便利性,
-
注意存在的問題:
-
多型下不能直接訪問子類獨有功能
Animal a = new Dog();
a.lookDoor();
-
多型下型別轉換問題
-
自動型別轉換
-
從子類到父類
Animal a = new Dog();
-
強制型別轉換
-
從父類到子類
-
Animal a = new Dog(); -
必須強制型別轉換,否則報錯的
-
Dog d = (Dog) a; -
注意:
-
Java規定,有繼承/實作關系的類就可以強制轉換,編譯階段不會報錯,但是運行時可能出現型別轉換例外,ClassCastException,
Animal a = new Cat();
Dog d = (Dog)a; -
編譯不出錯,運行時出現型別轉換例外,
-
-
Java建議在進行強制轉換之前先通過instanceof判斷真實資料型別,再強轉
Animal a = new Cat();
if(a instanceof Cat) {
Cat c = (Cat)a;
} -
強制型別轉換解決了什么問題?
-
可以呼叫子類的獨有功能了
-
介面
介面概定義與特點
-
Java提供了一個關鍵字interface,用這個關鍵字我們可以定義出一個特殊的結構:介面,
public interface 介面名 {
// 成員變數(常量)
// 成員方法(抽象方法)
}JDK8之前介面中只能是常量和抽象方法,沒有其他成分了,
介面本質上是一種規范,約束實作介面的類必須具備某種能力,
-
注意:介面不能創建物件;介面是用來被類實作(implements)的,實作介面的類稱為實作類,
修飾符 class 實作類 implements 介面1, 介面2, 介面3 , ... {
} -
一個類可以實作一個或多個介面,實作類實作多個介面,必須重寫完全部介面中的全部抽象方法,否則實作類需要定義成抽象類,
介面與介面的關系:多繼承
-
一個介面可以同時繼承多個介面
注意:實作子介面名的類必須實作后面所有介面中的所有抽象方法,
-
介面多繼承的作用
-
規范合并,整合多個介面為同一個介面,便于子類實作,
-
繼承抽象類的同時實作多個介面
-
類和類的關系
-
單繼承
-
-
類和介面的關系
-
多實作
-
-
因此,我們可以在繼承類的同時,實作1個或多個介面,語法如下:
修飾符 class 實作類 extends 基類名 implements 介面1, 介面2, 介面3 , ... {
}
使用介面的好處
-
彌補了類單繼承的不足,一個類在單繼承的同時還可以實作多個介面,
-
讓程式可以面向介面編程,這樣程式員就可以靈活方便的切換各種業務實作(多型思想),
JDK8開始介面新增的方法
-
默認方法
-
類似之前寫的普通實體方法:必須用default修飾
-
默認會public修飾,需要用介面的實作類的物件來呼叫
default void defaultMethod() {
System.out.println("介面中的默認方法");
}
-
-
靜態方法
-
默認會public修飾,必須static修飾,
-
注意:介面的靜態方法必須用本身的介面名來呼叫,
static void staticMethod() {
System.out.println("介面中的靜態方法");
}
-
-
私有方法
-
必須使用private修飾,從JDK1.9才開始有的,
-
根據是否有static關鍵字修飾,私有方法可以分為非靜態私有方法和靜態私有方法,
-
非靜態私有方法只能在本類中被其他的默認方法或者私有方法訪問,
-
靜態私有方法還能在本類的其他靜態方法中訪問,
private void privateMethod() {
System.out.println("介面中的私有方法");
}
-
使用介面的注意事項
-
介面不能創建物件
-
一個類實作多個介面,多個介面的規范不能沖突
-
一個類實作多個介面,多個介面中有同樣的靜態方法不沖突,
-
一個類繼承了父類,同時又實作了介面,父類中和介面中有同名方法,默認用父類的,
-
一個類實作了多個介面,多個介面中存在同名的默認方法,可以不沖突,這個類重寫該方法即可,
-
一個介面繼承多個介面,是沒有問題的,如果多個介面中存在規范沖突則不能多繼承,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544943.html
標籤:其他

