java 抽象類 接口 內部類

1.抽象類

1.1 抽象類和抽象方法

      抽象方法定義的格式:

      public abstract 返回值類型方法名(參數);

      抽象類定義的格式:

      abstract class 類名 {

      }

      抽象類和抽象方法必須使用abstract修飾符來定義,有抽象方法的類必須定義爲抽象類,抽象類裏可以沒有抽象方法。抽象類和抽象方法的規則:

     a.抽象類和抽象方法必須使用abstract來修飾,抽象方法不能有方法體;

     b.抽象類不能被實例化,無法使用new關鍵字來調用抽象類的構造器創建抽象類的實例。即使抽象類裏不含抽象方法,這個抽象類也不能創建實例;

     c.抽象類可以包含成員變量方法(普通方法和抽象方法都可以)構造器初始化塊 內部類(接口 枚舉)五種成分。抽象裏不能創建實例,只能當作父類被其他子類繼承。抽象類的構造器不能用於創建實例,主要用於被其子類調用;

     d.含抽象方法的類(包括直接定義一個抽象方法;或繼承了一個抽象父類,但沒有完全實現父類包含的抽象方法;或實現了一個接口,但沒有完全實現接口包含的抽象方法)只能被定義成抽象類。

        Abstract不能用於修飾成員變量,不能用於修飾局部變量,即沒有抽象變量沒有抽象成員變量;abstract也不能用於修飾構造器,沒有抽象構造器,抽象類裏定義的構造器只能是普通的構造器。當使用abstract修飾類時,表明這個類只能被繼承;當時用abstract修飾方法時,表明這個方法必須由子類提供實現(即重寫)。Final修飾的類不能被繼承,final修飾的方法不能被重寫。所以final和abstract永遠不能同時使用。Static和abstract不能同時修飾某個方法,可以同時修飾內部類。

1.2 抽象類的作用

        抽象類是從多個具體類中抽象出來的父類,它具有更高層次的抽象。從多個具有相同特徵的類中抽象出一個抽象類,以這個類爲其子類的模板,從而避免了子類設計的隨意性。抽象類體現的就是模板模式的設計。

2.接口

        抽象類是從多個類中抽象出來的模板,如果將這種抽象進行得更徹底,則可以提煉出一種更加特殊的抽象類——接口。接口裏不能包含普通方法,接口裏所有方法都是抽象方法。

2.1接口的概念

        接口是從多個相似類中抽象出來的規範,接口不提供任何實現。接口體現的是規範和實現分離的設計哲學。接口主要用來定義方法,規定必須具有的某些行爲(方法),其它類如果想擁有次功能,就必須實現該接口。

定義格式:

       [修飾符] interface 接口名 extends 父接口1,父接口2,…{

               零到多個常量的定義

               零到多個抽象方法的定義

               零到多個內部類 接口 枚舉定義

               零到多個默認方法或類方法定義(java8對接口進行了改進,允許接口中定義默認方法,默認方法可以提供方法實現

        }

2.2接口中的成員

        由於接口定義的是一種規範,因此接口裏不能包含構造器和初始化塊定義。接口裏可以包含成員變量(只能是靜態常量)、方法、(只能是抽象實例方法類方法或默認方法)、內部類(包括內部接口枚舉)。

         接口定義的是多個類共同的公共行爲規範,因此接口裏所有的成員,包括常量方法 內部類和內部枚舉都是public訪問權限。定義接口成員時,可以省略訪問控制修飾符,如果指定訪問控制修飾符,則只能使用public訪問控制修飾符。

        1)靜態常量:接口中定義的變量默認以public static final 修飾。

        2)內部類:默認以public static修飾。接口中定義的內部類內部接口 內部枚舉默認都採用publicstatic修飾,不管定義時是否指定這兩個修飾符,系統都會自動使用public static對它們進行修飾。

        3)方法:接口中定義的方法只能是抽象方法類方法或默認方法,如果不是定義默認方法,系統將自動爲普通方法加上abstract修飾符;定義接口裏的普通方法時,不管是否使用public abstract修飾符,接口裏的普通方法總是使用public abstract來修飾。接口裏的方法不能有方法體;但類方法和默認方法必須有方法體。

        4)默認方法:java8允許在接口中定義默認方法,默認方法必須使用default修飾,該方法不能使用static修飾。默認方法總是使用public修飾符,如果開發者沒有指定public,系統會自動爲默認方法添加public修飾符。

