天天看點

Java[學習]靜态内部類和非靜态内部類

Java 靜态内部類和非靜态内部類

内部類

先說說内部類,為啥要使用内部類?在《Think in java》中有這樣一句話:使用内部類最吸引人的原因是:每個内部類都能獨立地繼承一個(接口的)實作,是以無論外圍類是否已經繼承了某個(接口的)實作,對于内部類都沒有影響。

接口隻是解決了部分問題,而内部類使得多重繼承的解決方案變得更加完整。

内部類的優點:

  • 内部類可以用多個執行個體,每個執行個體都有自己的狀态資訊,并且與其他外圍對象的資訊互相獨立。
  • 在單個外圍類中,可以讓多個内部類以不同的方式實作同一個接口,或者繼承同一個類。
  • 建立内部類對象的時刻并不依賴于外圍類對象的建立。
  • 内部類并沒有令人迷惑的“is-a”關系,他就是一個獨立的實體。
  • 内部類提供了更好的封裝,除了該外圍類,其他類都不能通路

靜态内部類和非靜态内部類的差別

  1. 靜态内部類可以有靜态成員(方法和屬性),而非靜态内部類則不能有靜态成員
  2. 靜态内部類隻能通路外部類的靜态成員和靜态方法,而非靜态内部類可以通路外部類的所有成員(方法和屬性)
  3. 執行個體化非靜态内部類需要外部類的對象,所有說,内部類對象隐含地儲存了外部類對象的引用。
  4. 執行個體化靜态内部類,不需要外部類對象引用

什麼時候用内部類,什麼時候用靜态内部類

  1. 首先要搞清楚:為什麼要用内部類?用内部類是因為内部類與所在外部類有一定的關系,往往隻有該外部類調用此内部類,是以沒有必要專門用一個Java檔案存放這個類
  2. 生命周期不一樣:靜态内部類随着外部類的加載而加載,而不是随着外部類對象的産生而産生
    1. 外部類示例與靜态内部類執行個體沒有關系的
    2. 外部的執行個體對應着不同非靜态内部類的執行個體

靜态内部類 能被回收嗎

靜态類變量不會被釋放。隻有等應用結束才釋放。

1、靜态類隻有在内部類的時候才能被應用

2、靜态類在應用初始化時就放在靜态方法區中,是公共共享,應用結束才能回收靜态方法區。