摘要:在類的構(gòu)造方法中。對基類構(gòu)造器的調(diào)用必須放到子類構(gòu)造器的第一行。約定用大寫字母下劃線命名規(guī)范空白空白指被聲明為但又未給定初值的域,但可以在構(gòu)造方法必須在域的定義處代碼塊或構(gòu)造器中對進行賦值。
點擊進入我的博客
復(fù)用代碼是Java眾多引人注目的功能之一,但要成為極具革命性的語言,僅僅能夠復(fù)制代碼并對之加以改變是不夠的,它還必須能夠做更多的事情。
7.1 組合就是在當(dāng)前類中產(chǎn)生現(xiàn)有類的對象。
每一個非基本類型的對象都有該方法,當(dāng)編譯器需要一個String但你只有一個對象時,該方法會自動調(diào)用。
編譯器并不是簡單的為每一個引用都創(chuàng)建對象,因為這回增加不必要的負擔(dān)
在定義對象的時候初始化,這意味著在構(gòu)造方法之前被調(diào)用。
在類的構(gòu)造方法中。
就在正常使用這些對象之前——惰性初始化。
使用實例初始化
7.2 繼承使用extends關(guān)鍵字實現(xiàn)繼承
當(dāng)創(chuàng)建一個類時總是在繼承,除非明確指定從其他類繼承,否則就是隱式從Object繼承
繼承時會自動得到基類中所有的域和方法
使用super.func()調(diào)用父類中的方法。
7.2.1 初始化基類當(dāng)創(chuàng)建類一個子類的對象時,該對象包含了一個基類的自對象。這個子對象與你用基類直接創(chuàng)建的對象是一樣的。二者區(qū)別在于,后者來自于外部,而基類的子對象被包裝在子類對象內(nèi)部。
對基類子對象對正確初始化:在子類構(gòu)造器中調(diào)用基類構(gòu)造器。Java會自動在子類構(gòu)造器中插入對基類構(gòu)造器對調(diào)用。
編譯器強制你去初始化基類,但并不代表會初始化成員對象。
如果基類沒有默認(rèn)的無參構(gòu)造器,或者想調(diào)用一個帶參數(shù)的基類構(gòu)造器,就必須用關(guān)鍵字super顯式地編寫基類構(gòu)造器的語句。
對基類構(gòu)造器的調(diào)用必須放到子類構(gòu)造器的第一行。
7.3 代理Java并沒有提供對代理對直接支持,這是繼承和組合的中庸之道。
代理:將一個成員對象放置于所需要的構(gòu)造的類中(像組合),但與此同時在新類中暴露該成員對象的相關(guān)方法(像繼承)。
使用代理可以有更多的控制力,因為我們可以選擇只暴露一個子集。
public class Test { TestDemo demo = new TestDemo(); // 代理 public void func() { demo.func(); } } class TestDemo { void func() {} }7.4 結(jié)合使用組合和繼承 7.4.1 確保正確清理
一般情況下,清理并不是問題,僅需讓垃圾回收器完成該動作就行。但當(dāng)必須親自處理清理(如文件的關(guān)閉)時,就要多加小心。
因為,垃圾回收器可能永遠也無法被調(diào)用,即時被調(diào)用,它是按照任何它想要的順序來回收對象。
最好的辦法是除了內(nèi)存以外,不能依賴?yán)厥掌魅プ鋈魏问隆?/strong>
如果需要清理,就自己寫一個清理方法,但不要使用finalize()。
清理語句盡量寫在finally代碼塊中。
7.4.2 名稱屏蔽如果Java的基類已經(jīng)擁有某個已被多次重載的方法,那么在子類中重新定義該方法名稱并不會屏蔽其在基類中的任何版本。因此,無論是在該層或者它的基類中隊方法進行定義,重載機制都可以正常工作。
可以使用@Override來表示要重寫父類方法。
7.5 在組合和繼承間選擇組合和繼承都允許在新的類中放置子對象,組合是顯式地這樣做,而繼承是隱式地做。
繼承很重要但是并不意味著我們需要常常用他,如何判斷是否應(yīng)該使用繼承請參照兩個標(biāo)準(zhǔn):
如果是“is-a”的關(guān)系,那就使用繼承。如果是“has-a”的關(guān)系,那就使用組合。
是否需要向上轉(zhuǎn)型,如果必須向上轉(zhuǎn)型則必須使用繼承,否則應(yīng)該慎重考慮
7.6 protected關(guān)鍵字在實際項目中,經(jīng)常會想要將某些事物盡可能對這個世界隱藏起來,但仍允許導(dǎo)出類的成員訪問它們。
盡管可以創(chuàng)建protected域成員,但最好的方式還是private,只有在真正需要的時候才使用protected關(guān)鍵字。
7.7 向上轉(zhuǎn)型“為新類提供方法”并不是繼承技術(shù)最重要的方面,其最重要的方面是用來表現(xiàn)子類和基類之間的關(guān)系。
子類引用可以向上轉(zhuǎn)型成為基類引用,因為派生類一定具有基類的方法。類接口唯一可能發(fā)生的事情是丟失方法,而不是獲取它們。
7.8 final關(guān)鍵字 7.8.1 final數(shù)據(jù)final基本數(shù)據(jù)類型:表示數(shù)據(jù)是不可變的常量
final對象引用:引用與對象的關(guān)聯(lián)關(guān)系不可變,但可以對對象進行操作。
final static約定用大寫字母+下劃線命名規(guī)范
空白final指被聲明為final但又未給定初值的域,但可以在構(gòu)造方法
必須在域的定義處、static代碼塊或構(gòu)造器中對final進行賦值。
Java允許在參數(shù)列表中將參數(shù)指明為final
修飾對象參數(shù):意味著無法在方法中修改參數(shù)引用的對象
修飾基本類型:可以使用但無法修改此參數(shù)
7.8.2 final方法把方法鎖定,禁止繼承類修改它(即不會被重寫)
在JavaSE5之前,使用final可以提高效率,但目前已過時
類中所有private方法都隱式的指定是final的,在private方法前添加final是沒有額外意義的。
private修飾的方法,不屬于基類接口一部分,他僅僅是隱藏在類中的一部分代碼。因此如果你在導(dǎo)出類中“覆蓋”了基類的private方法,其實并沒有覆蓋private方法,而產(chǎn)生了一個新方法。
7.8.3 final類將final放在class前做修飾,表明該類無法進行繼承
final類中的域和普通類的域并無差別
final類隱式的將該類中所有的方法指定為final,所以在final類中給方法添加final關(guān)鍵詞沒有意義。
7.8.4 final的忠告要考慮清楚?。?!
7.9 初始化及類的加載每個類的編譯代碼.class都存在于獨立的文件中,該文件只在需要的使用程序代碼時才會被加載。
按照父類到子類的順序加載static變量
構(gòu)造子類對象時,先構(gòu)造父類對象。
public class Test extends TestParents { // (a) static屬性 static String staticProperty; // (b) 構(gòu)造方法 public Test() { System.out.println("Test constructor"); } // (c) static代碼塊 { staticProperty = print("Test static property"); System.out.println("Test static"); } // (d) 非static代碼屬性 String property = print("Test property"); public static void main(String[] args) { // (1):System.out.println(Test.staticProperty); // TestParents static property // null(因為static代碼塊中的代碼要創(chuàng)建對象才執(zhí)行) // (2):Test test = new Test(); // TestParents static property // TestParents property // TestParents static // TestParents constructor // Test static property // Test static // Test property // Test constructor } } class TestParents { static String staticProperty = print("TestParents static property"); String property = print("TestParents property"); { System.out.println("TestParents static"); } public TestParents() { System.out.println("TestParents constructor"); } static String print(String str) { System.out.println(str); return str; } }
靜態(tài)變量 >> 靜態(tài)代碼塊
三者順序:代碼塊 == 非static屬性 >> 構(gòu)造方法;即代碼塊和非static屬性按照代碼中順序排序,構(gòu)造函數(shù)在最后面
上述Test類的代碼,反編譯后的結(jié)果如下所示:
public Test() { staticProperty = print("Test static property"); System.out.println("Test static"); property = print("Test property"); System.out.println("Test constructor"); }7.10 總結(jié)
優(yōu)先選擇組合和代理,必要時才使用繼承。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/72176.html
摘要:在設(shè)計模式中,所有的設(shè)計模式都遵循這一原則。其實就是說在應(yīng)用程序中,所有的類如果使用或依賴于其他的類,則應(yīng)該依賴這些其他類的抽象類,而不是這些其他類的具體類。使用設(shè)計模式是為了可重用代碼讓代碼更容易被他人理解保證代碼可靠性。 這是劉意老師的JAVA基礎(chǔ)教程的筆記講的賊好,附上傳送門 傳智風(fēng)清揚-超全面的Java基礎(chǔ) 一、面向?qū)ο笏枷朐O(shè)計原則 1.單一職責(zé)原則 其實就是開發(fā)人員經(jīng)常說的高...
摘要:抽象類和抽象方法抽象方法這種方法是不完整的,僅有聲明而沒有方法。創(chuàng)建抽象類和抽象方法非常有用,因為他們可以使累的抽象性明確起來,并告訴用戶和編譯器打算怎樣來使用它們。接口用于建立類于類之間的協(xié)議。與抽象類相同,防止客戶端程序員創(chuàng)建該類對象。 點擊進入我的博客 接口和內(nèi)部類為我們提供了一種將接口與實現(xiàn)分離的更加結(jié)構(gòu)化的方法。 9.1抽象類和抽象方法 抽象方法:這種方法是不完整的,僅有...
摘要:前言編程思想這本書,陸陸續(xù)續(xù)讀了年,終于基本都瀏覽了一遍。每個對象對外暴露接口,程序通過對象暴露的接口向?qū)ο蟀l(fā)送消息,獲取該對象的服務(wù)能力。異常處理異常處理,為編寫程序階段提供了一種預(yù)見性的防止程序崩潰的出路。 前言 《Java編程思想》這本書,陸陸續(xù)續(xù)讀了1年,終于基本都瀏覽了一遍。通過這本書,試圖理解作者的想法,才真的體會到Java思想。感謝本書的作者,不僅講述了java的語法,更...
摘要:而面向?qū)ο髣t是向程序員提供表示問題空間中元素的工具,我們將問題空間中的元素及其在解空間中的表示稱為對象。為什么要把對象看作是服務(wù)提供者呢這是將問題分解為對象集合的一種合理方式。職能太多,可能會導(dǎo)致對象的內(nèi)聚性降低。在試圖將子類對象當(dāng)作其基類 計算機是頭腦延伸的工具,是一種不同類型的表達媒體。本文以背景性的和補充性的材料,介紹包括開發(fā)方法概述在內(nèi)的面向?qū)ο蟪绦蛟O(shè)計(Object-orie...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1995·2021-09-26 10:19
閱讀 3268·2021-09-24 10:25
閱讀 1658·2019-12-27 11:39
閱讀 1940·2019-08-30 15:43
閱讀 687·2019-08-29 16:08
閱讀 3517·2019-08-29 16:07
閱讀 918·2019-08-26 11:30
閱讀 1281·2019-08-26 10:41