1. 程式人生 > >java核心技術(8)第四章

java核心技術(8)第四章

1、面向過程程式設計:演算法+資料=程式

面向物件程式設計:資料+演算法=程式(更容易掌握,理解,找bug)

2、封裝(encapsulation)

關鍵在於絕對不能讓類中的方法直接方位其他類的例項域。程式僅通過方法與物件的資料交付。

這是提高重用性和可靠性的關鍵。

物件的所有例項域的值的集合就是這個物件的當前狀態。(只能通過呼叫方法改變,如果不用通過呼叫方法就改變了狀態,說明封裝性遭到破壞)。

物件的行為即方法,狀態影響行為,如不同狀態訂單,可進行操作不一樣。

3、類於類之間的關係

   1)依賴(uses-a)應儘量減少依賴,降低耦合

   2)聚合(has-a) 即包含關係,如訂單包含條目

   3)繼承(is-a)特殊與一般的關係,如程式設計師繼承人類。

4、物件的使用:

要想使用物件,必須先構造物件,並指定其初始狀態,才能對其進行操作(施加方法)。

一個物件變數並沒有實際包含一個物件,而僅僅引用一個物件。

所以在寫類的get方法時,不要返回引用可變物件。因為他們實際上引用的是同一個物件,如果在外部對這個返回的物件進行修改,那麼類物件的屬性也會被修改。

舉個栗子:

Apple a = .....;

Date produceTime =a.getProduceTime();

此時priduceTime 和a.produceTime引用同一個物件

如果改變produceTime,a.produceTime也會被改變。如:

produceTime.setTime(365000000);a.produceTime也會被改變

所以最好用clone,在A的getProduceTime()中返回produceTime.clone();

(String雖然不是基本型別,但因為是不可變字串,沒有更改字元的方法,所以沒有這個問題)

在Java中,任何物件變數的值都是對儲存在另外一個地方的一個物件的引用。new操作符的返回值也是一個引用。

String s = new String("sdfs");

有兩個部分:1)、new String("sdfs");構造了一個String型別的物件,並且它的值是新建立物件的引用。

                      2)、這個引用儲存在變數s中。

5、java編譯器有兩種編譯方式:

1)、萬用字元 * 舉個栗子:javac abc*.java 所有匹配的都會被編譯

2)、編譯包含main方法的類,其中引用到的其他類會被自動搜尋和編譯,並且如果有更新,也會重新編譯。

6、隱式引數

每一個方法中都有一個隱式引數,及方法名前的物件,關鍵字this表示隱式引數。

6、final修飾符:一般應用於基本資料型別(primitive)或不可變類如String,而不用於可變類,如上面例子中的Date類。

即使用final修飾Date,仍然可用setTime改變值。

7、static修飾符:

    1)靜態域:用static修飾的屬性屬於類,每個類中只有一個這樣的域,所有例項物件有一份自己的拷貝。

    2)靜態方法:用static修飾的方法屬於類方法,不對物件狀態進行操作,只能訪問靜態屬性,沒有隱式引數,所有引數均通過顯示方式傳遞。(注意其使用場景,例子NumberFormat)

8、方法引數:

java程式設計語言總是採用值呼叫:

方法不能修改基本型別引數;

方法可以修改物件狀態;

方法不能讓物件引數引用新的物件;

9、構造方法:

預設不含引數構造方法,所有屬性設定為預設值,數值0,Boolean false,物件null

如果已有一個含參構造方法,則不能再使用預設構造方法,要用必須顯示定義。

過載:方法名相同,引數不同

引數名和屬性名相同時,會遮蔽屬性名,呼叫屬性在前面加this(this.name=name)

匯入靜態類和靜態常量如:Math 匯入之後不必在方法前加類名。

10、類的設計技巧:

  1)、一定要將資料設計為私有

  2)、一定要對資料初始化

  3)、合理設計屬性(基本型別,還是物件型別)

  4)、不是所有屬性都需要get,set方法

  5)、物件設計足夠原子化

  6)、類名,屬性名,方法名要體現實際意義