天天看點

Java學習日記day12

Java學習日記day11

内部類:

     一個類中存在另一個類

内部類的分類:

     成員内部類(非靜态内部類) 靜态内部類 局部内部類(匿名内部類)

       内部類的成員方法中調用同名外部類的成員變量:外部類.this.變量名

                         調用同名内部類的成員變量:this.變量名

                             調用方法内的局部變量:直接變量名

成員内部類特點:

可以使用的内部修飾符:public private protected default

1. 内部類中,可以随意調用外部類成員

      2. 外部類中,使用内部類成員是,需要建立内部類對象

      3. 無關類中使用成員内部類

                 A.間接調用 在外部類中的方法建立類的對象

                 b.  直接調用 建立内部類對象

局部内部類[匿名内部類]

    局部變量:

  1. 在方法内部定義的類,隻在方法中有效
  2. 在局部内部類中,使用局部變量,必須是final修飾的
  3. 一次性的類,隻能使用一次
  4. 沒有通路修飾符
  5. 作用:結合抽象類/接口使用

[*匿名内部類]

   作用:實作接口/繼承抽象類

    缺點:一次性使用

    文法: 接口/抽象類 引用名 = new 接口/抽象類(){實作類實作的抽象方法}

    Lambda表達式:特殊用法,需要一個隻有一個抽象方法的接口

        用法:定義一個參數為接口的方法 調用這個方法 例如:

        接口:public interface InterfaceA {

   void doSomething();

}
           
    方法 :public void lambda(InterfaceA Interface){

    Interface.doSomething();

}
           
具體實作
           
lambda(()->{System.out.println("use lambda do something!!!!");});
           

匿名對象: 

    隻能使用一次,隻能調用一次方法(可以在所有類的範圍内适用)

靜态内部類

     靜态内部類不能調用非靜态的成員變量和方法

複習:

面向對象

       類和對象

              類

                     類是抽象的,不真實存在

                     類的結構:class 類名{成員變量,成員方法,構造方法,靜态變量,靜态方法,代碼塊,靜态代碼塊}

                     類的特點:具有相同的屬性和方法

              對象

                     對象是真實存在的,是類的執行個體化

                     建立對象:對象都是通過new建立出來的

                            類名  對象名 = new 類名();

                     使用對象

                            使用變量 :  對象.屬性

                            使用方法 :  對象.方法名()

              類和對象的關系

                     1.先定義/聲明類     ps: class  Student{   }

                     2.再建立類的對象 ->  main方法中建立    ps: Student  stu = new Student

              變量

                     局部變量

                            聲明位置

                                   形參(方法參數中定義的變量)

                                   方法中

                                   代碼塊中

                            初始化

                                   使用前必須初始化,否則通不過編譯,局部變量沒有預設初始值

                            個數

                                   聲明個數

                            JVM記憶體圖中位置:存在棧記憶體中

                            注意:局部變量不能加static,包括protected, private, public這些也不能加。局部變量儲存在棧中。

