第三章 面向?qū)ο螅ㄉ希?/a>

          第三講 面向?qū)ο?br>


          理解面向?qū)ο蟮母拍?/span>

             面向過(guò)程

                在一個(gè)結(jié)構(gòu)體中定義窗口的大小,位置,顏色,背景等屬性,對(duì)窗口操作的函數(shù)與窗口本身的定義沒(méi)有任何關(guān)系,如HideWindow,MoveWindow,MinimizeWindow,這些函數(shù)都需要接受一個(gè)代表要被操作的窗口參數(shù),是一種謂語(yǔ)與賓語(yǔ)的關(guān)系。

              面向?qū)ο?/span>

                定義窗口時(shí),除了要指定在面向過(guò)程中規(guī)定的那些屬性,如大小,位置,顏色,背景等外,還要指定該窗口可能具有的動(dòng)作,如隱藏,移動(dòng),最小化等。這些函數(shù)被調(diào)用時(shí),都是以某個(gè)窗口要隱藏某個(gè)窗口要移動(dòng)的語(yǔ)法格式來(lái)使用的,這是一種主語(yǔ)與謂語(yǔ)的關(guān)系。

              面向?qū)ο蟮娜筇卣?/span>

                    ▂封裝

                    ▂繼承

                    ▂多態(tài)

          類與對(duì)象

                   類是對(duì)某一類事物的描述,是抽象的,概念上的定義;對(duì)象是實(shí)際存在的該類事物的每個(gè)個(gè)體,因而也稱實(shí)例(instance)。

                   如果將對(duì)象比作汽車,那么類就是汽車的設(shè)計(jì)圖紙。所以面向?qū)ο蟪绦蛟O(shè)計(jì)的重點(diǎn)是類的設(shè)計(jì),而不是對(duì)象的設(shè)計(jì)。

          類的定義

          public class Person()

           {

                int age;

                void shout()

                    {

                           System.out.println("I am age "+age);

                    }

           }

              age是類的屬性,也叫類成員變量

              shout是方法也叫類的成員函數(shù)。

              shout方法可以直接訪問(wèn)同一類中的age變量,如果一個(gè)方法中有與成員同名的局部變量,該方法中對(duì)這個(gè)
                   變量名的訪問(wèn)是局部變量,而不是成員變量。

          在類中創(chuàng)建的成員變量會(huì)被初始化,局部變量不會(huì)被初始化

          對(duì)象的使用

          創(chuàng)建新的對(duì)象之后,我們就可以使用“對(duì)象名.對(duì)象成員”的格式,來(lái)訪問(wèn)對(duì)象的成員(包括屬性和方法)

          class Person

          {

                 int age;

                 void shout()

                 {

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

                 }

          }

          class TestPerson

          {

                 public static void main(String[]args)

                 {

                       Person p1=new Person();

                       p1.age=20;

                       p1.shout();

                       Person p2=new Person();

                       p2.shout();

                 }    

          }

          上面程序運(yùn)行的內(nèi)存布局如下:

           

          對(duì)象的比較

           ==”運(yùn)算符與equals()方法的區(qū)別

             “==”用來(lái)比較值是否相等,equals()方法用來(lái)比較兩個(gè)對(duì)象的內(nèi)容是否相等

          ●   怎樣比較兩個(gè)數(shù)組對(duì)象的內(nèi)容是否相等

                   arrays.equals(ary1[],ary2[]);

          匿名對(duì)象

            我們也可以不定義對(duì)象的句柄,而直接調(diào)用這個(gè)對(duì)象的方法。這樣的對(duì)象叫做匿名對(duì)象,
               如:new Person().shout();

          ●   如果對(duì)一個(gè)對(duì)象只需要進(jìn)行一次方法調(diào)用,那么就可以使用匿名對(duì)象。

             我們經(jīng)常將匿名對(duì)象作為實(shí)參傳遞給一個(gè)函數(shù)調(diào)用。

          實(shí)現(xiàn)類的封裝性

             如果外面的程序可以隨意修改一個(gè)類的成員變量,會(huì)造成不可預(yù)料的程序錯(cuò)誤,就象一個(gè)人身高,不能被外部隨意修改,只能通過(guò)各種攝取營(yíng)養(yǎng)的方法去修改這個(gè)屬性。

             在定義一個(gè)類的成員(包括變量和方法)時(shí),使用private關(guān)鍵字說(shuō)明這個(gè)成員的訪問(wèn)權(quán)限,這個(gè)成員成了 類的私有成員,只能被這個(gè)類其他成員方法調(diào)用,而不能被其他類中的方法所調(diào)用。

              為了實(shí)現(xiàn)良好的封裝性,我們通常將類的成員變量聲明為private,再通過(guò)public方法來(lái)對(duì)這個(gè)變量進(jìn)行訪問(wèn)。對(duì)一個(gè)變量操作,一般都有讀取和賦值操作,我們分別定義兩個(gè)方法來(lái)實(shí)現(xiàn)這兩種操作,一個(gè)是getXxx()方法(Xxx表示要訪問(wèn)的成員變量的名字),用來(lái)讀取這個(gè)成員變量操作,另外一個(gè)是setXxx()用來(lái)對(duì)這個(gè)變量賦值。

             一個(gè)類通常就是一個(gè)小的模塊,我們應(yīng)該讓模塊僅僅公開(kāi)必須要讓外界知道的內(nèi)容,而隱藏其它一切內(nèi)容。我們?cè)谶M(jìn)行程序的詳細(xì)設(shè)計(jì)時(shí),應(yīng)盡量避免一個(gè)模塊直接修改或操作另外一個(gè)模塊的數(shù)據(jù),模塊設(shè)計(jì)追求強(qiáng)內(nèi)聚(許多功能盡量在類的內(nèi)部獨(dú)立完成,不讓外面干預(yù)),弱耦合(提供給外部盡量少的方法調(diào)用)。

          class Person
          {
            private int age;
            void shout()
            {
              System.out.println(age);
            }
            public void setAge(int x)
            {
               if(x<0)
                 return;
               age=x;
            }
            public int getAge()
            {
               return age;
            }
            
          }

          class TestPerson
          {
            public static void main(String[]args)
            {
              Person p=new Person();
              p.setAge(18);
              p.shout();
              System.out.println(p.getAge());
            }
            
            


          構(gòu)造函數(shù)的定義與作用

               構(gòu)造函數(shù)的特征

                ▁它具有與類相同的名稱;

                ▁它不含返回值

                ▁它不能在方法中用return語(yǔ)句返回一個(gè)值

                注意:在構(gòu)造方法里不含返回值的概念是不同于“void”的,在定義構(gòu)造方法時(shí)加了”voiid”,結(jié)果這個(gè)方法就不再被自動(dòng)調(diào)用。

               構(gòu)造方法的作用:當(dāng)一個(gè)類的實(shí)例對(duì)象剛產(chǎn)生時(shí),這個(gè)類的構(gòu)造方法就會(huì)被自動(dòng)調(diào)用,我們可以在這個(gè)方法中加入要完成初始化工作的代碼。

          構(gòu)造方法的重載

               和一般的方法重載一樣,重載的構(gòu)造方法具有不同個(gè)數(shù)或不同類型的參數(shù),編譯器就可以根據(jù)這一點(diǎn)判斷出用new 關(guān)鍵字產(chǎn)生對(duì)象時(shí),該調(diào)用哪個(gè)構(gòu)造方法了。產(chǎn)生對(duì)象的格式是:new 類名(參數(shù)列表);

               重載構(gòu)造方法可以完成不同初始化的操作,如:p3=new Person(“Tom”18);語(yǔ)句,會(huì)做這樣幾件事:創(chuàng)建指定類的新實(shí)例對(duì)象,在堆內(nèi)存中為實(shí)例對(duì)象分配內(nèi)存空間,并調(diào)用指定類的構(gòu)造方法,最后將實(shí)例對(duì)象的首地址賦值給引用變量p3

          This引用句柄的應(yīng)用

               一個(gè)類中成員方法可以直接調(diào)用同類中的其他成員,其實(shí)我們?cè)谝粋€(gè)方法內(nèi)部使用“this.其他成員”的引用方式和直接使用“其他成員”的效果是一樣的,那this還有多大的作用呢?在有些情況下,我們是非得用this關(guān)鍵字不可的:

          ▁讓類的成員變量名和對(duì)其進(jìn)行賦值的成員方法的形參變量同名是必要的,這樣的代碼誰(shuí)看了都能明白這兩個(gè)變量是彼此相關(guān)的。

          ▁假設(shè)我們有一個(gè)容器類和一個(gè)部件類,在容器類的某個(gè)方法中創(chuàng)建部件類的實(shí)例對(duì)象,而部件類的構(gòu)造方法要接收一個(gè)代表其所在容器的參數(shù)。

          ▁構(gòu)造方法是在產(chǎn)生對(duì)象時(shí)被java系統(tǒng)自動(dòng)調(diào)用的,我們不能在程序中象調(diào)用其他方法一樣去調(diào)用構(gòu)造方法。但我們可以在一個(gè)構(gòu)造方法里調(diào)用其他重載的構(gòu)造方法,不是用構(gòu)造方法名,而是用this(參數(shù)列表)形式,根據(jù)其中的參數(shù)列表,選擇相應(yīng)的構(gòu)造方法。

          垃圾回收過(guò)程分析

               c++中的析構(gòu)方法

               java中的finalize()方法

               System.gc的作用

          Static靜態(tài)變量

                 當(dāng)我們編寫(xiě)一個(gè)類時(shí),其實(shí)就是在描述其對(duì)象的屬性和行為,而并沒(méi)有產(chǎn)生實(shí)質(zhì)上的對(duì)象,只有通過(guò)new關(guān)鍵字才會(huì)產(chǎn)生出對(duì)象,這時(shí)系統(tǒng)才會(huì)分配內(nèi)存空間對(duì)象,其方法才可以供外部調(diào)用。我們有時(shí)候希望無(wú)論是否產(chǎn)生了對(duì)象或無(wú)論產(chǎn)生了多少對(duì)象的情況下,某些特定的數(shù)據(jù)在內(nèi)存空間里只有一份。

          編寫(xiě)使用靜態(tài)變量統(tǒng)計(jì)一個(gè)類產(chǎn)生的實(shí)例對(duì)象的個(gè)數(shù)的程序。

          class Person

          {

                    private String name;

                    private static int count=0;

                    static String country="中國(guó)";

                    public Person()

                    {

                                  System.out.println(name+":"+ ++count);

                    }

                    public Person(String name)

                    {

                                  this.name=name;

                                  System.out.println(name+":"+ ++count);     

                    }

                    void shout()

                    {           

                                  System.out.println(name);

                    }

          }

           

          class TestPerson

          {

                    public static void main(String[]args)

                    {

                                  Person p=new Person("張三");

                                  new Person();

                                  p.shout();

                                  new Person("李四").shout();

                                  System.out.println(Person.country);

                    }

          }

           

          運(yùn)行結(jié)果:

          張三:1

          null:2

          張三

          李四:3

          李四

          中國(guó)

          Static靜態(tài)方法

               在靜態(tài)方法里只能直接調(diào)用同類中其它的靜態(tài)成員(包括變量和方法),而不能直接訪問(wèn)類中的非靜態(tài)成員。這是因?yàn)椋瑢?duì)于非靜態(tài)的方法和變量,需要先創(chuàng)建類的實(shí)例對(duì)象后才可使用,而靜態(tài)方法在使用前不用創(chuàng)建任何對(duì)象。

               靜態(tài)方法不能以任何方式引用thissuper關(guān)鍵字。與上面的道理一樣,因?yàn)殪o態(tài)方法在使用前不用創(chuàng)建任何實(shí)例對(duì)象,當(dāng)靜態(tài)方法被調(diào)用時(shí),this所引用的對(duì)象根本就沒(méi)有產(chǎn)生。

               main()方法是靜態(tài)的,因此JVM在執(zhí)行main方法時(shí)不創(chuàng)建main方法所在的類的實(shí)例對(duì)象,因而在main()方法中,我們不能直接訪問(wèn)該類中的非靜態(tài)成員,必須創(chuàng)建該類的一個(gè)實(shí)例對(duì)象后,才能通過(guò)這個(gè)對(duì)象去訪問(wèn)類中的非靜態(tài)成員。

          單態(tài)設(shè)計(jì)模式

               設(shè)計(jì)模式是在大量的實(shí)踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風(fēng)格、以及解決問(wèn)題的思考方式。

               所謂類的單態(tài)設(shè)計(jì)模式,就是采取一定的方法保證在整個(gè)的軟件系統(tǒng)中,對(duì)某個(gè)類只能存在一個(gè)對(duì)象實(shí)例,并且該類只提供一個(gè)取得其對(duì)象實(shí)例的方法。如果我們要讓類在一個(gè)虛擬機(jī)中只能產(chǎn)生一個(gè)對(duì)象,我們首先必須將類的構(gòu)造方法的訪問(wèn)權(quán)限設(shè)置為private,這樣就不能用new操作符在類的外部產(chǎn)生類的對(duì)象了,但在類的內(nèi)部仍可以產(chǎn)生該類的對(duì)象。因?yàn)樵陬惖耐獠块_(kāi)始還無(wú)法等到類的對(duì)象,只能調(diào)用該類的某個(gè)靜態(tài)方法以返回類內(nèi)部創(chuàng)建的對(duì)象,靜態(tài)方法只能訪問(wèn)類中的靜態(tài)成員變量,所以,指向類內(nèi)部產(chǎn)生的該類對(duì)象的變量也必須定義成靜態(tài)的。

          class Chinese

          {

                static Chinese obj=new Chinese();

                public static Chinese getInstance()

                {

                        return obj;

                }

                private Chinese()

                {

                        System.out.println("ss");

                }

          }

          class TestChinese

          {

                public static void main(String[]args)

                {

                        Chinese obj1=Chinese.getInstance();

                        Chinese obj2=Chinese.getInstance();

                        System.out.println(obj1==obj2);

                        //如果相等返回true,否則返回false.

                }

          }

          運(yùn)行結(jié)果:
          ss
          true

          內(nèi)部類

                ——在類中直接定義的內(nèi)部類(嵌套類)

               內(nèi)部類(嵌套類)可以直接訪問(wèn)外部類(嵌套它的類)的成員,包括private成員,但是,內(nèi)部類(嵌套類)的成員卻不能被外部類(嵌套它的類)直接訪問(wèn)。

               在內(nèi)部類對(duì)象保存了一個(gè)對(duì)外部類對(duì)象的引用,當(dāng)內(nèi)部類的成員方法中訪問(wèn)某一變量時(shí),如果在該方法和內(nèi)部類中都沒(méi)有定義過(guò)這個(gè)變量,內(nèi)部類中對(duì)this的引用會(huì)被傳遞給那個(gè)外部類對(duì)象的引用。

               如果用static修飾一個(gè)內(nèi)部類,這個(gè)類就相當(dāng)于是一個(gè)外部定義的類,所以static的內(nèi)部類中可聲明static成員,但是,非static的內(nèi)部類中的成員是不能聲明為staticStatic的內(nèi)部類不能再使用外層封裝的非static的成員變量,這個(gè)道理不難想象,所以static嵌套類很少使用。

          class Outer

          {

                 int outer_i=100;

                 void test()

                 {

                        Inner inner=new Inner();

                        inner.display();

                 }

                 class Inner

                 {

                        void display()

                        {

                               System.out.println(outer_i);

                        }

                 }

                

                 public static void main(String[]args)

                 {

                        Outer outer=new Outer();

                        outer.test(); 

                 }

          }

               如果函數(shù)的局部變量(函數(shù)的參數(shù)也是局部變量)、內(nèi)部類的成員變量、外部類的成員變量重名,我們應(yīng)該按下面的程序代碼所使用的方式來(lái)明確指定我們真正要訪問(wèn)的變量。

          public class Outer

          {

                 private int size;

                 public class Inner

                 {

                        private int size;

                        public void doStuff(int size)

                        {

                               size++;//引用的是doStuff函數(shù)的形參

                               this.size++;//引用的是Inner類中的成員變量

                               Outer.this.size++;//引用的是Outer類中的成員變量

                        }           

                 }

          }

          內(nèi)部類如何被外部引用

          class Outer

          {

                 private int size=100;

                 public class Inner

                 {

                        public void doStuff()

                        {

                               System.out.println(++size);

                        }

                 }

          }

          public class TestInner

          {

                 public static void main(String[]args)

                 {

                        Outer outer=new Outer();

                        Outer.Inner inner=outer.new Inner();

                        inner.doStuff();

                 }

          }

          在方法中定義的內(nèi)部類

               嵌套類并非只能在類中定義,也可以在幾個(gè)程序塊的范圍之內(nèi)定義內(nèi)部類。例如,在方法中,或甚至在for循環(huán)體內(nèi)部,都可以定義嵌套類。

               在方法中定義的內(nèi)部類只能訪問(wèn)方法的fianl類型的局部變量,用final定義的局部變量相當(dāng)于是一個(gè)常量,它的生命周期超出方法運(yùn)行的生命周期。

           

          posted on 2007-06-07 23:33 大頭劍客 閱讀(395) 評(píng)論(0)  編輯  收藏 所屬分類: 學(xué)習(xí)筆記

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          寫(xiě)字樓里寫(xiě)字間,寫(xiě)字間里程序員;
          程序人員寫(xiě)程序,又拿程序換酒錢;
          酒醒只在網(wǎng)上坐,酒醉還來(lái)網(wǎng)下眠;
          酒醉酒醒日復(fù)日,網(wǎng)上網(wǎng)下年復(fù)年;
          但愿老死電腦間,不愿鞠躬老板前;
          奔馳寶馬貴者趣,公交自行程序員;
          別人笑我忒瘋癲,我笑自己命太賤;
          不見(jiàn)滿街漂亮妹,哪個(gè)歸得程序員.
          不管前面是地雷陣還是萬(wàn)丈深淵,
          我都將勇往直前,義無(wú)反顧,
          鞠躬盡瘁,死而后已。
          —— 朱镕基總理

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章分類

          文章檔案

          學(xué)習(xí)園地

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          主站蜘蛛池模板: 江西省| 虞城县| 新巴尔虎左旗| 阿巴嘎旗| 海城市| 宜章县| 高阳县| 德清县| 达孜县| 手游| 禄劝| 西贡区| 常宁市| 鄢陵县| 华坪县| 社旗县| 岳西县| 额济纳旗| 锦州市| 彰化县| 安顺市| 沂源县| 隆尧县| 新田县| 桦川县| 格尔木市| 广昌县| 镇沅| 婺源县| 佛学| 鹤山市| 阿坝| 通河县| 西峡县| 黔江区| 乐山市| 五河县| 汉源县| 剑川县| 普格县| 龙里县|