1. 程式人生 > >java學習筆記(二)--(物件程式設計-類與方法)

java學習筆記(二)--(物件程式設計-類與方法)

面向過程-程式設計正規化-c-行為

面向物件-能進行現實生活的抽象

面向介面程式設計

面向切面程式設計

函數語言程式設計正規化 -Scala,Koltin

//lamdba表示式

()-> { }

面向物件三大特徵:

a.封裝

       將客觀事物封裝為抽象的類,並且類可以把自己的資料和方法只讓可信的類或物件操作,對不可信的進行資訊隱藏。內部          操作對不可信外部而言不可見(保護性)

b.繼承

        繼承是指可以使用現有類的所有功能,並且在無須重複編寫原有類的情況下對原有類進行功能上的擴充套件。(可重用)

c.多型(重要)

        多型一個類例項相同方法在不同情況下有不同的表現形式。

        多型機制是具有不同內部機構的物件可以共享外部相同介面。

名詞擴充套件:

OOA:面向物件分析

OOD:面向物件設計

OOP:面向物件程式設計

UML類圖(重要)架構師

2.類與物件的定義和使用

類:指的是共性的概念,而物件是一個具體的,可以使用的事物

首先先要有類(類是生產物件的藍圖),而後才可以產生物件。物件所具有的所有行為與屬性,一定是在類中進行了完整           的定義。

人類

類中的組成:

1.方法(操作的行為)

2.屬性(操作的資料,每個物件應該具有的特徵)

    2.1Java中類的定義語法

         calss 類名稱{

         屬性型別  屬性名稱1;

         屬性型別  屬性名稱2;

          ...

         方法1(){};

         方法2(){};

          ...

          }

      

 類中的屬性和方法不在由主方法直接呼叫,而需要通過物件來呼叫。

          物件宣告語法:

          類名稱 物件名稱 = new 類名稱();

          Person per1=new Person();

          Person per2=new Person(“Dyson”,20);

    2.2類與物件記憶體分析

        new 關鍵字 - 在堆上開闢了新的空間

        棧記憶體:存放的是區域性變數(包含各種基本資料型別以及物件引用--物件的名稱)

        堆記憶體:儲存真正物件(物件的屬性資料)

         Person per=new Person();

         記憶體圖如下:

       

物件(引用資料型別)必須在例項化後呼叫,否則會產生NullPointerException(執行時異常)

        垃圾空間:沒有任何空間指向的堆記憶體空間

3.private實現封裝處理 (僅限於本類中訪問)

    讓內部操作對外部不可見(在類的外部不能直接使用物件來操作屬性)

    可以使用private對屬性進行封裝,稱為類的私有屬性。(主類和主方法稱為客戶端)

    範例:無封裝程式

 

Java規範,1.所有私有屬性要想訪問與設定內容,提供對應getter與setter方法

    setter方法:進行屬性內容設定與更改

    getter方法:取得屬性內容

範例:擴充套件Person類的內容

 

類的設計原則:

        1.類中所有屬性必須使用private封裝

        2.屬性若要被外部訪問,必須定義相應的getter與setter方法

4.構造方法

    1.任何物件都應該有其對應的類,類是物件的藍圖 2.是一個唯一的標記,引用一塊堆記憶體 3.表示開闢新的堆內 存空間 4.構造方法

(a)Person (b)per1=(c)new(d)Person();

 特點:

    a.方法名稱必須與類名稱 相同

    b.構造方法沒有返回值型別宣告 (重要)

    c.每個類必須至少存在一個構造方法(沒有明確定定義的話,系統預設自動生成一個無參構造)

    d.若類中定義的構造方法,則預設的無參構造不再生成。(先賦值,再傳參)

    構造方法無返回值,為什麼沒有void宣告?

        類的組成:屬性,構造方法,普通方法

        1,屬性是在物件開闢堆記憶體時開闢的空間

        2,構造方法是在使用new後呼叫的

         3,普通方法是在空間開闢了,構造方法執行之後可以多次呼叫的

      

    編譯器是根據程式結構來區分普通方法與構造方法,因此構造方法前沒有返回值型別宣告

        範例:使用構造方法設定物件屬性

  

 javap -c   反編譯命令

    構造方法的過載:引數個數不同(引數型別已經被定義)

    範例:構造引數過載

  

  建議:有若干個構造方法,請按照引數個數升序或降序

    進行類定義時遵循以下順序:

    先定義屬性->構造方法(構造方法按照個數大小排列)->普通方法

    匿名物件

    範例:

 

由於匿名物件不會有任何的棧空間所指向,所以使用一次後就成為垃圾空間。

5.this關鍵字

a.this呼叫本類屬性

        this.屬性名 明確表示呼叫類中的同名屬性

        規範:在類的普通方法中訪問本類屬性,一定要加this關鍵字

         例項:

     

b.this呼叫本類方法

        呼叫普通方法 this.方法名稱(引數)(雖然在本類普通方法不需要加this也可以正常呼叫。但建議加上,加上this的目的可以區分方法的定義來源(在繼承中有用))

        呼叫構造方法 this(引數):(重要)(編譯器語言錯誤)

        範例:this呼叫普通方法

     

範例:this呼叫構造方法

        修改前:

    

        修改後:

      

注意:

        a.this呼叫本類其他構造方法必須放在首行呼叫

        b.this呼叫構造方法不允許成環

c.this表示當前物件

        範例:this表示當前物件

    

6.static關鍵字(重要)

        6.1static屬性(類屬性)--通過類名呼叫(與物件無關,無物件可以直接使用)

                a.訪問static屬性應該使用類名稱-屬性名(類屬性)-描述共享概念

                b.所有的非static屬性(例項屬性)必須在物件例項化後使用(與物件強相關,必須通過物件使用),而static屬性(類屬性)不受物件例項化控制

                範例:static屬性的記憶體分析

              

                記憶體分析圖如下:

             

        傳統屬性所具備的特徵:儲存在堆記憶體中,且每個物件獨享屬性

                描述共享屬性,只需在屬性前新增static關鍵字即可

                static屬性又稱為類屬性,儲存在全域性資料區的記憶體之中,所有物件都可以進行該資料區的訪問

                修改程式碼:

              

               記憶體圖分析如下: