本文章已授權(quán)玉剛說微信公眾號獨家發(fā)布
Java 子父類相互轉(zhuǎn)換
這個涉及到面向?qū)ο筇匦灾鄳B(tài),考驗?zāi)銓@個特性理解是否徹底违崇,接下來舉例兩個常用的 API 來解釋這個問題
子類轉(zhuǎn)父類(setContentView)
setContentView 需要一個 View 類型的參數(shù)阿弃,這里傳入 View 的子類 TextView
這里可以看到編譯并沒有任何問題,接下來運行一下
也是沒有問題的羞延,證明了子類可以代替父類(子類轉(zhuǎn)父類完全OK)
父類轉(zhuǎn)子類(findViewById)
findViewById 最后返回 View 的子類恤浪,這里我們先按常規(guī)寫法過一遍
我現(xiàn)在突然有一個大膽的想法
那我想強轉(zhuǎn)成 ImageView 試試看會怎么樣
雖然 findViewById 可以強轉(zhuǎn)成 View 的子類,但是本質(zhì)獲取到的還是 XML 中的那個類型 View肴楷,XML 中是 TextView,findViewById 獲取到也只能是 TextView荠呐,如果強轉(zhuǎn)成 ImageView 一定會報類型轉(zhuǎn)換異常
在這里再總結(jié)一下赛蔫,父類是可以轉(zhuǎn)成子類的,但是有一個前提條件泥张,那就是它本質(zhì)上就是這個子類的對象
基本數(shù)據(jù)類型和對象
看到這里呵恢,你是否曾以為基本數(shù)據(jù)類型和對象一樣了?
然后事實并非如此媚创,這里將 int 置為空編譯不通過
基本數(shù)據(jù)類型和對象之間有很大的區(qū)別渗钉,基本數(shù)據(jù)類型只能是一個數(shù)值,而對象可以有變量和方法钞钙,int 的默認值為0鳄橘,而 Integer 的默認值為 null,因為它們本身就是兩種不同的東西
switch 不止可以判斷 int
從 Java JDK 1.7 開始芒炼,switch 語句就可以開始支持判斷 string 對象 和 enum 枚舉
string 中 equals 的兩種用法區(qū)別
列舉一個簡單的案例
將文本對象置為空后再次運行
拋出了空指針異常瘫怜,所以推薦第一種寫法來避免空指針異常
變量 == 對象 ?
這個也是面向?qū)ο笏枷氲囊徊糠直竟簦覀兛梢园讶吮茸饕粋€對象鲸湃,把變量比作人的姓名赠涮,而一個人可以有多個姓名,但實際只有一個人暗挑。
要想獲得新的對象笋除,可以使用以下三種方式
new
克隆
序列化
每個類其實都是 Object 的子類
我們知道 Object 類中有 equals 和 toString ,如果我們不繼承至 Object 是不是沒有這些方法了炸裆?
事實并非如此垃它,其實我們創(chuàng)建一個類,什么都不繼承晒衩,但只要它是一個類嗤瞎,就一定是 Object 的子類,就會擁有 Object 的屬性和方法听系。我說了這么多贝奇,你還是不相信?請看下圖
泛型限定的坑
一個泛型可以限定一個繼承類和多個實現(xiàn)接口
你是否和我一樣靠胜,限定泛型是這樣的掉瞳,然而編譯卻不給過
實際需要這樣定義泛型,并不能使用 implements
如果將接口類放在前面再試試浪漠,提示后面只能放接口類
被 final 修飾的對象
我們常常誤以為陕习,被 final 修飾對象不能被修改,其實這種說法不是完全正確的
修改這個對象的成員變量是沒有任何問題的
但是不能對這個對象進行重新賦值
setOnClickListener(this) 的好處
在開發(fā)中址愿,我們通常對 View 設(shè)置點擊監(jiān)聽是這樣子的
如果這個界面有很多個 View 要設(shè)置監(jiān)聽呢该镣?就變成了這樣
監(jiān)聽一多代碼就很亂了,我們要必須要經(jīng)過一些優(yōu)化
這樣的好處在于可以提高代碼的可閱讀性响谓,又可以復(fù)用同一個對象损合,達到對象優(yōu)化的效果
if else 語句層級嵌套
當你看到這樣子的代碼,都會覺得自己想靜一靜
其實這種寫法在一些老項目很常見娘纷,我們也極有為這種代碼寫好了鋪墊嫁审,所以讓我們用規(guī)范的寫法避開這種坑吧
我們可以用 switch 語句,但是有一定局限性(只能判斷 int赖晶,string律适,enum),所以當我們不能用 switch 語句的時候可以使用以下方式減少判斷語句層級嵌套
啥遏插?這不是跟剛剛的差不多捂贿?那你可以考慮換下面這種寫法
重寫和重載分不清楚
重寫父類的 toString 方法
重載父類的 toString 方法