Java學習之隨堂筆記系列——day11

昨天內容回顧:
1、繼承中成員變量、成員方法、構造方法的訪問特點
    成員變量訪問特點:就近原則,在方法中,如果有同名的局部變量就是訪問局部變量,如果沒有同名的局部變量就訪問本來同名的成員變量,如果本類沒有
                    同名成員變量就訪問父類同名的成員變量,如果父類也沒有,那麼就編譯報錯。
                    this.變量名:訪問本類成員變量
                    super.變量名:訪問父類成員變量
    成員方法的訪問特點:
         super.方法名(...)訪問父類的方法。
    構造方法的訪問特點:
         1、創建子類對象都會先創建父類對象,初始化父類中的成員變量,因爲子類需要繼承下來,可能會使用到。
         2、在子類構造方法中使用 super(...)可以訪問父類的對應構造方法,但是super(...)只能放在第一行。
2、方法的重寫
    子類中定義了和父類一樣的方法就是方法重寫,也叫方法覆蓋。
3、final和static關鍵字
    final:最終的
        final修飾類:類不能被繼承
        final修飾變量:修飾的變量是常量,不能被重新賦值。
        final修飾方法:不能被重寫。
    static:靜態的
        1、靜態修飾的內容屬於類不屬於某個對象,被所有對象共享,直接通過類名就可以訪問。例如:類名.靜態變量名,類名.靜態方法名()
        2、靜態方法內只能訪問靜態的內容(靜態成員變量和靜態成員方法),訪問非靜態的內容需要先new 對象,然後使用對象調用訪問。

今天內容
1、多態
   1 概念:同一個對象,表現出來的不同形態。代碼中:父類 fu=new 子類();
   2 多態中成員的訪問特點:
        訪問成員變量:編譯看左邊,運行看左邊。輸出的是父類的成員變量值。
        訪問成員方法:編譯看左邊,運行看右邊。執行的是子類重寫的方法,如果子類沒有重寫該方法,執行就是父類中的該方法。
   3、使用多態的好處
      好處:在定義方法時,參數列表中使用父類類型的參數,當調用方法的時候可以傳遞任意子類對象,可以大大簡化代碼書寫,提高程序的擴展性。
        public void useAnimal(Animal a){//Animal a=new Cat();  Animal a=new Dog();  Animal a=new Pig();
            a.eat();
        }
      弊端:不能使用多態方式調用子類特有方法。如果需要調用,那麼只能強制類型轉化成子類對象之後再調用
   4、類型轉換
      /**
       * 飼養員類,操作動物
       */
      public class AnimalOperator {
          public void useAnimal(Animal a) { //Animal a=new Cat(); Animal a=new Dog()
              a.eat();
              //需求:如果這個動物是貓,那麼調用貓的特有方法playGame()
              //難點:如何判斷a是Cat類型,只有當變量a是Cat類型纔可以將a強轉成Cat。
              if(a instanceof Cat){
                  Cat c= (Cat) a;
                  c.playGame();
              }
          }
      }
      注意:如果類型不一致,那麼強制類型轉換就會出現ClassCastException類型轉換異常。
   總結:
        多態的體現形式:父類 對象名=new 子類()  記住!!!
        好處:能夠提高程序的擴展性和靈活性,具體體現着方法的參數定義上。
        弊端:如果需要使用子類特有的方法,那麼就需要強制類型轉換。
        強制類型轉換注意:在轉換執行要進行類型判斷。
2、抽象類
    概念:如果一個類的子類都必須要重寫某個方法,並且該父類中的這個方法不需要具體的實現,那麼父類的這個方法就可以定義成抽象方法,父類就必須是抽象類
    定義格式:使用abstract關鍵字
        public abstract class Animal {
            public int age=10;

            public abstract void eat();
        }
    抽象類的特點:(可以不用記,因爲違反了一條就編譯報錯)
        1、有抽象方法的類一定是抽象類,但是抽象類中不一定有抽象方法。
        2、抽象類必須使用多態創建對象: 抽象類 對象名=new 子類();
        3、抽象類的子類要麼是抽象類要麼重寫所有的抽象方法。
    成員的訪問特點:
        1、抽象類中可以有成員變量、常量、靜態成員變量
        2、抽象類可以有構造方法,創建子類對象的時候會執行父類構造方法,用於初始化父類成員變量。但是不能直接new抽象類。
        3、抽象類可以有抽象的成員方法也可以有非抽象的成員方法。
    總結:
        爲什麼要使用抽象類?
            如果父類中的某些方法不需要具體實現(不需要方法體),並且要求每個子類都要重寫該方法,那麼就可以將該方法定義成抽象方法,
            這個父類就需要定義成抽象類。格式如下:
            public abstract class 類名{
                public abstract void eat();
            }
        定義子類繼承抽象類,以多態的形式創建對象:抽象類 對象名=new 子類();

3、接口
    概念:接口就是用來規定某些類具有的功能(方法)。
    語法:public interface 接口名{

         }
    接口中成員的特點;
        成員變量:接口中的成員變量都是常量,默認省略了public static final;  例如:int num=100;
        構造方法:接口中沒有構造方法
        成員方法:在jdk1.7及以前版本接口中只有抽象方法,但是在1.7版本之後可以有default和static修飾的非抽象方法

    類與接口的關係:
        類與類:繼承關係,類與類只能單繼承,但是可以多層繼承   public class 類名 extends 父類{}   常見
        類與接口:實現關係,類可以實現多個接口  public class 類名 implements 接口1,接口2,...{}  常見
        接口與接口:繼承關係:一個接口可以繼承多個接口  public interface 接口名 extends 接口1,接口2,...{}   很少

        Java中是允許多繼承,但是隻能是接口和接口之間多繼承。

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