java的內(nèi)部類和靜態(tài)內(nèi)部類(嵌套類)

背景

開發(fā)新項(xiàng)目舅逸,寫Swager的mode的時(shí)候用到了嵌套Model刽严,于是在代碼中蹬碧,出現(xiàn)了靜態(tài)內(nèi)部類舱禽。在codeReview的時(shí)候稍微和大家聊了一下。尤其是Static 修飾類和修飾對(duì)象和變量不一樣呢恩沽?

定義

1. 內(nèi)部類

1.可以將一個(gè)類的定義放在另一個(gè)類的定義內(nèi)部誊稚,這就是內(nèi)部類;

2.嵌套類是其封閉類的成員罗心。非靜態(tài)嵌套類(內(nèi)部類)可以訪問封閉類的其他成員里伯,即使它們被聲明為私有的也是如此。靜態(tài)嵌套類無(wú)權(quán)訪問封閉類的其他成員渤闷。為一體的一個(gè)部件OuterClass疾瓮,一個(gè)嵌套類可以聲明private,public飒箭,protected狼电,或包專用蜒灰。(回想一下,只能聲明外部類public或?qū)⑵浒b為私有肩碟。)

2. 靜態(tài)內(nèi)部類

1.再一個(gè)普通類里面强窖,給內(nèi)部類加上static關(guān)鍵字的修飾;

2.與類方法和變量一樣削祈,靜態(tài)嵌套類與其外部類相關(guān)聯(lián)翅溺。與靜態(tài)類方法一樣,靜態(tài)嵌套類不能直接引用其封閉類中定義的實(shí)例變量或方法:它只能通過對(duì)象引用來(lái)使用它們髓抑。(就和兩個(gè)普通不同的類之間的使用)

3. 兩者的區(qū)別

1.內(nèi)部類只是外部類的成員變量未巫,通俗講,就是你只能通過先調(diào)用外部類才能去拿到這個(gè)類(但是這是和組合還是有區(qū)別的)启昧。

2.但是靜態(tài)內(nèi)部類就像是一個(gè)普通類一樣叙凡。可以直接調(diào)用密末,直接去new對(duì)象握爷。

4. Java 擁有嵌套類有什么作用呢?

1.這是一種對(duì)僅在一個(gè)地方使用的類進(jìn)行邏輯分組的方法:如果一個(gè)類僅對(duì)另一個(gè)類有用严里,那么將其嵌入該類并將兩者保持在一起是合乎邏輯的新啼。嵌套此類“幫助程序類”可使它們的程序包更加簡(jiǎn)化。

2.它增加了封裝:考慮兩個(gè)頂級(jí)類A和B刹碾,其中B需要訪問A的成員燥撞,否則將對(duì)其進(jìn)行聲明private。通過將類B隱藏在類A中迷帜,可以將A的成員聲明為私有物舒,而B可以訪問它們。另外戏锹,B本身可以對(duì)外界隱藏冠胯。

3.這可能會(huì)導(dǎo)致代碼更具可讀性和可維護(hù)性:在頂級(jí)類中嵌套小類會(huì)使代碼更靠近使用位置。

Demo

talk is cheap 锦针,Show me Code荠察;

package 靜態(tài)內(nèi)部類;

import com.sun.tools.internal.xjc.reader.xmlschema.bindinfo.BIConversion;
import javassist.runtime.Inner;
import lombok.Data;

/**
 * @authoryuanxindong
 * @date: 2020/6/19 10:25 下午
 */
@Data
public class OuterClassDemo {
    String outerStr;

    public OuterClassDemo(String outerStr) {
        this.outerStr = outerStr;
    }

    @Data
    public static class StaticInnerClass{
        public StaticInnerClass(String innerStr) {
            this.innerStr = innerStr;
        }

        private  String  innerStr;

    }
    @Data
    public class InnerClass{
        private String innerClassStr;
        public InnerClass(String outerStr) {
            //可以和外部類通訊
            this.innerClassStr = getOuterStr();
        }
    }

    public static void main(String[] args) {
        OuterClassDemo staticClassDemo =new OuterClassDemo("Outer");
        staticClassDemo.getOuterStr();
        // 內(nèi)部正常類是不能直接new出來(lái)的
        //  OuterClass outerClass = new OuterClass();
        StaticInnerClass innerClass = new StaticInnerClass("StaticInner");
        System.out.println(innerClass.getInnerStr());
        initInnerClass();
    }
    public static void initInnerClass(){
        OuterClassDemo staticClassDemo1 = new OuterClassDemo("OuterClassDemo");
        InnerClass innerClass = staticClassDemo1.new InnerClass("outerStr");
        System.out.println(innerClass.getInnerClassStr());
    }
}

注意事項(xiàng)

