java嵌套类与内部类
使用嵌套類減少了命名沖突,一個內部類可以定義在一個類中,一個方法中甚至一個表達式中。
(1)定義
A nested(嵌套) class is any class whose declaration occurs within the body of?another class or interface.??A top level class is a class that is not a nested class.?
一般把定義內部類的外圍類成為包裝類(enclosing class)或者外部類.
(2)嵌套類分類
1、靜態嵌套類 (static nested classes)
2、非靜態嵌套類
非靜態嵌套類就是內部類(Inner classes)。Inner Classes 不能定義為static,不能有static方法和static初始化語句塊。
在JLS(java語言規范)里面是這么定義的:
An inner class is a nested class that is not explicitly or implicitly declared static. Inner classes may not declare static initializers (§8.7) or member inter- faces
非靜態嵌套類分為三種:
1)成員嵌套類(member nested class)
? 成員嵌套類 作為 enclosing class 的成員定義的,成員嵌套類有enclosing class屬性
2)局部嵌套類(local nested class)
? 局部嵌套類定義在 enclosing class 的方法里面,局部嵌套類有enclosing class 屬性和enclosing method屬性
3)匿名嵌套類(anonymous nested class)
? 匿名嵌套類沒有顯示的定義一個類,直接通過new 的方法創建類的實例。一般回調模式情況下使用的比較多
?
也可以稱為成員內部類(member inner classes)、局部內部類(local inner classes)、匿名內部類(anonymous inner classes)
?
二、靜態嵌套類
簡稱靜態類,最簡單的嵌套類,只能訪問外部類的靜態成員變量與靜態方法。
1、靜態類不能訪問外部類的非靜態成員和非靜態方法(不管是public還是private的);
2、靜態類的實例不需要先實例化外部類成員,可直接實例化。
3、靜態類的修飾符與普通類的屬性的修飾符一樣,也可以使用訪問控制符,可以使用final修飾,可以是abstract抽象類
?代碼實例
public class Outer{public static class StaticNested{//其他代碼 } }?實例方式
Outer.StaticNested staticNested=new Outer.StaticNested();?
三、成員內部類
成員內部類可以訪問外部類的所有實例屬性,靜態屬性。因為內部成員類持有一個外部對象的引用,內部類的實例可以對外部類的實例屬性進行修改。
如果是public的 inner ?member classes,可以通過 外部類實例.new 內部類()的方式進行創建,當調用內部類的構造器的時候,會把當前創建的內部類對象實例中持有的外部對象引用賦值為當前創建內部類的外部類實例。
內部成員類可以是使用訪問控制符,可以定義為final,也可以是abstract抽象類。
?代碼實例
class Outer{public class MemberNested{//其他代碼 } }?
?實例方式
Outer.MemberNested staticNested=new Outer().new MemberNested();?或者
Outer outer=new Outer(); Outer.MemberNested staticNested=outer.new MemberNested();?
四、局部內部類
(1)定義位置
? ?定義位置既可以是靜態方法,也可以是實例方法,也可以是構造器方法,還可以是動態初始化語句塊或者靜態初始化語句塊。
(2)修飾符限制
? ?局部類不能有訪問控制符(private,public,protected修飾),可以是abstract的,也可以定義為final。
(3)局部類可以定義在一個static上下文里面 和 非static上下文里面。
? ?定義在static上下文(static初始化塊,static方法)里面的local inner classes 可以訪問類的靜態屬性。
? ?在static上下文定義的局部類,沒有指向父類實例變量的引用,因為static方法不屬于類的實例,屬于類本身。而且局部類不能在外部進行創建,只能在定義位置調用的時候進行創建。
代碼實例
class Outer {//定義在構造方法public Outer() {final class LocalNested {//其他代碼 }LocalNested localNested=new LocalNested();}//定義在成員方法public void methodA() {abstract class LocalNested {//其他代碼 }LocalNested localNested=new LocalNested(){ };//匿名實現抽象類 }//定義在靜態方法public static void methodB() {abstract class LocalNested {//其他代碼 }LocalNested localNested=new LocalNested(){ };//匿名實現抽象類 }//定義在動態初始化塊 {class LocalNested {//其他代碼 }LocalNested localNested=new LocalNested();}//定義在靜態初始化塊static {final class LocalNested {//其他代碼 }LocalNested localNested=new LocalNested();} }View Code?
五、匿名內部類
(1)定義位置
?定義位置既可以是靜態方法,也可以是實例方法,也可以是構造器方法,還可以是動態初始化語句塊或者靜態初始化語句塊。
(2)實現方式
匿名類和局部類訪問規則一樣,只不過內部類顯式的定義了一個類,然后通過new的方式創建這個局部類實例,而匿名類直接new一個類實例,沒有定義這個類。匿名類最常見的方式就是回調模式的使用,通過默認實現一個接口創建一個匿名類然后,然后new這個匿名類的實例。
代碼實現
class Outer {//定義在構造方法public Outer() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名實現抽象類 }//定義在成員方法public void methodA() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名實現抽象類 }//定義在靜態方法public static void methodB() {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名實現抽象類 }//定義在動態初始化塊 {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名實現抽象類 }//定義在靜態初始化塊static {AnonymousNested anonymousNested=new AnonymousNested(){ };//匿名實現抽象類 } }abstract class AnonymousNested {//其他代碼 }View Code?
總結
以上是生活随笔為你收集整理的java嵌套类与内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Class的 getSuperclass
- 下一篇: 中空塑料建筑模板正确的使用工序中空塑料建