java 之 面向對象(二)

繼承概述

繼承概述
    多個類中存在相同屬性和行爲時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行爲,只要繼承那個類即可。
通過extends關鍵字可以實現類與類的繼承
    class 子類名 extends 父類名 {}  
單獨的這個類稱爲父類,基類或者超類;這多個類可以稱爲子類或者派生類。
有了繼承以後,我們定義一個類的時候,可以在一個已經存在的類的基礎上,還可以定義自己的新成員。

繼承的好處

提高了代碼的複用性
多個類相同的成員可以放到同一個類中
提高了代碼的維護性
如果功能的代碼需要修改,修改一處即可
讓類與類之間產生了關係,是多態的前提
其實這也是繼承的一個弊端:類的耦合性很強

Java中繼承的特點

Java只支持單繼承,不支持多繼承。
    一個類只能有一個父類,不可以有多個父類。
    class SubDemo extends Demo{} //ok
    class SubDemo extends Demo1,Demo2...//error
Java支持多層繼承(繼承體系)
    class A{}
    class B extends A{}
    class C extends B{}

Java中繼承的注意事項

子類只能繼承父類所有非私有的成員(成員方法和成員變量)
    其實這也體現了繼承的另一個弊端:打破了封裝性
子類不能繼承父類的構造方法,但是可以通過super(後面講)關鍵字去訪問父類構造方法。
不要爲了部分功能而去繼承

繼承中成員變量的關係

在子類方法中訪問一個變量
    首先在子類局部範圍找
    然後在子類成員範圍找
    最後在父類成員範圍找(肯定不能訪問到父類局部範圍)
    如果還是沒有就報錯。(不考慮父親的父親…)

super關鍵字

super的用法和this很像
    this代表本類對應的引用。
    super代表父類存儲空間的標識(可以理解爲父類引用)
用法(this和super均可如下使用)
    訪問成員變量
    this.成員變量       super.成員變量
訪問構造方法
    this(…)     super(…)
訪問成員方法
    this.成員方法() super.成員方法()

繼承中構造方法的關係

子類中所有的構造方法默認都會訪問父類中空參數的構造方法
如何父類中沒有構造方法,該怎麼辦呢?
    子類通過super去顯示調用父類其他的帶參的構造方法
    子類通過this去調用本類的其他構造方法
        本類其他構造也必須首先訪問了父類構造
一定要注意:
    super(…)或者this(….)必須出現在第一條語句山
    否則,就會有父類數據的多次初始化

繼承中成員方法的關係

方法重寫概述
    子類中出現了和父類中一模一樣的方法聲明,也被稱爲方法覆蓋,方法複寫。
使用特點:
    如果方法名不同,就調用對應的方法
    如果方法名相同,最終使用的是子類自己的
方法重寫的應用:
    當子類需要父類的功能,而功能主體子類有自己特有內容時,可以重寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容

方法重寫的注意事項
    父類中私有方法不能被重寫
    子類重寫父類方法時,訪問權限不能更低
    父類靜態方法,子類也必須通過靜態方法進行重寫

final關鍵字

final關鍵字是最終的意思,可以修飾類,成員變量,成員方法。
修飾類,類不能被繼承
修飾變量,變量就變成了常量,只能被賦值一次
修飾方法,方法不能被重寫

final關鍵字面試題
    final修飾局部變量
        在方法內部,該變量不可以被改變
        在方法聲明上,分別演示基本類型和引用類型作爲參數的情況
            基本類型,是值不能被改變
            引用類型,是地址值不能被改變
final修飾變量的初始化時機
    在對象構造完畢前即可

多態概述

多態概述
某一個事物,在不同時刻表現出來的不同狀態。
舉例:
    貓可以是貓的類型。貓 m = new 貓();
    同時貓也是動物的一種,也可以把貓稱爲動物。
    動物 d = new 貓();
    在舉一個例子:水在不同時刻的狀態
多態前提和體現
    有繼承關係   
    有方法重寫   
    有父類引用指向子類對象

多態案例及成員訪問特點

多態案例
    按照前提寫一個多態的案例
成員訪問特點
    成員變量
        編譯看左邊,運行看左邊
成員方法
    編譯看左邊,運行看右邊
靜態方法
    編譯看左邊,運行看左邊
    所以前面我說靜態方法不能算方法的重寫

多態的好處和弊端

多態的好處
    提高了程序的維護性(由繼承保證)
    提高了程序的擴展性(由多態保證)
多態的弊端
    不能訪問子類特有功能
    那麼我們如何才能訪問子類的特有功能呢?
    多態中的轉型

多態中的轉型問題

向上轉型
    從子到父
    父類引用指向子類對象
向下轉型
    從父到子
    父類引用轉爲子類對象

抽象類特點

抽象類特點
    抽象類和抽象方法必須用abstract關鍵字修飾
格式
    abstract class 類名 {}
    public abstract void eat();
抽象類不一定有抽象方法,有抽象方法的類一定是抽象類
抽象類不能實例化
    那麼,抽象類如何實例化呢?
    按照多態的方式,由具體的子類實例化。其實這也是多態的一種,抽象類多態。
抽象類的子類
    要麼是抽象類
    要麼重寫抽象類中的所有抽象方法

抽象類的成員特點

成員變量
    可以是變量
    也可以是常量
