第三章 面向對象(一)--類與對象

1、基本概念

1)過程與對象都是一種解決問題的思想。

     面向過程:強調的是功能行爲,一種過程,先幹啥,再幹啥;

         面向對象:將功能封裝到對象裏,強調的是具備某功能的對象;

2)面向對象的三個特徵:封裝(Encapsulation)、繼承(Inheritance)、多態(Polymorphism)

 

2、類與對象

1關係:類是對象的抽象,而對象是類的具體實例

    類:表示一個客觀世界某類羣體的一些基本特徵的抽象

    對象:是表示一個個具體的東西

2)類的定義

        [修飾符] class  類名

       {     

              1~n個構造方法;   

              0~n個字段(field);   

             0~n個方法; 

        }

     1)修飾符:可省略,或是publicfinalabstract中的一個

     2)構造方法:用來構造類的實例(默認有一個無參的構造方法,得使用new調用)

            格式:[修飾符構造方法名(形參列表)。。。}

            修飾符:可省略,或是publicprotectedprivate中的一個

           構造方法名:必須與類名相同

   【注】:A、其聲明處不能有任何返回值類型的聲明

          B、不能使用return返回一個值;(return;可以)

    3field(成員變量|字段|域):類或對象所包含的數據,對類狀態的一種描述

           格式:[修飾符] field類型 field[=默認值]

           修飾符:可省略,或是publicprotectedprivate中的一個,staticfinal

  4)方法:類或對象的特徵和行爲

        格式:[修飾符方法返回值類型 方法名(形參列表){。。。}

        修飾符:可省略,或是publicprotectedprivate中的一個,staticfinal|abstract

3)對象的定義、創建和使用

         A、格式:類名  對象名稱 = new 類名(); //其實是兩步操作

             類名  對象名稱 ;     //聲明對象

             對象名稱 =  new 類名();     //實例化對象

         B對象名保存在棧內存(訪問地址)中,對象的具體內容保存在堆內存

         C、“對象名.對象成員”的方式來操作對象中的內容

                訪問屬性:對象名.屬性名;

                訪問方法:對象名.方法名

(3)匿名對象

   定義:不定義變量引用對象,使用new關鍵字創建對象後直接使用,這樣的對象沒有名字,所以叫匿名對象

   特點:A匿名對象只進行一次調用,而且它只在堆內存中開闢空間,而沒有在棧內存的引用。當對象對成員進行多次調用時,不能使用匿名對象,必須給對象起名字。B可作爲實際參數進行傳遞。new Car().show(new Car());

(4)成員變量和局部變量的區別:

    1:成員變量直接定義在類中,整個類中都可以訪問;局部變量定義在方法中,參數上,語句中,只在所屬的區域上有效。

    2:成員變量存在於堆內存中,隨着對象的產生而存在,消失而消失。局部變量存在於棧內存中,隨着所屬區域的運行而存在,結束而釋放。

    3、成員變量都有默認初始值,而局部變量則沒有

   補充:成員變量初始化

              當一個對象被創建時,會對其中各種類型的成員變量自動進行初始化賦值。基本數據類型初始化值爲0,引用數據類型初始化值爲null

 

(5)構造函數 (構造器 == 構造方法)

        1特點:A方法名與類名相同 B不用定義返回值類型 C不需要寫return語句

        2作用:給類中的字段進行初始化,可以用來創建對象

        3記住:所有對象創建時,都需要初始化纔可以使用。(new都會調用構造函數

       注意事項:一個類在定義時,如果沒有定義過構造函數,那麼該類中會自動生成一個空參數的構造函數,爲了方便該類創建對象,完成初始化。如果在類中自定義了構造函數,那麼默認的構造函數就沒有了。

      一個類中,可以有多個構造函數,因爲它們的函數名稱都相同,所以只能通過參數列表來區分。所以,一個類中如果出現多個構造函數。它們的存在是以重載體現的。

    4構造函數和一般函數有什麼區別呢?

     1:兩個函數定義格式不同。

     2:構造函數是在對象創建時,就被調用,用於初始化,而且初始化動作只執行一次。一般函數,是對象創建後,需要調用才執行,可以被調用多次。

    5什麼時候使用構造函數呢?

         分析事物時,發現具體事物一出現,就具備了一些特徵,那就將這些特徵定義到構造函數內。

   6構造代碼塊和構造函數有什麼區別?

         構造代碼塊:是給所有的對象進行初始化,也就是說,所有的對象都會調用一個代碼塊。只要對象一建立。就會調用這個代碼塊。構造函數:是給與之對應的對象進行初始化。它具有針對性。

    7Person p = new Person();

    創建一個對象都在內存中做了什麼事情?

            1:先將硬盤上指定位置的Person.class文件加載進內存。

             2:執行main方法時,在棧內存中開闢了main方法的空間(壓棧-進棧),然後在main方法的棧區分配了一個變量p

            3:在堆內存中開闢一個實體空間,分配了一個內存首地址值。new

            4:在該實體空間中進行屬性的空間分配,並進行了默認初始化。

            5:對空間中的屬性進行顯示初始化。

            6:進行實體的構造代碼塊初始化。

            7:調用該實體對應的構造函數,進行構造函數初始化。()

            8:將首地址賦值給p變量就引用了該實體。(指向了該對象)

8setter方法和構造方法都可以用來初始化字段的值,那麼什麼時候用構造方法什麼時候用setter

      A當字段的值是和類的對象緊密相關不可分割的時候,用構造方法,就是說我要有這個實例,就必須有這個字段值,就用構造方法。

      B需要初始化的字段值不太多的時候可以用構造方法,如果字段值太多,構造方法的參數列表太。。。了。

      C其他時候都可以用setter方法。

 

 

發佈了116 篇原創文章 · 獲贊 34 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章