成員內部類.區域性內部類.靜態內部類.匿名內部類的區別
一 對於非靜態內部類,不能有靜態成員,例如變數,方法等。靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。非靜態內部類的非靜態成員可以訪問外部類的非靜態變數。
成員內部類可以隨意使用外部類的成員方法及成員變數,儘管這些類成員被修飾為private.內部類的例項一定要繫結在外部類物件上。
一個內部類可以定義在一個類中,一個方法中甚至一個表示式中。
分類:
內部類分為四種:
靜態內部類(static inner classes)
成員內部類(member inner classes)
區域性內部類(local inner classes)
匿名內部類(anonymous inner classes)
1、靜態內部類(static inner classes)
靜態內部類的特徵:
只能訪問外部類的靜態成員變數與靜態方法。靜態內部類的非靜態成員可以訪問外部類的靜態變數,而不可訪問外部類的非靜態變數。
生成靜態內部類物件的方法:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
相關使用例子:
靜態內部類:
class StaticInner{
private static int a = 1;
/**
* 靜態內部類
* 生成的類名:StaticInner$InnerClass
*/
public static class InnerClass{
//靜態內部類可以宣告靜態的成員變數,其他的內部類不可以
private static int b = 1;
public void execute(){
//靜態內部類只能訪問靜態程式
System.out.println(a +b);
}
}
}1 public static void main(String[] args) {
2 //建立靜態內部類
3 StaticInner.InnerClassinnerClass = newStaticInner.InnerClass();
4 innerClass.execute();
5 }
2、成員內部類(member inner classes)
成員內部類的特徵:
成員內部類可以訪問外部類的靜態與非靜態的方法和成員變數。
儘管這些類成員被修飾為private.內部類的例項一定要繫結在外部類物件上。
對於非靜態內部類,不能有靜態成員,例如變數,方法等。
生成成員內部類物件的方法:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
在區域性內部類中訪問外部類的成員變數的方法:
OuterClass.this.a;
相關使用例子:
class MemberInner{
private int a = 1;
public void execute(){
//在外部類中建立成員內部類
InnerClass innerClass =this.new InnerClass();
}
/**
* 成員內部類
*/
public class InnerClass{
//內部類可以建立與外部類同名的成員變數
private int a = 2;
public void execute(){
//this引用的是內部類
System.out.println(this.a);
//在內部了中使用外部類的成員變數的方法
System.out.println(MemberInner.this.a);
}
}
}
public static void main(String[] args) {
//建立成員內部類
MemberInner.InnerClass innerClass = new MemberInner().new InnerClass();
innerClass.execute();
}
3、區域性內部類(local inner classes)
區域性內部類的特徵:
類似於區域性變數,不能定義為public,protected,private或者static型別。
定義方法中,只能方法中宣告為final型別的變數。
相關使用例子:
class LocalInner{
public void execute(){
final int a = 1;
/**
* 建立區域性內部類
*/
class InnerClass{
public void execute(){
System.out.println("LocalInner Class");
//區域性內部類只能訪問final型別的變數
System.out.println(a);
}
}
//只能在所在方法區域建立
new InnerClass().execute();
}
}
public static void main(String[] args) {
//外部不能直接建立區域性內部類
LocalInner localInner = new LocalInner();
localInner.execute();
}
4、匿名內部類(anonymous inner classes)
匿名內部類的特徵:
匿名內部類沒有類名,沒有class關鍵字也沒有extends和implements等關鍵字修飾。
匿名內部類會隱式地繼承一個父類或實現一個介面。