《Java大學(xué)教程》—第24章 Java的背景
本章主要介紹的是Java的背景知識(shí),通過了解歷史知道Java與其他語言的區(qū)別,以便更好選擇在什么場(chǎng)景下使用Java。
24.2 語言的尺寸
Java語言短小、緊湊,以C++為基礎(chǔ),放棄了一些特定的語言特征(指針和多繼承)
注:需要關(guān)注的是為什么放棄這兩個(gè)特征,有沒有替代方案,各自的優(yōu)缺點(diǎn)。
24.2.1 指針(pointer)
指針是一種變量,并且變量中包含了某個(gè)存儲(chǔ)器地址。
Java不允許使用指針,因?yàn)橹羔樦赶虻氖蔷唧w的物理地址,直接操縱物理地址中的數(shù)據(jù),容易使程序出現(xiàn)不可預(yù)料的問題。
Java通過創(chuàng)建引用()來實(shí)現(xiàn)對(duì)地址的訪問。通過引用也可以把地址作為變量傳送。
24.2.2 多繼承(multiple inheritance)
多繼承允許一個(gè)類繼承于多個(gè)超類。
Java不允許多繼承:因?yàn)槎嗬^承使用不多,且編程復(fù)雜,容易出錯(cuò)。
Java允許繼承一個(gè)基類,實(shí)現(xiàn)多個(gè)接口的方式實(shí)現(xiàn)多繼承。
24.3 語言的可靠性
24.3.1 別名(alias)
別名會(huì)導(dǎo)致不同的對(duì)象變量指向同樣的對(duì)象。
因?yàn)閷?duì)象變量中存儲(chǔ)的對(duì)象地址相同,從而出現(xiàn)兩個(gè)修改同一對(duì)象數(shù)據(jù)的入口,容易造成混淆。
為此Java提供了兩種拷貝機(jī)制:深拷貝(對(duì)象的數(shù)據(jù)的拷貝)和淺拷貝(對(duì)象的引用的拷貝)。
深拷貝可以保護(hù)原始對(duì)象不受影響,但是需要消耗時(shí)間和空間,用于保護(hù)數(shù)據(jù)安全的領(lǐng)域使用。利用clone方法。
淺拷貝提供了原始對(duì)象的地址,不需要消耗過多的時(shí)間和空間,但是必須小心的使用,以免造成不可預(yù)料的問題。利用別名機(jī)制。
24.3.2 重寫clone方法
protected的方法可以被重寫為public的方法,但是public的方法不可以重寫為protected方法。
注:因?yàn)橐呀?jīng)在父類已經(jīng)是public的方法,就算子類重寫為protected方法,那么訪問者依然可以通過父類實(shí)現(xiàn)訪問,所以不容許public方法重寫成protected方法。
24.3.3 不變對(duì)象
如果對(duì)象中不存在變更它們狀態(tài)的方法,則對(duì)象稱為不變對(duì)象。
如果對(duì)象是不可變的,則不必?fù)?dān)心創(chuàng)建對(duì)象的別名會(huì)造成不可預(yù)料的問題。
24.3.4 使用Object類的clone方法
Object類的clone方法復(fù)制了分配給對(duì)象屬性的存儲(chǔ)器的內(nèi)容,也稱為按位拷貝(bitwise copy)。即完全復(fù)制了原始類型(primitive type)的屬性的內(nèi)容,并且復(fù)制了屬性的引用。
* 如果類的屬性都是基本類型的,則重載clone方法只需要調(diào)用Object類的clone方法;
* 如果類的屬性有對(duì)象類型的,并且這些對(duì)象都是不可變的,則重載clone方法只需要調(diào)用Object類的clone方法。
* 如果類的屬性包含非不可變對(duì)象,則無法利用Object類的clone方法進(jìn)行復(fù)制,必須自己編寫代碼來實(shí)現(xiàn)clone方法。
如果需要使用Object類的clone方法,需要標(biāo)識(shí)類實(shí)現(xiàn)了Cloneable接口,這個(gè)接口也是個(gè)標(biāo)識(shí)接口,沒有包含任何方法。
24.3.5 垃圾收集
Java使用異常處理技術(shù)來監(jiān)視內(nèi)存耗盡問題,并且可以編寫代碼來確保程序正常地終止。
Java語言具有一種內(nèi)嵌的垃圾收集功能,該功能能夠釋放未被使用的內(nèi)存。通過搜索程序所使用的內(nèi)存空間,釋放不再被使用的內(nèi)存。
自測(cè)題:
1. 指針與引用的區(qū)別:
指針保存了地址,并且可以通過代碼修改和操縱這個(gè)地址的數(shù)據(jù)。
引用保存了地址,但是這個(gè)地址不能通過代碼修改,也不能隨便改變?cè)L問的類型,例如:不能按字節(jié)訪問地址中的信息。
2. 多繼承:
多繼承允許一個(gè)類繼承于多個(gè)超類。
Java不允許多繼承:因?yàn)槎嗬^承使用不多,且編程復(fù)雜,容易出錯(cuò)。
Java允許繼承一個(gè)基類,實(shí)現(xiàn)多個(gè)接口的方式實(shí)現(xiàn)多繼承。
3. Critical.java
a) 因?yàn)镃ritical對(duì)象存在變更它們狀態(tài)的方法,所以是可變對(duì)象。
b) CriticalTest.java
c) Critical.java
d) CriticalTest.java
4.
a) 為什么方法返回的都是別名:方便調(diào)用的方法修改里面的數(shù)據(jù),對(duì)于不可變對(duì)象也提高傳送數(shù)據(jù)的效率。
b) 為什么別名可能有危險(xiǎn):因?yàn)檎{(diào)用方法的代碼可能會(huì)修改原始數(shù)據(jù),造成不可意料的數(shù)據(jù)錯(cuò)誤。
c) 如何避免別名:創(chuàng)建clone方法,返回的對(duì)象都采用深拷貝。
5. 垃圾收集功能的優(yōu)點(diǎn)和缺點(diǎn):
優(yōu)點(diǎn):簡化程序員的工作,避免出現(xiàn)內(nèi)存泄漏或者內(nèi)存耗盡的問題。
缺點(diǎn):降低代碼執(zhí)行的速度,對(duì)于實(shí)時(shí)應(yīng)用會(huì)突然出現(xiàn)響應(yīng)不及時(shí)的問題。
編程練習(xí):代碼附件
Critical.java CriticalTest.java
posted on 2016-10-06 14:31 zYx.Tom 閱讀(336) 評(píng)論(0) 編輯 收藏 所屬分類: 1.Java世界