黑馬程序員----------面向對象之封裝繼承多態

                             ---------------------- android培訓java培訓、期待與您交流! ----------------------


繼承特點:

        1、提高了代碼的複用性。


        2、讓類與類之間產生了關係。有了這個關係,纔有了多態的特性。


        Java語言中:java只支持單繼承,不支持多繼承。


        因爲多繼承容易帶來安全隱患:當多個父類中定義了相同功能,當功能內容不同時,子類對象不確定要運行哪一個。


        但是java保留這種機制。並用另一種體現形式來完成表示。多實現。


        java支持多層繼承。也就是一個繼承體系。


        如何使用一個繼承體系中的功能:


        1、想要使用體系,先查閱體系父類的描述,因爲父類中定義的是該體系中共性功能。


        2、通過了解共性功能,就可以知道該體系的基本功能。那麼這個體系已經可以基本使用了。


        那麼在具體調用時,爲什麼要創建最子類的對象:


        一是因爲有可能父類不能創建對象。


        二是創建子類對象可以使用更多的功能,包括基本的也包括特有的。


        如果子類中出現非私有的同名成員變量時:


        子類要訪問本類中的變量,用this


        子類要訪問父類中的同名變量,用super。


        this代表的是本類對象的引用。


        super代表的是父類對象的引用。


        重寫(覆蓋):


        當子類出現和父類一模一樣的函數時,當子類對象調用該函數,會運行子類函數的內容。如同父類的函數被


        覆蓋一樣。


        當子類繼承父類,沿襲了父類的功能,到子類中,但是子類雖具備該功能,但是功能的內容卻和父類不一


        致,這時,沒有必要定義新功能,而是使用覆蓋特殊,保留父類的功能定義,並重寫功能內容。


        覆蓋的特點:


        1、子類覆蓋父類,必須保證子類權限大於等於父類權限,纔可以覆蓋,否則編譯失敗。


        2、靜態只能覆蓋靜態。


        3、父類中的私有方法不可以被覆蓋。


        繼承中的構造方法:


        1、子類中所有的構造函數默認都會訪問父類中空參數的構造函數


        2、因爲每一個構造函數的第一行都有一條默認的語句super();


        3、子類會具備父類中的數據,所以要先明確父類是如何對這些數據初始化的。


        4、當父類中沒有空參數的構造函數時,子類的構造函數必須通過this或者super語句指定要訪問的


        構造函數。


         子類的實例化過程:


        1、因爲父類中的數據子類可以直接獲取。所以子類對象在建立時,需要先查看父類是如何對這些數據進行初


        始化的。


        2、所以子類在對象初始化時,要先訪問一下父類中的構造函數。


        3、如果要訪問父類中指定的構造函數,可以通過手動定義super語句的方式來指定。


        4、super語句一定定義在子類構造函數的第一行。


        5、子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數。子類中至少會有一個構造函數


        會訪問父類中的構造函數。


        final關鍵字:


        1、final可以修飾類,方法,變量。


        2、final修飾的類不可以被繼承。


        3、final修飾的方法不可以被覆蓋。


        4、final修飾的變量是一個常量。只能被賦值一次。既可修飾成員變量,也可以修士局部變量。


        5、內部類定義在類中的局部位置上是,只能訪問該局部被final修飾的局部變量。


        抽象類:


        抽象類的特點:


        1、抽象方法一定在抽象類中。


        2、抽象方法和抽象類都必須被abstract關鍵字修飾。


        3、抽象類不可以用new創建對象。因爲調用抽象方法沒意義。


        4、抽象類中的抽象方法要被使用,必須由子類複寫起所有的抽象方法後,建立子類對象調用。如果子


        類只覆蓋了部分抽象方法,那麼該子類還是一個抽象類。


        5、抽象方法不能被static修飾。


        抽象類和一般類沒有太大的不同。該如何描述事物,就如何描述事物,只不過,該事物出現了一些看不懂的


        東西。這些不確定的部分,也是該事物的功能,需要明確出現。但是無法定義主體。通過抽象方法來表示。


         抽象類比一般類多個了抽象函數。就是在類中可以定義抽象方法。抽象類不可以實例化。


        Java代碼  



<span style="font-size:14px;"> abstract class Employee//抽象類  

        {  

            private String name;  

            private String id;  
            private double pay;  
          
            Employee(String name,String id,double pay)  
            {  
                this.name = name;  
                this.id = id;  
                this.pay = pay;  
            }  
              
            public abstract void work();//抽象的工作方法  
          
        }  
          
          
          
        class Manager extends Employee  
        {  
            private int bonus;  
            Manager(String name,String id,double pay,int bonus)  
            {  
                super(name,id,pay);  
                this.bonus = bonus;  
            }  
            public void work()//實現父類的work方法  
            {  
                System.out.println("manager work");  
            }  
        }  
          
        class Pro extends Employee  
        {  
            Pro(String name,String id,double pay)  
            {  
                super(name,id,pay);  
            }  
            public void work()//實現父類的work方法  
            {  
                System.out.println("pro work");  
            }  
        }  </span>

        模板方法:
        
        
        在定義功能時,功能的一部分是確定的,但是有一部分是不確定,而確定的部分在使用不確定的部
        
        
        分,那麼這時就將不確定的部分暴露出去。由該類的子類去完成。
        
        

        Java代碼 


       