1.序列化強(qiáng)烈建議不要對(duì)內(nèi)部類(包括 本地和 匿名類)進(jìn)行序列化。當(dāng)Java編譯器編譯某些構(gòu)造(例如內(nèi)部類)時(shí)奈搜,它會(huì)創(chuàng)建綜合構(gòu)造悉盆。

2.這些是類,方法馋吗,字段以及其他在源代碼中沒有相應(yīng)構(gòu)造的構(gòu)造焕盟。合成構(gòu)造使Java編譯器無(wú)需更改JVM就可以實(shí)現(xiàn)新的Java語(yǔ)言功能。但是耗美,合成構(gòu)造在不同的Java編譯器實(shí)現(xiàn)中可能有所不同京髓,這意味著.class文件在不同的實(shí)現(xiàn)中也可能有所不同航缀。因此,如果序列化一個(gè)內(nèi)部類堰怨,然后使用其他JRE實(shí)現(xiàn)對(duì)其進(jìn)行反序列化芥玉,則可能會(huì)遇到兼容性問題。

核心討論

1.了解了靜態(tài)內(nèi)部類后备图,那static為什么修飾了類灿巧,對(duì)于這個(gè)類也是起了一個(gè)全局可用的一個(gè)作用?

2.越想問題越多揽涮,還有就是為什么被Static 修飾的方法可以被類直接引用到抠藕?而static 修飾的類也可以被其他的類直接使用,而不依賴于對(duì)象蒋困。

答 :我們得明確一下

1.static修飾類的方法盾似,表示這個(gè)方法和這個(gè)類對(duì)象沒有關(guān)系,只是和這個(gè)類有關(guān)系

2.static 修飾變量雪标,按照是否靜態(tài)的對(duì)類成員變量進(jìn)行分類可分兩種:一種是被static修飾的變量零院,叫靜態(tài)變量或類變量;另一種是沒有被static修飾的變量村刨,叫實(shí)例變量告抄。兩者的區(qū)別是:

3.對(duì)于靜態(tài)變量在內(nèi)存中只有一個(gè)拷貝(節(jié)省內(nèi)存),JVM只為靜態(tài)分配一次內(nèi)存嵌牺,在加載類的過程中完成靜態(tài)變量的內(nèi)存分配打洼,可用類名直接訪問(方便),當(dāng)然也可以通過對(duì)象來(lái)訪問(但是這是不推薦的)逆粹。

4.好的募疮,是這樣的。static修飾對(duì)象 可以全局使用枯饿,修飾方法可以不依賴于對(duì)象酝锅,修飾類诡必,也不用依賴與他的對(duì)象奢方,也可以被其他的類直接使用,或者自己進(jìn)行初始化爸舒。

總結(jié)

1.嵌套類:內(nèi)部類和靜態(tài)內(nèi)部類

2.內(nèi)部類屬于外部類的成員蟋字,必須依賴與外部對(duì)象來(lái)實(shí)現(xiàn),靜態(tài)內(nèi)部類扭勉,不依賴鹊奖,可以自己?jiǎn)为?dú)實(shí)現(xiàn)。

3.static 的修飾 變量涂炎,類忠聚,方法设哗,代碼塊。 共性全局性两蟀。變量的話也就是全劇唯一性网梢,會(huì)出現(xiàn)多個(gè)飲用,但不會(huì)出現(xiàn)多個(gè)存儲(chǔ)赂毯。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末战虏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子党涕,更是在濱河造成了極大的恐慌烦感,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膛堤,死亡現(xiàn)場(chǎng)離奇詭異手趣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肥荔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門回懦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人次企,你說我怎么就攤上這事怯晕。” “怎么了缸棵?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵舟茶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我堵第,道長(zhǎng)吧凉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任踏志,我火速辦了婚禮阀捅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘针余。我一直安慰自己饲鄙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布圆雁。 她就那樣靜靜地躺著忍级,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伪朽。 梳的紋絲不亂的頭發(fā)上轴咱,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼朴肺。 笑死窖剑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的戈稿。 我是一名探鬼主播苛吱,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼器瘪!你這毒婦竟也來(lái)了翠储?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤橡疼,失蹤者是張志新(化名)和其女友劉穎援所,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣除,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡住拭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了历帚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滔岳。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖挽牢,靈堂內(nèi)的尸體忽然破棺而出谱煤,到底是詐尸還是另有隱情,我是刑警寧澤禽拔,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布刘离,位于F島的核電站,受9級(jí)特大地震影響睹栖,放射性物質(zhì)發(fā)生泄漏硫惕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一野来、第九天 我趴在偏房一處隱蔽的房頂上張望恼除。 院中可真熱鬧,春花似錦曼氛、人聲如沸豁辉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秋忙。三九已至,卻和暖如春构舟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工狗超, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弹澎,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓努咐,卻偏偏與公主長(zhǎng)得像苦蒿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渗稍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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