1. 程式人生 > >JAVA內部類的定義與使用

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 介面名(){};

                                 具有方法內部類的所有特徵;

                                 匿名內部類必須繼承一個抽象類或者實現一個介面

                                 匿名內部類沒有構造方法;因為它沒有類名;