JAVA內部類的定義與使用
內部類的定義;
在一個類中進行其他類結構的巢狀;
內部類的優點;
(1)內部類和外部類可以互相訪問彼此的私有域;
(2)內部類可以實現Java的單繼承侷限;
(3)內部類可以對同一包中的其他類隱藏;僅供外部類使用(保護性)
缺點:
結構複雜;
class Outer { private String msg = "Hello World"; //外部類的私有屬性 class Inner { //定義一個內部類 public void print() { System.out.println(msg); } } public void fun() { //建立一個public方法;供外部使用 Inner in = new Inner(); in.print(); } } public class Test { public static void main(String[] args) { Outer out=new Outer(); //System.out.println(out.msg); //錯誤!!在類的外部無法呼叫其私有屬性 out.fun(); //但是通過內部類可以間接訪問其私有屬性 } }
內部類與外部類的關係:
1:對於非靜態內部類而言;內部類的建立需要倚賴外部類的例項化物件;在沒有外部類物件之前
是無法建立內部類的;
2:內部類是一個相對獨立的個體;與外部類不是 is - a 的關係
3:內部類可以訪問外部類的元素;(包括私有域) ,但是外部類不可以直接訪問內部類元素;需要通過
內部類的引用間接訪問;
建立內部類物件的語法:(在外部類之外)
1;建立非靜態內部類物件:
外部類.內部類 內部類引用=new 外部類().new 內部類();
Outer.Inner in = new Outer().new Inner();
class Outer { private String msg = "Hello World"; //外部類的私有屬性 class Inner { //建立一個非靜態內部類 public void print() { System.out.println(msg); } } } public class Test { public static void main(String[] args) { Outer.Inner in=new Outer().new Inner(); //建立內部類的例項化物件 in.print(); } }
2:建立靜態內部類
外部類.內部類 內部類引用 = new 外部類. 內部類();
Outer.Inner in = new Outer.Inner();
class Outer {
private static String msg = "Hello World"; //外部類的私有屬性
static class Inner { //建立一個靜態內部類
public void print() {
System.out.println(msg);
}
}
}
public class Test {
public static void main(String[] args) {
Outer.Inner in=new Outer.Inner(); //建立內部類的例項化物件
in.print();
}
}
內部類的分類:
(1)成員內部類(普通內部類)- -成員方法
a: 成員內部類不能存在任何 static 變數方法;可以訪問外部類的靜態域
b: 成員內部類需要依附外部類 new Outter().new Inner();
c: 內部類可以使用 private 封裝;表示私有內部類;該內部類僅供外部類使用
(2)靜態內部類--靜態方法
靜態內部類的建立不需要外部類;可以直接建立
靜態內部類不可以訪問外部類的任何非 static 域
靜態內部類可以擁有成員變數;
(3)方法內部類(在方法內部定義的類)(類比成員內部類)
方法內部類不能使用任何訪問許可權修飾符;(public private prodetcted 都不允許)
方法內部類對外(方法外)完全隱藏;除了該方法外可以訪問外;其餘地方均不得訪問;
方法內部類想要使用方法形參;該形參必須使用final宣告(系統自動產生和隱藏);
class Outer {
private String msg = "Hello World"; // 外部類的私有屬性
public void fun() {
class Inner { // 建立一個方法內部類
public void print() {
System.out.println(msg);
}
}
new Inner().print(); //產生內部類物件並且呼叫方法
}
}
public class Test {
public static void main(String[] args) {
Outer out = new Outer();
out.fun();
}
}
(4)匿名內部類(方法內部類的特殊版本 )
new 介面名(){};
具有方法內部類的所有特徵;
匿名內部類必須繼承一個抽象類或者實現一個介面
匿名內部類沒有構造方法;因為它沒有類名;