本章主要介紹的是Java的背景知識,通過了解歷史知道Java與其他語言的區別,以便更好選擇在什么場景下使用Java。
24.2 語言的尺寸
Java語言短小、緊湊,以C++為基礎,放棄了一些特定的語言特征(指針和多繼承)
注:需要關注的是為什么放棄這兩個特征,有沒有替代方案,各自的優缺點。
24.2.1 指針(pointer)
指針是一種變量,并且變量中包含了某個存儲器地址。
Java不允許使用指針,因為指針指向的是具體的物理地址,直接操縱物理地址中的數據,容易使程序出現不可預料的問題。
Java通過創建引用()來實現對地址的訪問。通過引用也可以把地址作為變量傳送。
24.2.2 多繼承(multiple inheritance)
多繼承允許一個類繼承于多個超類。
Java不允許多繼承:因為多繼承使用不多,且編程復雜,容易出錯。
Java允許繼承一個基類,實現多個接口的方式實現多繼承。
24.3 語言的可靠性
24.3.1 別名(alias)
別名會導致不同的對象變量指向同樣的對象。
因為對象變量中存儲的對象地址相同,從而出現兩個修改同一對象數據的入口,容易造成混淆。
為此Java提供了兩種拷貝機制:深拷貝(對象的數據的拷貝)和淺拷貝(對象的引用的拷貝)。
深拷貝可以保護原始對象不受影響,但是需要消耗時間和空間,用于保護數據安全的領域使用。利用clone方法。
淺拷貝提供了原始對象的地址,不需要消耗過多的時間和空間,但是必須小心的使用,以免造成不可預料的問題。利用別名機制。
24.3.2 重寫clone方法
protected的方法可以被重寫為public的方法,但是public的方法不可以重寫為protected方法。
注:因為已經在父類已經是public的方法,就算子類重寫為protected方法,那么訪問者依然可以通過父類實現訪問,所以不容許public方法重寫成protected方法。
24.3.3 不變對象
如果對象中不存在變更它們狀態的方法,則對象稱為不變對象。
如果對象是不可變的,則不必擔心創建對象的別名會造成不可預料的問題。
24.3.4 使用Object類的clone方法
Object類的clone方法復制了分配給對象屬性的存儲器的內容,也稱為按位拷貝(bitwise copy)。即完全復制了原始類型(primitive type)的屬性的內容,并且復制了屬性的引用。
* 如果類的屬性都是基本類型的,則重載clone方法只需要調用Object類的clone方法;
* 如果類的屬性有對象類型的,并且這些對象都是不可變的,則重載clone方法只需要調用Object類的clone方法。
* 如果類的屬性包含非不可變對象,則無法利用Object類的clone方法進行復制,必須自己編寫代碼來實現clone方法。
如果需要使用Object類的clone方法,需要標識類實現了Cloneable接口,這個接口也是個標識接口,沒有包含任何方法。
24.3.5 垃圾收集
Java使用異常處理技術來監視內存耗盡問題,并且可以編寫代碼來確保程序正常地終止。
Java語言具有一種內嵌的垃圾收集功能,該功能能夠釋放未被使用的內存。通過搜索程序所使用的內存空間,釋放不再被使用的內存。
自測題:
1. 指針與引用的區別:
指針保存了地址,并且可以通過代碼修改和操縱這個地址的數據。
引用保存了地址,但是這個地址不能通過代碼修改,也不能隨便改變訪問的類型,例如:不能按字節訪問地址中的信息。
2. 多繼承:
多繼承允許一個類繼承于多個超類。
Java不允許多繼承:因為多繼承使用不多,且編程復雜,容易出錯。
Java允許繼承一個基類,實現多個接口的方式實現多繼承。
3. Critical.java
a) 因為Critical對象存在變更它們狀態的方法,所以是可變對象。
b) CriticalTest.java
c) Critical.java
d) CriticalTest.java
4.
a) 為什么方法返回的都是別名:方便調用的方法修改里面的數據,對于不可變對象也提高傳送數據的效率。
b) 為什么別名可能有危險:因為調用方法的代碼可能會修改原始數據,造成不可意料的數據錯誤。
c) 如何避免別名:創建clone方法,返回的對象都采用深拷貝。
5. 垃圾收集功能的優點和缺點:
優點:簡化程序員的工作,避免出現內存泄漏或者內存耗盡的問題。
缺點:降低代碼執行的速度,對于實時應用會突然出現響應不及時的問題。
編程練習:代碼附件
Critical.java CriticalTest.java