類中有五種成分:成員變數,成員方法,構造器,**塊和內部類
定義:內部類作為類的五大成員之一,內部類顧名思義就是在類的內部再定義乙個類,內部類的使用主要體現在更好的封裝性以及獲得更多的許可權修飾符。在外部類中,修飾符只能是預設值或者public,但在內部類中,內部類可以是private,預設值,protected,public,因此可以通過private修飾內部類,將外部類暴露,從而實現更好的封裝性。
我們所學的成員變數,成員方法以及**塊,都會根據有無static分為類和物件,有static修飾的就屬於類,會與類一起載入,並且只有乙份,可以被物件共享,當然,使用static final(final static 這兩種寫法並無區別)修飾的常量會被載入至常量池;無static修飾的就屬於物件,而物件需要通過構造器初始化,因此並不存在什麼靜態構造器。內部類亦是如此,可以根據是否有static修飾區分為靜態內部類,成員內部類(例項內部類),除此之外還有區域性內部類以及匿名內部類,總的來說,靜態內部類以及成員內部類使用的頻率較少,我們完全可以重新定義乙個類,這樣其他類都能使用,只是不能實現內部類的封裝性,但是這樣體現的是元件化的思想,而且可以大大減少**量,而不是每使用一次就定義乙個內部類,區域性內部類相對以上兩種內部類來說使用的頻率更少,但是匿名內部類使用的頻率最高,與lambda表示式有關。
靜態內部類其實與外部類完全一樣,只是位置在外部類的內部。
靜態內部類可以直接訪問外部類的靜態成員
靜態內部類不能訪問外部類的成員變數
靜態內部類屬於外部類本身,因此可以訪問外部類的靜態成員,這裡為什麼說直接呢?內部類訪問外部類靜態成員本身是需要使用 類名.靜態成員 的形式訪問,但由於內部類本身就在外部類中,因此不需要使用類名,可以直接訪問。
外部類的成員變數是在初始化外部類物件是載入的,因此靜態內部類不能直接訪問外部類的成員變數
例項內部類也可以說是成員內部類,與靜態內部類的區別在於沒有static修飾。
例項內部類中不能有靜態成員
例項內部類可以直接訪問外部類的靜態成員
例項內部類可以訪問外部類的例項成員
例項內部類與靜態內部類不同的是,例項內部類中不能有靜態物件,因為例項內部類是屬於外部類物件的,會在例項化物件是建立例項內部類,若例項內部類中能夠存在靜態成員,那麼靜態成員將之例項化多次,這顯然是不和常理的。
例項內部類可以直接訪問外部類的靜態成員變數,因為外部類的靜態成員變數只有乙份,例項內部類可以共享。
例項內部類也可以訪問外部類的例項成員,例項內部類會隨著外部類初始化一起載入,與之一起的還有在外部類中的例項成員,簡單的說,例項內部類與外部類的例項成員變數是同一級別的,因此例項內部類可以訪問外部類中的例項成員。例項化外部類只能得到內部類,並不能得到內部類物件,獲得內部類會在下面說。
內部類是在類的內部定義類,在類中定義的成員變數的作用範圍在整個全域性,相反,如果在for迴圈中定義乙個初始值用於迴圈次數的初始化,這就是區域性變數,同樣,如果將乙個類定義在類的成員內部中,這就是區域性內部類,簡單的說,內部類只需要理解即可,內部類的使用頻率極低。
匿名內部類顧名思義就是乙個沒有名字的類,也就是說這個類只需要在這裡使用一次,因此不需要給這個內部類起名字(留下標記),內部類可以用於簡化**。
匿名內部類一旦被寫出來,就會初始化乙個物件
匿名內部類得到的物件就相當於new 匿名內部類
匿名內部類一旦被寫出來,就會被初始化乙個物件,這個很容易理解,我們知道類只是一種抽象概念,向動物,人這種概念一樣,只有通過構造器例項化才能得到具體的可操作物件,匿名內部類便是如此,若寫出的匿名內部類沒有初始化物件,那我們有該如何得到呢,匿名內部類沒有標記,而類又是乙個抽象概念,若不會初始化物件就顯得很雞肋。
public
class
codedemo
}class
outter
}}
初始化靜態內部類物件的方式:
外部類.內部類 靜態內部類物件名稱 =
new 外部類.內部類構造器
靜態內部類初始化物件只是在靜態內部類名稱前面新增外部類。靜態內部類是屬於外部類的,只需要新增外部類名即可。
public
class
codedemo
}class
outter
//例項內部類獲取外部類的成員變數
public
void
getnickname()
}}
例項內部類可以訪問外部類的靜態變數,這個靜態變數屬於類,但是對物件是共享的。例項內部類訪問外部類的例項變數,是通過new 外部類構造器初始化外部類物件,這樣例項內部類以及外部類的成員變數都在其中,為了得到內部類物件,需要在得到外部類物件的基礎上再new 內部類構造器最終得到內部類構造器。
初始化例項內部類物件的方式:
外部類.內部類 例項內部類物件名稱 =
new 外部類構造器.
new 內部類構造器
這樣看起來獲取很怪,但我們需要理解,通過new 外部構造器得到的是例項內部類,因為例項內部類屬於外部類物件,所以我們需要先得到外部類物件,然後再通過new 內部類構造器才能得到內部類物件。
public
class
codedemo
}class
outter
public
void
getnickname()
} inner inner =
newinner()
; inner.
getname()
; inner.
getnickname()
;}}
區域性內部類在外部類的成員中,為了得到區域性內部類,我們需要先初始化外部類得到外部類物件,在這裡是呼叫包含區域性內部類的方法,在呼叫包含區域性內部類的方法後,我們只是載入了這個區域性類,但沒有初始化區域性內部類,因此無法呼叫成員方法,所以在這裡在包含區域性內部類的方法中初始化區域性內部類從而呼叫區域性內部類的成員方法。
public
class
codedemo};
outter.
getname()
;}}abstract
class
outter
在這裡建立乙個抽象類,需要重寫這個抽象類,這裡就是使用匿名內部類來重寫抽象類。 內部類的分類
靜態內部類,非靜態內部類 非靜態內部類 public class inclass class outer class inner 要點 1.非靜態的內部類必須寄存在乙個外部類的物件裡,因此,如果有乙個非靜態內部類物件那麼一定存在乙個對應的外部類物件,非靜態內部類物件單獨屬於外部類的某個物件 2.非靜...
內部類的分類
成員內部類 區域性內部類 靜態內部類 匿名內部類 內部類可以直接訪問外部類的變數,方法,包括私有。外部類要訪問內部類的變數或者方法需要建立內部類的物件。成員內部類 內部類的位置處在外部類的成員變數的位置。class outter 內部類的例項化 外部類名.內部類名 物件名 new 外部類名.new ...
Java內部類的分類
內部類按照使用上可以分為四種情形 類級 成員式,有 static 修飾 物件級 成員式,普通,無 static 修飾 本地內部類 區域性式 匿名級 區域性式 內部類可以作為外部類的成員,示例如下 public class outer1 public void testtheinner 成員式內部類如...