[Java基礎(chǔ)]內(nèi)部類與向上轉(zhuǎn)型來隱藏實現(xiàn)

內(nèi)部類有很多用法慨蓝,比如設(shè)置匿名內(nèi)部類來完成監(jiān)聽器的功能秸滴,比如使用一個內(nèi)部類來進(jìn)行一些有利自己編碼的設(shè)計雹嗦,外部類采用內(nèi)部類的實例對象來進(jìn)行操作啥酱。

我們都知道外部類只能設(shè)計成public或者default冠跷,不能修飾為private和protected南誊。但是內(nèi)部類則不同,內(nèi)部類可以被protected和private修飾蜜托,而也正因為如此抄囚,內(nèi)部類有了更高級的用法

private修飾的內(nèi)部類


public class A {    
    String name;    
    private class B{
        long identityId;
        public void testB(){
            System.out.println("I am B");
        }
    }
    public B getB(){
        return new B();
    }
}
我們在A中創(chuàng)建了一個private內(nèi)部類B,添加了一個方法getB()想去嘗試獲取這個B類橄务,如下

class test{
    public static void main(String[] args) {
        A a = new A();
        A.B ab = a.getB(); //can't get A.B because of private
    }
}

很可惜幔托,我們在另一個類test中,創(chuàng)建一個A的實例蜂挪,然后去調(diào)用getB()重挑,但是我們無法獲取A.B,也就無法使用B中的testB方法了棠涮。

是不是我們真的無法在別的類中獲取這個B的實例谬哀,無法調(diào)用B的方法呢?

不然

我們可以借助向上轉(zhuǎn)型严肪,先創(chuàng)建一個接口C

interface C{
    void testB();
}

然后讓內(nèi)部類B去實現(xiàn)它

public class A {
    String name;
    private class B implements C{  //changes here. Implements C
        long identityId;                    
        public void testB(){
            System.out.println("I am B");
        }
    }
    public B getB(){
        return new B();
    }
}

那么現(xiàn)在我們在回去修改test類里的代碼史煎、

class test{
    public static void main(String[] args) {
        A a = new A();
        C ab = a.getB();  //we get a C 
        ab.testB();   //use testB 
    }
}

小結(jié)


我們通過一個接口C谦屑,然后private內(nèi)部類去實現(xiàn)它,從而讓我們可以借助向上轉(zhuǎn)型獲取到內(nèi)部類B的一個引用劲室。但是仍有一個問題伦仍,獲取到后可以調(diào)用B實現(xiàn)接口C的那些方法结窘,但是我們?nèi)匀徊恢繠中的具體細(xì)節(jié)很洋,

優(yōu)點:這就體現(xiàn)了一種很好的封裝,也完全阻止了任何依賴于類型的編碼隧枫。

protected修飾的內(nèi)部類


這種情況比較簡單喉磁,就是如果內(nèi)部類B的修飾是protected,那么A類的所有子類是可以任意獲取到A的內(nèi)部類B的官脓,但是其它類不行协怒。

讀者可以根據(jù)上面的例子,自行嘗試卑笨,這里不贅述孕暇。

總結(jié)

本節(jié)主要記錄了內(nèi)部類的一種設(shè)計方法,可以通過給內(nèi)部類private修飾赤兴,完全隱藏實現(xiàn)的細(xì)節(jié)妖滔,只提供一個外部接口,同時因為使用的是接口桶良,所以也完全阻止任何依賴于類型的編碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末座舍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子陨帆,更是在濱河造成了極大的恐慌曲秉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疲牵,死亡現(xiàn)場離奇詭異承二,居然都是意外死亡,警方通過查閱死者的電腦和手機纲爸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門亥鸠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人缩焦,你說我怎么就攤上這事读虏。” “怎么了袁滥?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵盖桥,是天一觀的道長。 經(jīng)常有香客問我题翻,道長揩徊,這世上最難降的妖魔是什么腰鬼? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮塑荒,結(jié)果婚禮上熄赡,老公的妹妹穿的比我還像新娘。我一直安慰自己齿税,他們只是感情好彼硫,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凌箕,像睡著了一般拧篮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上牵舱,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天串绩,我揣著相機與錄音,去河邊找鬼芜壁。 笑死礁凡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慧妄。 我是一名探鬼主播顷牌,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼腰涧!你這毒婦竟也來了韧掩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤窖铡,失蹤者是張志新(化名)和其女友劉穎疗锐,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體费彼,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡滑臊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了箍铲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雇卷。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖颠猴,靈堂內(nèi)的尸體忽然破棺而出关划,到底是詐尸還是另有隱情,我是刑警寧澤翘瓮,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布贮折,位于F島的核電站,受9級特大地震影響资盅,放射性物質(zhì)發(fā)生泄漏调榄。R本人自食惡果不足惜踊赠,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望每庆。 院中可真熱鬧筐带,春花似錦、人聲如沸缤灵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凤价。三九已至鸽斟,卻和暖如春拔创,著一層夾襖步出監(jiān)牢的瞬間利诺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工剩燥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留慢逾,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓灭红,卻偏偏與公主長得像侣滩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子变擒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法君珠,類相關(guān)的語法,內(nèi)部類的語法娇斑,繼承相關(guān)的語法策添,異常的語法,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • Win7下如何打開DOS控制臺毫缆? a:開始--所有程序--附件--命令提示符 b:開始--搜索程序和文件--cmd...
    逍遙嘆6閱讀 1,595評論 4 12
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理唯竹,服務(wù)發(fā)現(xiàn),斷路器苦丁,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 小編費力收集:給你想要的面試集合 1.C++或Java中的異常處理機制的簡單原理和應(yīng)用浸颓。 當(dāng)JAVA程序違反了JA...
    八爺君閱讀 4,587評論 1 114
  • 山中一著意 水上即變了顏色 一方老鐵痛鎖孤獨 晚年癡債統(tǒng)統(tǒng)放出去 袖手枯等雨激開竅 最后之晚餐 總是晚過歸人之晚 ...
    一位手藝人閱讀 784評論 13 20