Java 靜態內部類與非靜態內部類 學習記錄.

來源:互聯網
上載者:User

標籤:

目的

  為什麼會有這篇文章呢,是因為我在學習各種架構的時候發現很多架構都用到了這些內部類的小技巧,雖然我平時寫代碼的時候基本不用,但是看別人代碼的話至少要瞭解基本知識吧,另外到底內部類應該應用在哪些場合,我並不是很清楚,留下一些值得思考的問題作為記錄,說不定以後能自己來填。於是就會有這篇文章啦。

  常規使用方法我也不想介紹,網上一大把,我就說說比較容易錯的,值得注意的地方。

 

注意

  這篇文章只是分享一下我對內部類的一些研究與困惑吧,說不定對大家有協助,說不定能引導大家一起思考學習。Java文法知識其實是很複雜很容易錯的,特別是在細節方面。所以我的觀點可能會有各種錯誤。

  另外我的JDK版本是1.7。JDK1.8的版本貌似對內部類的規則有一些修改,所以請大家注意。

 

非靜態非匿名內部類不能擁有static成員

網上大部分文章的說法大致是這樣的,就是告訴你這種內部類不能擁有static的方法,屬性。其實這句話有那麼點小問題。非靜態內部類也可以擁有static的屬性的(static區塊不行),但是要求這個static屬性必須是常量,這個地方經過我的研究,我覺得和 “調用類的static屬性,但卻不會初始化這個類的static區塊和其他static變數” 有點相似。什麼意思?就是說

1 class Outter{2     class Inner{3         final static int a = 9; 4     }5 }

這樣是沒有編譯錯誤的。要求靜態變數a必須是final類型的,且是基本類型,且是字面值

1 class Outter{2     class Inner{3         final static int a = get(); 4     }5     6     static int get(){7         return 1;8     }9 }

這樣就會報錯,因為a不是字面值。

這裡我想請大家看一下我的另外一篇學習記錄,這種變數是不會觸發類初始化的。

地址:http://www.cnblogs.com/abcwt112/p/4567332.html 分析標題下面的第二小點。

當然,這種字面值貌似沒什麼卵用啊。。。。所以說這種內部類不能有static成員大致上好像也算對吧。。

為什麼不能擁有static成員?

我覺得道理是這樣的(個人理解)。非靜態內部類是和普通成員一樣的,是隸屬於外部類對象的,建立這種內部類對象需要先建立外部類對象。也就是說這種內部類是不能單獨於外部類對象存在的。這個道理大家都明白,一個成員變數怎麼能脫離於類的對象獨立存在呢。那假設這種內部類可以擁有static的屬性,比如static int a = 1;那這個a資料存在哪裡呢?根據前面的分析,應該是存在於分配給外部類對象擁有的記憶體中的,那麼等外部類對象唄銷毀以後,這個a分配的記憶體也會被銷毀。這樣的話修改這個a毫無意義,因為每次都是重新分配記憶體,每次值都是1。所以這個static沒什麼用,並不是全域的。

這個問題我是這麼理解的。我覺得等我看完JVM虛擬機器(我覺得有可能final static int與static int變數值存的地方可能不一樣)或者學習彙編(可以觀察資料是怎麼儲存的)以後再看它可能會有更深的理解。

 

靜態內部類只能調用外部類的靜態方法與屬性

這點蠻好理解,就像靜態方法main裡不能調用非靜態屬性,方法一樣。但是這並不代表靜態內部類就不能定義 非靜態方法和屬性。它不能調用外部類的非靜態成員,但是卻可以在自己內部定義。畢竟它是個類。。。。

 1 public class StaticTest { 2     static int a = 9; 3      4     private static class Inner{ 5         public static void main(String[] args) { 6             System.out.println(StaticTest.a); 7         } 8          9         public void doSomething(){10             11         }12     }13     public static class Inner2{14     }15 }

這裡代碼就沒有什麼問題,能編譯通過(doSomething方法)。

用途(廢話)

  靜態內部類是沒有指向外部類的引用的,所以說它和外部類並沒有什麼關係,因此,即使沒有外部類的對象,也可以直接建立靜態內部類的對象。但是我覺得如果是這樣使用的話,那完全沒必要把類弄成靜態內部的,直接建立外部類一般的類就OK了。所以說靜態內部類肯定有它自己獨特的作用。既然是個內部類,我覺得應該會聲明成private,不然還不如建立一個外部類呢。。。。那private static的class有啥用處呢?我也不清楚。。。現在我唯一覺得有用的地方就是可以把測試代碼main方法寫在裡面。因為是private的類,外接不能調用它,也就不能調用寫的main函數了。。但是如果只是測試的話可以使用junit test呀。。。不可能為了測試就准們搞這麼一個文法。。。這點值得日後研究,等我代碼看得多了,說不定會有新體會。

 

 

Java 靜態內部類與非靜態內部類 學習記錄.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.