面向對象

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

 

面向對象

1 面向對象概念

2 類與對象的關係

3 封裝

4 構造函數

5this關鍵字

6static關鍵字

7 單例設計模式

 

1.面向對象概念

        面向對象就是把多個功能封裝到一個對象中,通過調用該對象獲取這些功能,稱爲面向對象。

    面向對象和麪向過程的理解:

        面向對象是相對面向過程而言。

       面向對象和麪向過程都是一種思想。

       面向過程

             強調的是功能行爲。

       面向對象

             將功能封裝進對象,強調具備了功能的對象。

             面向對象是基於面向過程的。

       事例:人具有走,吃飯功能等等。這些功能都需要人來完成的,那麼就將這些功能封裝進人這個對象中,我們只要調用人這個對象,通過人就能使用這些功能。

 

       開發的過程:其實就是不斷的創建對象,使用對象,指揮對象做事情。

       設計的過程:其實就是在管理和維護對象之間的關係。

 

       面向對象的特徵:封裝(encapsulation)、繼承(inheritance)和多態(polymorphism)

 

2 .類與對象的關係

       使用計算機語言就是不斷的在描述現實生活中的事物。

       java中描述事物通過類的形式體現,類是一組相同屬性行爲的對象的抽象。

       對象即是該類事物實實在在存在的個體。

       舉例:人就是一個類(是把每一個相同屬性行爲的對象進行抽取)人的屬性:姓名,年齡,身高,體重等,人的行爲:吃飯,睡覺,說話,,跳等。

       而我們就是對象(是實實在在存在的個體),具體每個人叫什麼名字,年齡多大,身高多高,體重多重等,吃飯怎麼吃,睡覺怎麼睡,說話怎麼說等。

       描述任意一類事物就是在描述他的屬性和行爲。

 

      類的定義:

             生活中描述事物無非就是描述事物的屬性行爲。如:人有身高,體重等屬性,有說話,打球等行爲。

             Java中用類class來描述事物也是如此。

             屬性:對應類中的成員變量。

             行爲:對應類中的成員函數。

             定義類其實在定義類中的成員(成員變量和成員函數)

 

      成員變量和局部變量的區別:

       1.作用範圍。

             成員變量:定義在類中,作用於整個類。

             局部變量:只在它所屬的局部大括號中有效。比如函數上的參數,函數中的變量,語句中的變量。

             public void function(int x){//x,y,z都是局部變量。

                    int y = 1;

                    for(int z=1; z<3; x++){

                    }      //當循環結束時,z在內存中釋放。當function函數執行完畢,xy在內存中釋放。

             }

       2.存儲情況。

             成員變量:存儲在堆內存中,隨着對象的存在而存在。當對象變成垃圾被回收時,該該對象中的成員變量會消失。

             局部變量:存儲在棧內存中,當方法被調用,或者語句被執行的時候,才存在。

             當方法運行完畢,或者語句運行完畢時,局部會被自動釋放。所以成員變量也稱之爲實例(對象)變量.

       3.初始化情況。

             成員變量:在堆內存中有默認初始化值。

             局部變量:必須手動初始化後,纔可以被使用。

 

      匿名對象:

             所謂的匿名對象,就是創建對象的時候沒有給對象起名字就直接使用。

                  使用方式:

                  1)使用方式一:當對對象的方法只調用一次時,可以使用匿名對象來完成,這樣寫比較簡化。

                   如果對一個對象進行多個成員調用,必須給這個對象起個名字

                  2)使用方式二:可以給匿名對象作爲實際參數進行傳遞,從而可以不用在main方法中創建一個變量,提高了編程效率,減少了代碼書寫。

                 但是這個對象實體在方法結束後,垃圾回收機制會將其作爲垃圾回收。而非匿名對象則不同,當不使用了,會在某一時刻被回收,或是隨着主函數的結束而被回收。

                  匿名對象常見錯誤理解:

                  如:

                  1new Car().num = 8; 

                  2 new Car().color = "red";

                  3new Car().run();       //假設有run方法能調用numcolor屬性

                  new三次就是三個匿名對象。3:方法打印出來的不是12所定義的屬性。因爲三者沒有關係。屬於三個對象了

 

