靜態(tài)內(nèi)部類與非靜態(tài)內(nèi)部類的區(qū)別

Java中的內(nèi)部類又分為非靜態(tài)內(nèi)部類(匿名內(nèi)部類也是非靜態(tài)的內(nèi)部類)和靜態(tài)內(nèi)部類惶傻,兩者與外部類的關(guān)系是不一樣的挖胃,創(chuàng)建的方式也不一樣辽剧。

1 非靜態(tài)內(nèi)部類
Java的非靜態(tài)內(nèi)部類在構(gòu)造的時候族淮,會將外部類的引用傳遞進(jìn)來椭迎,并且作為內(nèi)部類的一個屬性彰阴,因此瘾敢,內(nèi)部類會隱式地持有其外部類的引用。也就是非靜態(tài)內(nèi)部類在構(gòu)造的時候需要有一個外部類的實例傳遞進(jìn)來進(jìn)行構(gòu)造尿这,不能像普通的Java類那樣直接就可以通過 new來生成簇抵;一個簡單的例子如下:

1 import java.util.ArrayList;
 2 import java.util.LinkedList;
 3 import java.util.List;
 4 import java.util.Queue;
 5 import java.util.Scanner;
 6 
 7 public class Main {
 8 
 9     /**
10      * @param args
11      */
12     public  int k=3;
13     private static String string="Java";
14     protected float j=1.5f;
15     public static void show(){
16         System.out.println("show");
17     }
18     private void add(){
19         System.out.println("add");
20     }
21     public static void main(String[] args) {
22         // TODO Auto-generated method stub
23         Main m=new Main();
24         //合法的非靜態(tài)內(nèi)部類的構(gòu)造方式
25         Child c=m.new Child();
26         //Child c=new Child() 這是不合法的構(gòu)造方式
27         c.test();
28  
29     }
30 //內(nèi)部類Child
31   class Child{
32      public int i;
33      public void test(){
34          System.out.println("k=:"+k);
35          System.out.println("string:"+string);
36          add();
37          System.out.println("j=:"+j);
38          show();
39      }
40      
41  }
42 
43 }

并且非靜態(tài)的內(nèi)部類可以訪問外部類的所有成員變量與方法,包括靜態(tài)的成員變量與方法,執(zhí)行內(nèi)部類Child的test()方法就可以得到下面的結(jié)果:

1 k=:3
2 string:Java
3 add
4 j=:1.5
5 show

2 靜態(tài)內(nèi)部類
Java中的靜態(tài)內(nèi)部類在構(gòu)造的時候并不需要外部類的引用妻味,因此靜態(tài)的內(nèi)部類不會持有外部類的引用正压,并且靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員變量和方法。一個簡單的例子為(上面的代碼做一些簡單的改動):

public class Main {
 2 
 3     /**
 4      * @param args
 5      */
 6     public  int k=3;
 7     private static String string="Java";
 8     protected float j=1.5f;
 9     public static void show(){
10         System.out.println("show");
11     }
12     private void add(){
13         System.out.println("add");
14     }
15     public static void main(String[] args) {
16         // TODO Auto-generated method stub
17         Main m=new Main();
18         //Child c=m.new Childe();//非法
19         Child c=new Child();
20         c.test();
21  
22     }
23   static class Child{
24      public int i;
25     
26      public void test(){
27 //         System.out.println("k=:"+k);//不能訪問外部類非靜態(tài)變量
28          System.out.println("string:"+string);
29          //add(); //不能訪問外部類的非靜態(tài)方法
30 //         System.out.println("j=:"+j);
31          show();
32      }
33      
34  }
35 
36 }

從上面的代碼可以看到责球,靜態(tài)內(nèi)部類的創(chuàng)建方式與普通的Java類的創(chuàng)建方式一樣焦履,執(zhí)行第21行代碼就可以得到如下結(jié)果:

1 string:Java
2 show

3 雜談
Java的非靜態(tài)內(nèi)部類的這種創(chuàng)建方式拓劝,會隱式地持有外部類的引用,而且默認(rèn)情況下這個引用是強(qiáng)引用嘉裤,因此郑临,如果內(nèi)部類的生命周期長于外部類的生命周期,程序很容易就產(chǎn)生內(nèi)存泄漏(你認(rèn)為垃圾回收器會回收掉外部類的實例屑宠,但由于內(nèi)部類持有外部類的引用厢洞,導(dǎo)致垃圾回收器不能正常工作)。為了避免這種情況的發(fā)生典奉,你可以在內(nèi)部類的內(nèi)部顯示持有一個外部類的軟引用(或弱引用)躺翻,并通過構(gòu)造方法的方式傳遞進(jìn)來,在內(nèi)部類的使用過程中卫玖,先判斷一下外部類是否被回收公你;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市假瞬,隨后出現(xiàn)的幾起案子陕靠,更是在濱河造成了極大的恐慌,老刑警劉巖脱茉,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剪芥,死亡現(xiàn)場離奇詭異,居然都是意外死亡琴许,警方通過查閱死者的電腦和手機(jī)税肪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虚吟,“玉大人寸认,你說我怎么就攤上這事〈浚” “怎么了偏塞?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長邦鲫。 經(jīng)常有香客問我灸叼,道長,這世上最難降的妖魔是什么庆捺? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任古今,我火速辦了婚禮,結(jié)果婚禮上滔以,老公的妹妹穿的比我還像新娘捉腥。我一直安慰自己,他們只是感情好你画,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布抵碟。 她就那樣靜靜地躺著桃漾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拟逮。 梳的紋絲不亂的頭發(fā)上撬统,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機(jī)與錄音敦迄,去河邊找鬼恋追。 笑死,一個胖子當(dāng)著我的面吹牛罚屋,可吹牛的內(nèi)容都是我干的苦囱。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼沿后,長吁一口氣:“原來是場噩夢啊……” “哼沿彭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尖滚,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞧柔,沒想到半個月后漆弄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡造锅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年撼唾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哥蔚。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡倒谷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糙箍,到底是詐尸還是另有隱情渤愁,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布深夯,位于F島的核電站抖格,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏咕晋。R本人自食惡果不足惜雹拄,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掌呜。 院中可真熱鬧滓玖,春花似錦、人聲如沸质蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至殊霞,卻和暖如春摧阅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绷蹲。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工棒卷, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祝钢。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓比规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拦英。 傳聞我的和親對象是個殘疾皇子蜒什,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法疤估,內(nèi)部類的語法灾常,繼承相關(guān)的語法,異常的語法铃拇,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • 第二節(jié)課下課的課間操結(jié)束后钞瀑,是我們班的武術(shù)課,今天的武術(shù)課沒有學(xué)新的內(nèi)容慷荔,就是鞏固之前學(xué)的雕什。 在上...
    王昱凱閱讀 201評論 0 0
  • 上輩子你們是碳酸飲料吧?不然為什么我看到你們就開心得冒泡呢苗苗的:貴州的意思 蠢蠢的显晶,土土的美育是一種剛需(人民日...
    dq920813閱讀 142評論 0 0
  • 近日贷岸,某某領(lǐng)導(dǎo)初學(xué)易經(jīng),沉迷風(fēng)水磷雇,每每閑暇之時偿警,便借會議之名,為下屬逐一算卦倦春。每每到欣然之處户敬,便高談?wù)撻煟瑥奶珮O陰...
    順手給我new一個對象閱讀 1,764評論 1 0