構造方法
    有構造方法,但是不能實例化
    那麼,構造方法的作用是什麼呢?
    用於子類訪問父類數據的初始化
成員方法
    可以有抽象方法 限定子類必須完成某些動作
    也可以有非抽象方法 提高代碼服用性

接口特點

接口特點
    接口用關鍵字interface表示
    格式:interface 接口名 {}
類實現接口用implements表示
    格式:class 類名 implements 接口名 {}
接口不能實例化
    那麼,接口如何實例化呢?
    按照多態的方式,由具體的子類實例化。其實這也是多態的一種,接口多態。
接口的子類
    要麼是抽象類
    要麼重寫接口中的所有抽象方法

接口成員特點

成員變量
    只能是常量
    默認修飾符 public static final
構造方法
    沒有,因爲接口主要是擴展功能的,而沒有具體存在
成員方法
    只能是抽象方法
    默認修飾符 public abstract

類與類,類與接口以及接口與接口的關係

類與類
    繼承關係,只能單繼承,但是可以多層繼承
類與接口
    實現關係,可以單實現,也可以多實現。還可以在繼承一個類的同時實現多個接口
接口與接口
    繼承關係,可以單繼承,也可以多繼承

抽象類和接口的區別

成員區別
    抽象類 變量,常量;有抽象方法;抽象方法,非抽象方法
    接口 常量;抽象方法
關係區別
    類與類 繼承,單繼承
    類與接口 實現,單實現,多實現
    接口與接口 繼承,單繼承,多繼承
設計理念區別
    抽象類 被繼承體現的是:”is a”的關係。共性功能
    接口 被實現體現的是:”like a”的關係。擴展功能

形式參數和返回值問題

形式參數
    基本類型
    引用類型
返回值類型
    基本類型
    引用類型

包的概述
    其實就是文件夾
    作用:對類進行分類管理
包的劃分:
    舉例:
    學生的增加,刪除,修改,查詢
    老師的增加,刪除,修改,查詢
    以及以後可能出現的其他的類的增加,刪除,修改,查詢
    基本的劃分:按照模塊和功能分。
    高級的劃分:就業班做項目的時候你就能看到了

包的定義及注意事項

定義包的格式
    package 包名;
    多級包用.分開即可
注意事項:
    package語句必須是程序的第一條可執行的代碼
    package語句在一個java文件中只能有一個
    如果沒有package,默認表示無包名

帶包的類的編譯和運行

手動式
    a:javac編譯當前類文件。
    b:手動建立包對應的文件夾。
    c:把a步驟的class文件放到b步驟的最終文件夾下。
    d:通過java命令執行。注意了:需要帶包名稱的執行
    java cn.itcast.HelloWorld
自動式
    a:javac編譯的時候帶上-d即可
    javac -d . HelloWorld.java
    b:通過java命令執行。和手動式一樣

不同包下類之間的訪問

定義兩個類:Demo,Test。
Demo
    求和方法(sum)
Test
    測試方法(main)

導包

導包概述
    不同包下的類之間的訪問,我們發現,每次使用不同包下的類的時候,都需要加包的全路徑。比較麻煩。這個時候,java就提供了導包的功能。
導包格式
    import 包名;
注意:
    這種方式導入是到類的名稱。
    雖然可以最後寫*,但是不建議。

這裏寫圖片描述

類及其組成可以用的修飾符

類:
    默認,public,final,abstract
    我們自己定義:public居多
成員變量:
    四種權限修飾符均可,final,static
    我們自己定義:private居多
構造方法:
    四種權限修飾符均可,其他不可
    我們自己定義:public 居多
成員方法:
    四種權限修飾符均可,fianl,static,abstract
    我們自己定義:public居多

內部類概述

把類定義在其他類的內部,這個類就被稱爲內部類。
    舉例:在類A中定義了一個類B,類B就是內部類。
內部類的訪問特點:
    內部類可以直接訪問外部類的成員,包括私有。
    外部類要訪問內部類的成員,必須創建對象。

內部類位置

按照內部類在類中定義的位置不同,可以分爲如下兩種格式:
    成員位置(成員內部類)
    局部位置(局部內部類)

成員內部類
    外界如何創建對象
    外部類名.內部類名 對象名 = 外部類對象.內部類對象;

成員內部類

成員內部的常見修飾符
    private 爲了保證數據的安全性
    static 爲了讓數據訪問更方便
    被靜態修飾的成員內部類只能訪問外部類的靜態成員
    內部類被靜態修飾後的方法
    靜態方法    
    非靜態方法

局部內部類

可以直接訪問外部類的成員
可以創建內部類對象,通過對象調用內部類方法,來使用局部內部類功能
局部內部類訪問局部變量的注意事項:
必須被final修飾?
    爲什麼呢?
    因爲局部變量會隨着方法的調用完畢而消失,這個時候,局部對象並沒有立馬從堆內存中消失,還要使用那個變量。爲了讓數據還能繼續被使用,就用fianl修飾,這樣,在堆內存裏面存儲的其實是一個常量值。通過反編譯工具可以看一下

匿名內部類

就是內部類的簡化寫法。
    前提:存在一個類或者接口
    這裏的類可以是具體類也可以是抽象類。
格式:
    new 類名或者接口名() {重寫方法;}
本質:
    是一個繼承了類或者實現了接口的子類匿名對象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章