3.封裝

       封裝:是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。

       好處:將變化隔離,便於使用,提高重用性,提高安全性。

       封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法對其訪問。

 

      1.private :私有,權限修飾符:用於修飾類中的成員(成員變量,成員函數)

             私有隻在本類中有效。

             當成員私有後,提高了安全性。但是訪問權限降低了。這時可以通過對外提供公有方法的形式對其進行訪問。

              好處:可以在方法中對成員變量的訪問進行控制。

              注意:私有僅僅是封裝的一種體現形式而已。

             常用之一:

                    將成員變量私有化,對外提供對應的setget方法對其進行訪問。提高對數據訪問的安全性。

 

      2.構造函數:

             構造函數的特點:

                    1.構造方法的方法名必須與類名相同。

                    2.構造方法沒有返回類型,也不能定義爲void,在方法名前面不聲明方法類型。不用寫return語句。

                    3.構造方法不能由編程人員調用,而要系統調用。

                    4.一個類可以定義多個構造方法,也就是構造方法可以重載,以參數的個數,類型,或排列順序區分。

                    5.構造函數細節:如果在定義類時沒有定義構造方法,則編譯系統會自動插入一個無參數的默認構造器,這個構造器不執行任何代碼。

                    6.作用:構造方法的主要作用是完成對象的初始化工作,它能夠把定義對象   時的參數傳給對象的域。

 

      構造函數和一般函數的區別:

             1.從功能上的區別:

                    構造函數是給對象初始化的。

                    一般函數是因爲對象需要滿足某種功能定義的。

             2.從執行上的區別:

                    構造函數,是對象創建的時候被執行,不用調用。

                    一般函數是什麼時候調用,就什麼時候執行,不調用就永遠不執行。

 

       構造代碼塊:

        作用:給對象進行初始化。

        對象一建立就運行,而且優先於構造函數執行。

        和構造函數的區別:

              構造代碼塊是給所有對象進行統一初始化,而構造函數是給對應的對象初始化。

        構造代碼塊中定義的是不同對象共性的初始化內容。

        下面就是構造代碼塊:

        {

              System.out.println("personcode run");

              cry();

        }

 

      3.局部代碼塊:

             public void method(){

                    int x = 4;

                    System.out.println("x="+x);

              }

             這種寫法開發並不常見,但是面試可能會出現,它的作用就是可以限定變量的生命週期.

 

      4.this關鍵字:

             1.Java關鍵字this只能用於方法方法體內。

             2.當一個對象創建後,Java虛擬機(JVM)就會給這個對象分配一個引用自身的指針,這個指針的名字就是this

             3.this只能在類中的非靜態方法中使用,靜態方法和靜態的代碼塊中絕對不能出現this,並且this只和特定的對象關聯,而不和類關聯,同一個類的不同對象有不同的this

             簡言之,哪個對象調用this所在的函數,this就代表哪個對象。

 

       this關鍵字的應用:

              第一、函數參數或者函數中的局部變量和成員變量同名的情況下,成員變量被屏蔽,此時要訪問成員變量則需要用“this.成員變量名的方式來引用成員變量。當然,在沒有同名的情況下,可以直接用成員變量的名字,而不用this,用了也不爲錯.

             第二、在函數中,需要引用該函數所屬類的當前對象時候,直接用this//比較兩個人的年齡。

              第三、注意,如果我們想在一個構造函數中對另一個構造函數進行調用的時候,不能在其構造函數中直接類名(參數)這樣調用,而是通過this調用。         

             另一個構造方法,用法是this(參數列表),這個僅僅在類的構造方法中,別的地方不能這麼用。這叫this語句。

             其實這些用法總結都是從對“this是指向對象本身的一個指針這句話的更深入的理解而來的,死記不然容易忘記而且容易搞錯,要理解!

 

       5.static 關鍵字:

             1static關鍵字:static 是一個修飾符,用於修飾成員(成員變量、成員方法)。

             2、當成員被靜態修飾後,就多了一種調用方式,除了可以被對象調用外,還可以直接被類名調用。格式:類名.靜態成員。

             3static特點:

                    <1> 隨着類的加載而加載。 也就是說:靜態會隨着類的消失而消失,說明它生命週期最長。

                    <2> 優先於對象存在 。明確一點:靜態先存在對象後存在。

                    <3> 被所有對象共享。

                    <4> 可以被類名所調用。

             4、實例變量和類變量的區別:

                    <1> 存在位置:

                            靜態變量隨着類的加載而存在於方法區中。

                            實例變量隨着對象的建立而存在於堆內存中。

                    <2> 生命週期:

                                   靜態變量的生命週期最長,隨着類的消失而消失。

                           實例變量的生命週期隨着對象的消失而消失。

                    <3> 所屬不同:

                           靜態變量也稱之爲類變量,所屬於整個類,被整個類所共享。

                           實例變量是對象的特有數據,所屬於對象。

             5、靜態使用注意事項:

                    <1> 靜態方法只能訪問靜態成員。

                           非靜態方法既可以訪問靜態也可以訪問非靜態。

                    <2> 靜態方法中不可以定義this,super關鍵字。

                                  因爲靜態優先於對象存在。所以靜態方法中不可以出現this

                    <3> 主函數是靜態的。

             6、靜態的利弊端:          

                    利處 <1>對對象的共享數據盡享單獨空間的存儲,節省空間,沒有必要每一個對象都存儲一份。

                                      <2>可以直接被類名調用。

                    弊端 <1>生命週期過長。

                                      <2> 訪問出現侷限性。(靜態雖好,但只能訪問靜態)

 

      6.主函數:

             1、定義:是一個特殊的函數,作爲程序入口,可以被jvm調用。

             2、涵義:

                    public: 代表着該函數的訪問權限是最大的。

                    static: 代表主函數隨着類的加載就已經存在了。

                    void: 主函數沒有具體的返回值。

                    main:不是關鍵字,但是是一個特殊的單詞,可以被jvm識別。

                    (String[] args):函數的參數,參數類型是一個數組,該數組的元素是字符串。字符串類型數組。(arguments)

             3、主函數是固定格式的,被jvm識別。jvm在調用主函數時,傳入的是new String[0];這裏的0代表的是0個元素。

 

       什麼時候使用靜態?

             要從兩方面下手:因爲靜態修飾的內容有成員變量和函數。

       什麼時候定義靜態變量(類變量)呢?

             當對象中出現共享數據時,該數據被靜態所修飾。對象中的特有數據要定義成非靜態存在於堆內存中。

       什麼時候定義靜態函數呢?

             當功能內部沒有訪問到非靜態數據(對象的特有數據),那麼該功能可以定義成靜態的。

 

       靜態的應用:工具類

       文檔註釋:

       javadoc-d(指定文檔存儲的位置如果寫.代表當前目錄,也可以定義一個文件夾)

       -author(提取作者內容)

       -version(提取版本內容)

       javadoc-d 指定的文件目錄-author -version ArrayTool.java

 

       <1>每一個應用程序中都有共性的功能,可以將這些功能進行抽取,獨立封裝,以便複用。

       <2>將方法都靜態後,可以方便於使用,但是該類還是可以被其他程序建立對象。

            爲了更嚴謹,強制讓該類不能建立對象,可以通過將構造函數私有化完成(private)。

 

      靜態代碼塊:

        格式:

        static{

              靜態代碼塊中的執行語句。

        }

        特點:隨着類的加載而執行,只執行一次,並優先於主函數。用於給類進行初始化的。

 

      局部代碼塊,構造代碼塊,靜態代碼塊:

             1、局部代碼塊:

                    作用:控制變量的生命週期。

                    在程序中,當我們已經使用完 x後,並且在接下來的代碼中,不會再用到x,那麼就沒必要讓x在內存中佔用空間了,這用情況下,可以             使用局部代碼塊,將x及其所設計到的區域封裝爲局部代碼塊,他們在程序執行中順序不變,只是在執行完成後消失。

             2、構造代碼塊:

                    作用:它可以給所有對象進行初始化。

                    存在於:類中。

                    當類中的構造方法以重載的形式存在時,並且有共同成員變量或共同的方法時,可以通過構造代碼塊對其進行初始化;這樣可以減少代             碼的重複!

             3、靜態代碼塊:

                    作用:給類進行初始化。

                    當類中的方法都被靜態了化,並且構造方法被private了,這是我們不能,在將這個類實例化,然而又想讓類增加一些屬性,就可以使用             靜態代碼塊。

 

      靜態代碼塊和構造代碼塊:

             相同點:都是在JVM加載類時且在構造方法執行之前執行,在類中都可以定義多個, 一般在代碼塊中對一些static變量進行賦值。

             不同點:靜態代碼塊在非靜態代碼塊之前執行(靜態代碼塊—>非靜態代碼塊—>構造方法)。靜態代碼塊只在第一次new執行一次,之後不再  執行,而非靜態代碼塊在每new一次就執行一次。

非靜態代碼塊可在普通方法中定義(不過作用不大);而靜態代碼塊不行。

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------

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