局部程式設計必須在聲明時初始化。

                     成員變量

                            執行個體變量

                                   聲明位置:類中

                                   初始化

                                          聲明同時初始化

                                          代碼塊中初始化

                                          構造方法中初始化

                                   個數:由對象決定,有幾個對象就有幾個成員變量

                                   JVM記憶體圖中位置:存在于堆記憶體中

                            靜态變量

                                   聲明位置:類中

                                   初始化

                                          在聲明同時初始化

                                          靜态代碼塊中初始化

                                   個數

                                          隻有1個

                                   JVM記憶體圖中位置:存在于方法區中

                            執行個體變量的靜态變量的差別

                                   文法上

                                          靜态變量:前面要加static關鍵詞

                                          執行個體變量:不用加

                                   程式上

                                          靜态變量:屬于類,隻要進行了類加載,就會配置設定空間并使用

                                          執行個體變量:屬于對象,必須建立對象,才會配置設定空間,才能使用這個執行個體變量

              代碼塊

                     靜态代碼塊

                            結構:  static {   }

                            位置:存在類中

                            執行時機:在虛拟機加載類的時候就會進行加載,并且隻執行一次

                            作用:有些代碼需要在項目啟動時就執行的,就需要使用靜态代碼塊

                            比如一個項目啟動需要加載很多配置檔案等資源,就可以都放在靜态代碼塊中。

                     代碼塊

                            結構:   {     }

                            位置:存在類中

                            執行時機:在建立對象的時候執行,每次建立對象都會執行一次

                            作用:提取構造方法中相同部分,并且初始化成員變量,會在構造方法之前執行

              構造方法

                     作用

                            給成員變量初始化

                     文法:修飾符  沒有傳回值類型   類名(參數){  }

                            無參數是無參構造器

                            有參數是有參構造器

                     使用

                            1.對象建立時調用相對應的構造方法

                            2.預設調用無參構造器

                            3.如果指定添加有參構造器,無參構造器就不添加

                            4.建議:什麼情況下都建議手動添加無參構造器,友善調用

                     構造方法和普通方法的差別

                            執行時間不同

                                   構造方法:對象建立時調用相對應的構造構造方法

                                   2.普通方法:隻有被調用時才會執行

              方法

                     普通成員方法

                            文法上:沒有static修飾的方法

                            位置:存在于類中

                            方法的調用:  對象.成員方法

                     靜态成員方法

                            文法上:有static修飾的方法

                            位置:存在于類中

                            方法的調用: 類.靜态方法

                     注意

                            1.靜态方法隻能通路靜态成員(即靜态成員變量和靜态方法)

                            2.普通方法可以通路靜态成員,也可以通路其它普通方法

       繼承

              繼承的概念

                     繼承就是⼦類繼承⽗類的屬性和⾏為,使得⼦類對象具有與⽗類相同的屬性、相同的⾏為。

              繼承的特點

                     1.子類擁有父類中非private的屬性和方法

                     2.子類可以擁有自己的屬性和方法,即子類可以對父類進行擴充

                     3.java中的繼承隻能單繼承,即子類隻能有一個父類

                     4.父類可以有多個子類,并且子類之間沒有直接聯系

                     5.子類可以用自己的方式實作父類方法 - 重寫

              繼承的關鍵字

                     extends  和 implements 繼承類 和實作接口

                     super 和 this 關鍵字

                            this

                                   指目前對象

                                   1.this可以調用自己的成員變量,也可以調用自己的成員方法

                                   2.this可以調用自己的構造方法,this關鍵詞不能省,調用時隻能放在構造方法的第一行,并且不能同時互相調用

                            super

                                   對父類對象的引用 - (在對象内部使用)

                                   1.子類構造方法中一定都會先預設調用父類的無參構造器,使用super關鍵詞調用

                                   2.super()隻能放在構造方法中的第一行

                     final關鍵詞

                            final:表示最終的,不可被改變的

                            final修飾的特點

                                   1.final修飾的類,不能被繼承

                                   2.final修飾的方法,不能被覆寫

                                   3.final修飾的變量,不能被修改 - 變量的值隻能賦一次值,即變為常量

              繼承中的構造器

                     1.子類不能繼承父類中的構造方法

                     2.子類會預設調用父類的無參構造器

                     3.如果父類中隻有,有參構造器,則需要在子類構造器中手動調用父類的有參構造器

              方法的重寫和方法的重載

                     方法的重寫

                            重寫的規則

                                   1.子類中定義的方法, 方法傳回值類型\方法名\參數清單都和父類中定義的方法完全一緻

                                   2.子類重寫方法的通路權限不能比父類中被重寫方法的通路權限低

                                   3.聲明為final的方法不能被重寫

                                   4.構造方法不能被重寫

                                   5.存在父類和子類中,子類重寫父類中相同的方法

                     方法的重載

                            重載的規則

                                   1.重載的隻跟方法名和方法參數有關(參數:個數/順序/類型)

                                   2.重載跟傳回值類型無關

                                   3.存在同一個類中

       封裝

              概念

                     1.封裝戲就是把屬性私有化,不讓外部可以通路

                     2.給外部提供一個公開的方法:get/set方法

              通路修飾符

                     public

                            全部可見

                     protected

                            同一個包下,子類,本類

                     default

                            隻能在本類和同一個包中可以見

                     private

                            本類可見

       多态

              存在的必要條件

                     1.必須有繼承關系存在

                     2.方法重寫

                     3.父類引用指向子類對象(向上造型)

                            例如:   Animal    an    =    new   Dog();

              多态的轉型

                     向上轉型

                            ps:   Animal    an    =    new   Dog();

                            父類型的引用  指向  子類型的對象

                            注意:隻可以調用父類中所聲明的屬性和方法

                     向下轉型

                            ps: Dog d = (Dog)an; ->通過父類執行個體化子類

                            注意:隻有轉換回子類真實類型,才能調用子類獨有的屬性和方法

                            instanceof關鍵詞

                                   作用:防止發生類型轉換異常(ClassCastException)

                                   用法:   if(對象  instanceof  類型){   }

                                   傳回結果:boolean類型

              成員通路特點

                     成員變量:編譯看左邊,運作看左邊

                     成員方法:編譯看左邊,運作看右邊

                     靜态方法:編譯看左邊,運作看左邊

       抽象

              抽象類

                     abstract修飾

                            類

                                   抽象類,不具體的類(沒有包含足夠的資訊來描繪一個具體的對象)

                                   特征

                                          1.抽象類不能被執行個體化,也就是不能new對象,隻能被繼承

                                          2.含有抽象方法的類,一定是抽象類。反之,抽象類中可以沒有抽象方法

                                          3.抽象類可以包含屬性、方法、構造方法,但構造方法不能用來執行個體化對象,隻能被子類調用。

                            方法

                                   抽象方法

                                          特征

                                                 1.隻有方法聲明沒有方法體

                                                 2.抽象方法必須存在抽象類中

                                                 3.子類重寫父類時,必須重寫父類中所有的抽象方法

                                                 4.使用抽象方法時不能使用private修飾,因為抽象方法必須被子類重寫,如果使用了private聲明,則子類無法重寫

                                                 5.abstract隻能用于修飾普通方法,不能用于static方法或構造方法中

                            變量 -> 沒有意義

              接口(interface)

                     定義:接口是一種特殊的抽象類

                     特點

                            1.接口中包含

                                   變量

                                          變量名前面預設添加:public  static final ->靜态常量

                                          聲明的同時初始化

                                   方法

                                          抽象方法

                                                 沒有方法體的方法

                                                 方法前面預設添加:public abstract

                                                 作用:供子類重寫

                                          靜态方法

                                                 有方法體的方法

                                                 使用static修飾,供接口直接調用

                                          預設方法

                                                 有方法體的方法

                                                 使用default修飾,不可省略,供子類調用或子類重寫

                                                 改成預設方法後可以選擇重寫與否

                                                 default修飾方法隻能在接口中使用,标記為普通方法

                                          私有方法

                                                 有方法體的方法

                                                 使用private修飾,供接口中的預設方法或靜态方法調用

                                                        靜态私有

                                                               private  static 修飾

                                                        普通私有

                                                               private 修飾

                            2.接口沒有構造方法,不能被執行個體化

                            3.接口支援多繼承,但接口隻能繼承接口,不能繼承類

                            4.一個類可以同時實作多個接口,使用時必須實作接口中的所有抽象方法,否則該類必須被定義為抽象類

       内部類

              作用:間接解決java中類不能多繼承的問題

              種類

                     成員内部類

                            1.作為成員存在,可以被權限修飾符修飾

                            2.可以調用外部所有資訊

                            3.可以和外部類屬性/方法重名,                                 調用時:外部類名。this。屬性/方法

                     靜态内部類

                            1.作為靜态成員屬性存在,可以被任意權限修飾符修飾

                            2.可以直接調用外部類static相關的屬性和方法

                            3.通路外部類普通屬性和方法,則需要通過new外部類去通路

                     局部内部類

                            1.存在方法之中,隻能在方法中使用,類前不能有通路權限

                            2.局部内部類隻在目前方法中有效

                            3.不能定義static成員,因為在方法結束後,記憶體需要釋放

                            4.局部内部類中可以通路外部類的所有成員

                            2.可以直接通路方法的局部變量,但無法修改,編譯會出錯

                     匿名内部類

                            1.作用:繼承抽象類/實作接口

                            2.沒有類名的内部類,必須在建立時使用new語句來聲明類

                            ps:Outer  o = new Outer(){  重寫 }

                            3.匿名類和局部内部類一樣,存在方法中,可以通路外部類的所有成員。

                            4.匿名類中允許使用非靜态代碼塊進行成員初始化操作

                            5.匿名類的非靜态代碼塊會在父類的構造方法之後被執行