2.3接口的特點

      1)沒有構造方法,不能實例化;

      2)接口只能繼承接口,不能繼承類。一個接口可以有多個直接父接口;

      3)接口裏的方法全是抽象的,默認修飾符是public abstract;

      4)接口裏的字段全是靜態常量,默認修飾符public static final;

      5)接口裏的內部類全是靜態的,默認修飾符public static。

2.4接口和抽象類的區別

     相同點:1)都位於繼承的頂端,用於被其它類實現或者繼承

                      2)都不能實例化;

                      3)都可以定義抽象方法,其子類必須重寫這些抽象方法;

     不同點:1)接口沒有構造方法,抽象類有構造方法;

                      2)接口中不能包含初始化塊,抽象類完全可以包含初始化塊

                      3)接口中只能包含抽象方法 靜態方法和默認方法,不能爲普通方法提供方法實現,而抽象類既可以包含普通方法,又可以包含抽象方法;

                      4)一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個接口(彌補了java單繼承的缺點)。

3內部類

3.1內部類概述

  3.1.1什麼是內部類

      將類寫在其它類的內部,可以寫在其它類的成員位置或局部位置,寫在其它類內部的類就稱爲內部類,包含內部類的類被稱爲外部類。

  3.1.2什麼時候使用內部類

       在描述事物時,若一個事物內部還可能包含其它事物,這時就可以使用內部類來描述。

  3.1.3 內部類的分類

         成員內部類和局部內部類

         成員內部類分爲兩種:靜態內部類和非靜態內部類。使用static修飾的成員內部類是靜態內部類,沒有使用static修飾的成員內部類是非靜態內部類。

3.2使用內部類

   3.2.1成員內部類定義格式

         class 外部類 {

                  修飾符 class 內部類 {

                  }

          }

     訪問方式:外部類名.內部類名 變量名 = new 外部類名().new 內部類名();

     3.2.2非靜態內部類

         當在非靜態內部類的方法內訪問某個變量時,系統優先在該方法內查找是否存在該名字的局部變量,如果存在就使用該變量;如果不存在就到該方法所在的內部類中查找是否存在該名字的成員變量,如果存在就使用該成員變量,如果不存在,就到該內部類所在的外部類中查找是否存在該名字的成員變量,如果存在,則使用該成員變量;如果依然不存在,則系統將出現編譯錯誤:提示找不到該變量。

       非靜態內部類的成員變量只在非靜態內部類範圍內可知的,不能被外部類直接使用。如果外部類需要訪問非靜態內部類的成員,則必須顯示創建非靜態內部類對象來調用訪問其實例成員。

       根據靜態成員不能訪問非靜態成員的規則,外部類的靜態方法 靜態代碼塊不能訪問非靜態內部類,包括不能使用非靜態內部類定義變量創建實例等。即,不允許在外部類的靜態成員中直接使用非靜態內部類。

       非靜態內部類裏不能有靜態方法 靜態成員變量 靜態初始化塊。

  3.2.3靜態內部類

       如果使用static來修飾一個內部類,則這個類屬於外部類本身,而不屬於外部類的某個對象。因此使用static修飾的內部類被稱爲類內部類(靜態內部類)。

       靜態內部類可以包含靜態成員,也可以包含非靜態成員。根據靜態成員不能訪問非靜態成員的規則,靜態內部類不能訪問外部類的實例成員,只能訪問外部類的類成員。即使是靜態內部類的實例方法也不能訪問外部類的實例成員,只能訪問外部類的靜態成員。

3.3 局部內部類

       如果把一個內部類放在方法裏定義,則這個內部類就是一個局部內部類,局部內部類僅在該方法裏有效。由於局部內部類不能在外部類的方法以外的地方使用,因此局部內部類不能使用訪問控制修飾符和static修飾符修飾。

       局部內部類定義格式:

       class 外部類 {

             修飾符 返回值類型 方法名(參數) {

                   class 內部類 {

                   }

             }

        }

訪問方式:在外部類方法中,創建內部類對象,進行訪問

4.匿名內部類

      匿名內部類適合創建只需要使用一次的類

      定義格式:

       new 實現接口()|父類構造器(實參列表){

               //匿名內部類的類體

       }

       匿名內部類必須繼承一個父類,或實現一個接口,但最多隻能繼承一個父類或實現一個接口。

       匿名內部類規則:

      1)匿名內部類不能是抽象類,因爲系統在創建匿名內部類時,會立即創建匿名內部類的對象。因此不能將匿名內部類定義成抽象類。

      2)匿名內部類不能定義構造器。由於匿名內部類沒有類名,所以無法定義構造器。但匿名內部類可以定義初始化塊,可以通過實例初始化塊來完成構造器需要完成的事情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章