<span style="font-size:14px;">abstract class GetTime  
        {  
            public final void getTime()  
            {  
                long start = System.currentTimeMillis();  
          
                runcode();//將要改變的方法抽出作爲一個抽象的方法  
          
                long end = System.currentTimeMillis();  
          
                System.out.println("毫秒:"+(end-start));  
            }  
            public abstract void runcode();//在子類中只要實現這個方法,就可以得出自己想要的結果  
          
        }  
          
          
        class SubTime extends GetTime  
        {  
          
            public void runcode()//實現父類的方法  
            {  
                  
                for(int x=0; x<4000; x++)  
                {  
                    System.out.print(x);  
                }  
            }  
        }  </span>


        
        接口:

       

                接口中的成員修飾符是固定的:

          成員常量:public static final

          成員函數:public abstract


          發現接口中的成員都是public的。


        接口是不可以創建對象的,因爲有抽象方法。


        需要被子類實現,子類對接口中的抽象方法全都覆蓋後,子類纔可以實例化。否則子類是一個抽象類。


        接口可以被類多實現,也是對多繼承不支持的轉換形式。java支持多實現。


        接口與接口之間存在多繼承,但不能在父類中出現同名方法。


        接口和抽象類的區別:


         相同:


        1、都可以在內部定義抽象方法。


        2、通常都在頂層。


        3、都不可以實例化,都需要子類來實現。


         不同點:


        1、抽象類中可以定義抽象方法和非抽象方法,而接口中只能定義抽象方法。


        2、接口的出現可以多實現。抽象類只能單繼承。


         也就是說:接口的出現避免了單繼承的侷限性。


        3、繼承和實現的關係不一致。繼承:is a,實現:like a


        多態:


        1、多態的體現


         父類的引用指向了自己的子類對象。


         父類的引用也可以接收自己的子類對象。


        2、多態的前提


         必須是類與類之間有關係。要麼繼承,要麼實現。


         通常還有一個前提:存在覆蓋。


        3、多態的好處


         多態的出現大大的提高程序的擴展性。


        4、多態的弊端:


         提高了擴展性,但是隻能使用父類的引用訪問父類中的成員。


        在多態中成員函數的特點:


        1、在編譯時期:參閱引用型變量所屬的類中是否有調用的方法。如果有,編譯通過,如果沒有編譯失敗。


        2、在運行時期:參閱對象所屬的類中是否有調用的方法。


        簡單總結就是:成員函數在多態調用時,編譯看左邊,運行看右邊。


        在多態中,成員變量的特點:


        無論編譯和運行,都參考左邊(引用型變量所屬的類)。


        在多態中,靜態成員函數的特點:


        無論編譯和運行,都參考左邊。


        示例:


        Java代碼 


       

abstract class GetTime  
        {  
            public final void getTime()  
            {  
                long start = System.currentTimeMillis();  
          
                runcode();//將要改變的方法抽出作爲一個抽象的方法  
          
                long end = System.currentTimeMillis();  
          
                System.out.println("毫秒:"+(end-start));  
            }  
            public abstract void runcode();//在子類中只要實現這個方法,就可以得出自己想要的結果  
          
        }  
          
          
        class SubTime extends GetTime  
        {  
          
            public void runcode()//實現父類的方法  
            {  
                  
                for(int x=0; x<4000; x++)  
                {  
                    System.out.print(x);  
                }  
            }  
        }  


        內部類:


        訪問特點:

      

          內部類可以直接訪問外部類中的成員,包括私有成員。之所以可以直接訪問外部類中的成員,是因


          爲內部類中持有了一個外部類的引用,格式外部類名.this。

      

   而外部類要訪問內部類中的成員必須要建立內部類的對象。


        訪問格式:


        1,當內部類定義在外部類的成員位置上,而且非私有,可以在外部其他類中。


        可以直接建立內部類對象。


        格式:


         外部類名.內部類名  變量名 = 外部類對象.內部類對象;


         Outer.Inner in = new Outer().new Inner();


        2,當內部類在成員位置上,就可以被成員修飾符所修飾。


         比如,private:將內部類在外部類中進行封裝。


          static:內部類就具備static的特性。


          當內部類被static修飾後,只能直接訪問外部類中的static成員。出現了訪問侷限。


        在外部其他類中,如何直接訪問static內部類的非靜態成員:


          new Outer.Inner().function();


          在外部其他類中,如何直接訪問static內部類的靜態成員:


          Outer.Inner.function();


        當內部類中定義了靜態成員,該內部類必須是static的。當外部類中的靜態方法訪問內部類時,內部類也


        必須是static的 。


        內部類定義在局部時:


        1、不可以被成員修飾符修飾。


        2、可以直接訪問外部類中的成員,因爲還持有外部類中的引用。但是不可以訪問它所在的局部中的變量。只


        能訪問被final修飾的局部變量。


        Java代碼  


     

  class Outer  

        {  

           int x = 3;  
                      void method(final int a)  
            {  
                final int y = 4;  
                class Inner  
                {  
                    void function()  
                    {  
                        System.out.println(y);  
                    }  
                }  
                new Inner().function();  
            }  
        }  


        匿名內部類:

     

        1、匿名內部類其實就是內部類的簡寫格式。

     

        2、定義匿名內部類的前提:內部類必須是繼承一個類或者實現接口。

     

        3、匿名內部類的格式:  new 父類或者接口(){定義子類的內容}


        4、其實匿名內部類就是一個匿名子類對象。而且這個對象有點胖。 可以理解爲帶內容的對象。


        5、匿名內部類中定義的方法最好不要超過3個。

        Java代碼  

     

 

  class Outer  

        {  

           int x = 3;  
                      void method(final int a)  
            {  
                final int y = 4;  
                class Inner  
                {  
                    void function()  
                    {  
                        System.out.println(y);  
                    }  
                }  
                new Inner().function();  
            }  
        }  

                               ---------------------- android培訓java培訓、期待與您交流! ----------------------
發佈了31 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章