java基礎_05_內部類


內部類
內部類是指在一個外部類的內部再定義一個類,可用protectedprivate 修飾。而外部類只能使用public和缺省的包訪問權限。
注意:內部類只是一個編譯時期的概念,一量編譯成功,就會成爲完全不同的兩類。
 
特點:
1,內部類可以直接訪問外部類的東西
2,外部類要訪問內部類的東西要先建立對象
 
爲什麼需要內部類?
內部類繼承自某個類或實現某個接口,內部類的代碼操作創建其外圍類的對象,所以可以認爲內部類提供了某種進入其外圍類的方法。
好處:每個內部類都能獨立的去繼承實現接口,所以無論外圍類是否已經繼承了某個實現,對於內部類都沒有影響,內部類有效的實現了“多重繼承”。
 
內部類可以分爲4
1靜態內部類
使用static 修飾,聲明在外部類的類體中。靜態內部類中可以訪問外部類的靜態成員。
如果你不需要內部類與其外圍類之間有聯繫,那麼可以聲明爲satic
2成員內部類
一,聲明在外部類的類體中,不使用static 修飾,具有類的成員特徵,必須有類的實例纔會創建內部類實例。
二,內部類實例可以訪問共享外部類的成員變量。
3局部內部類
把類聲明在方法中,類似局部變量。(很少見)
例:
  void fanfa(){
  		final int a=3;  //這裏加final 下面這個局部類才能訪問
  
  		class Demoin{
  			void display(){
  				//注意局部裏面的類要訪問的變量必須是final 最終的
  				System.out.println (a);
  			}
  		}
  		new Demoin().display();
  	}
4匿名內部類(重點)
匿名類和內部類差不多,只是類名沒體現出來。
1,匿名內部類其實就是內部類的簡寫格式
2,定義匿名內部類的前提:	內部類必須繼承一個類或者實現接口
3,匿名內部類的格式:  new 父類或者接口(){定義子類的內容}
4,其實匿名內部類就是一個匿名子類對象。可以理解爲帶內容的對象
5,  匿名內部類中定義的方法最好不要超過3個。
6,匿名類,非常常見,可以寫在任何地方,就像一般的語句。
7,匿名類是對原類的一個繼承,同時創建了實例,{}就是繼承以後的類體,類體中可以使用所有類的語法。
8,匿名類不能寫構造器。
9,匿名類可以從抽象類或者接口繼承。
10,匿名內部類不能定義任何靜態成員、方法和類。
11,匿名內部類不能是public, protected, private, staic .
12,匿名類只能創建其自身那一個實例。
 
那些地方使用匿名內部類呢?
1,只用到類的一個實例。
2,類在定義後馬上用到。
 
心得:內部類就是類體裏面在建立一個類,這個內部類可以去繼承其它類,或實現接口。提供了訪問外圍類的路徑,把	  類的單繼承進行了改善。其中匿名類是重點,在使用中應用最多。內部類可以訪問外圍類的資源,要注意它們的  
      寫法。
例一:
  abstract class Demo
  {
  	abstract void show();
  }
  class Out
  {
  	int x = 3;
  //	class In extends Demo
  //	{
  //		void show(){
  //			System.out.println("show.."+x);
  //		}
  //	}
  
  	void dis()
  	{
  //		In in=new In();
  //		in.show();
  
  
  //匿名類使用方法,上面的內部類使用可以用下面匿名類來實現,少寫代碼
  		new Demo()
  		{
  			void show(){ //覆蓋
  				System.out.println("show.."+x);
  			}
  		}.show();
  
  
  //也可以給上面這個對象取名,如下:功能一樣
  	//	Demo d=new Demo()
  	//	{
  	//		void show(){ //覆蓋
  	//			System.out.println("show.."+x);
  	//		}
  	//	};
  	//	d.show();
  	}
  }
  class  OutIn
  {
  	public static void main(String[] args) 
  	{
  		Out out=new Out();
  		out.dis();
  	}
  }
  
例二:
  class Out
  {
  	private int x=3;
  	class In
  	{
  		int x=4;
  		void function(){
  			int x=6;
  
  			//訪問x=6 直接寫x
  			//訪問x=4 寫this.x
  			//訪問外部類x=3  得寫成 Out.this.x
  			//如果內部類裏和方法裏沒有定義x 直接訪問外部類的x
  			System.out.println("In.."+Out.this.x);
  		}
  	}
  
  	void show(){
  		System.out.println(x);
  		//訪問內部類,得先建立對象
  		In in=new In();
  		in.function();
  	}
  	
  	//局部類使用
  	void fanfa(){
  		final int a=3;  //這裏加final 下面這個局部類才能訪問
  		class Demoin{
  			void display(){
  			//注意局部裏面的類要訪問的變量必須是final 最終的
  			System.out.println (a);
  			}
  		}
  		new Demoin().display();
  	}
  
  }
  class  OutIn
  {
  	public static void main(String[] args) 
  	{
  		Out out=new Out();
  		out.show();
  		//直接建立內部類,用下面方式(內部類必須是非靜態的)
  		Out.In oi=new Out().new In();
  		oi.function();
  	}
  }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章