程序员基本功 07 面向对象的陷阱
1、instaceof運算符的陷阱
instanceof運算符的前一個操作數(shù)通常是一個引用類型的變量,后一個操作數(shù)通常是一個類,它用于判斷前面的對象是否是后面的類或其子類、實現(xiàn)類的實例。
instanceof運算符有一個限制:要么與后面的類相同,要么是后面類的父類、要么是后面類型的子類。
使用null調(diào)用instanceof運算符時返回false時非常有用的行為,因為這可以保證第一個操作數(shù)所引用的對象不是null。
2、構(gòu)造器不能使用void聲明返回值
構(gòu)造器是java每個類都會提供的一個特殊方法,負(fù)責(zé)對java對象執(zhí)行初始化操作,不管是定義實例變量時指定的初始值,還是在非靜態(tài)初始化塊中所做的操作,實際都會被提取到構(gòu)造器中被執(zhí)行。
3、構(gòu)造器只是初始化對象
在構(gòu)造器執(zhí)行之前,Java對象所需的內(nèi)存空間,應(yīng)該說是由new關(guān)鍵字申請出來的。然后使用構(gòu)造器對這個對象進行初始化。
一些時候程序創(chuàng)建Java對象時無需調(diào)用構(gòu)造函數(shù),可使用反序列化的方式恢復(fù)Java對象;使用clone方法分支Java對象。如果希望Java類的實例是可復(fù)制的,對該類有倆個要求:讓該Java類實現(xiàn)Cloneable接口,為Java類提供colne()方法,該方法負(fù)責(zé)進行復(fù)制。
4、避免無限遞歸的構(gòu)造器
- 盡量不要在定義實例變量時指定實例變量的值為當(dāng)前類的實例;
- 盡量不要在初始化塊中創(chuàng)建當(dāng)前類的實例;
- 盡量不要在構(gòu)造器內(nèi)調(diào)用本構(gòu)造器創(chuàng)建的Java對象
5、區(qū)分重載的方法
第一階段JVM將會選取所有可獲得并匹配調(diào)用的方法或構(gòu)造器,到底調(diào)用哪個方法,此時JVM會在第一階段所選取的方法或構(gòu)造器中再次選取更精準(zhǔn)匹配的那一個。
6、private方法不能重寫
子類不能訪問父類的private方法。
7、包訪問權(quán)限的方法也可能無法重寫
對于不使用訪問控制修飾符修飾的方法,它只能被與當(dāng)前類處于同一個包中的其他類訪問,其他包中的子類依然無法訪問該方法。若其子類與該類處于同一個包中,子類可以重寫父類的方法;否則,子類將不能重寫父類的方法。
8、非靜態(tài)內(nèi)部類的構(gòu)造器必須傳入外部類的實例
內(nèi)部類能提供更好的封裝,而且可以直接訪問外部類的private成員。
9、非靜態(tài)內(nèi)部類不能擁有靜態(tài)成員
推薦使用靜態(tài)內(nèi)部類
10、static關(guān)鍵字的作用
? static是一個修飾符,它用于修飾類里定義的:Field、方法、內(nèi)部類、初始化塊、內(nèi)部枚舉類。static的作用就是把類里定義的成員變成靜態(tài)成員,也就是類成員。
被static修飾的成員屬于類本身,而不是單個的Java對象,
11、靜態(tài)內(nèi)部類不能訪問外部類的非靜態(tài)成員
?
12、native方法跨平臺時可能有問題
對于native方法而,Java程序不會為該方法提供實現(xiàn)體。native方法通常需要借助C語言來完成,即需要使用C為Java提供實現(xiàn)。其實現(xiàn)步驟:
總結(jié)
以上是生活随笔為你收集整理的程序员基本功 07 面向对象的陷阱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员基本功08异常捕捉的陷阱
- 下一篇: 程序员基本功 06 流程控制的陷阱