1. 程式人生 > >java 基礎之內部類

java 基礎之內部類

java中內部類的寫法非常奇怪,個人覺得也不好理解,只需要瞭解一下它的語法就行。

概念:

1)在類的內部在定義一個類,類名不需要和檔案相同

2)內部類一旦通過編譯為生成兩個獨立的位元組碼檔案

3)內部類可以訪問外部類的私有成員而不破壞封裝

分類

1.成員內部類

1)成員內部類不能有static屬性和方法

2)必須先有外部類才能使用成員內部類

3)語法: 

Outer out = new Outer();  

Outer.Inner in = out.new Inner();

public class MyOutClazz {
	
	private int value = 100;
	
	class InnerClazz{
		public void m(){
			System.out.println(value);
		}
	}
	
	public MyOutClazz(int value) {
		this.value = value;
	}

	/** 
	 * 返回 #{bare_field_comment}
	 *  
	 * @return #{bare_field_comment} 
	*/
	public int getValue() {
		return value;
	}

	/** 
	 * 設定 #{bare_field_comment}
	 *  
	 * @param value 
	 *            #{bare_field_comment} 
	 */
	public void setValue(int value) {
		this.value = value;
	}

	public void f(){
		InnerClazz innerClazz = new InnerClazz();
		innerClazz.m();
	}
}
public static void main(String[] args) {
	MyOutClazz myOutClazz1 = new MyOutClazz(100);
	myOutClazz1.new InnerClazz().m();;
	MyOutClazz myOutClazz2 = new MyOutClazz(200);
	myOutClazz2.new InnerClazz().m();;
}
執行結果
100
200

2.靜態內部類

1)不依賴外部類物件,可直接建立內部類物件

2)只能直接訪問外部類的靜態成員

3)語法:

Out.Inner inner = new Out.Inner();

我們看下面的例子,給MyOutClazz 增加一個靜態成員屬性 和  靜態內部類

static class InnerClazz2{
	public void m(){
		System.out.println(value2);
	}
}
private static int value2 = 200;
public static void main(String[] args) {
	MyOutClazz myOutClazz1 = new MyOutClazz(100);
	// 1.建立成員內部類
	MyOutClazz.InnerClazz innerClazz = myOutClazz1.new InnerClazz();
	innerClazz.m();
	// 2.建立靜態內部類
	MyOutClazz.InnerClazz2 innerClazz2 = new MyOutClazz.InnerClazz2();
	innerClazz2.m();
}
執行結果
100
200

3.區域性內部類

定義下方法內部,作用範圍和建立物件的範圍僅在方法主體中

我們看下面的例子

public interface Teacher {
	public void teach();
}
public class TeachSystem {
	public static void main(String[] args) {
		Teacher teachSys = getTeachSys(1);
		teachSys.teach();
	}
	public static Teacher getTeachSys(int val){
		class EnglishT implements Teacher{
			@Override
			public void teach() {
				System.out.println("English  teacher");
			}
		}
		class MathT implements Teacher{
			@Override
			public void teach() {
				System.out.println("Math    teacher");
			}
		}
		if(val <= 10) {
			return new EnglishT();
		}else {
			return new MathT(); 
		}
	}
}
我們可以將TeachSystem 的main 方法當成一個簡單的 選課系統   傳入引數val 根據一定的規則,選擇課程是英語還是數學,這樣設計我們很好的隱藏了內部的實現細節
執行結果
English  teacher
而如果我們不使用部內部類,重新新建兩個 English和 math的類 ,一個學生要選課話,都能不執行我們這個系統,不調getTeachSys這個方法
Teacher tea = new EnglishT();
tea.teach();
這樣直接自己來選擇課程了;

4.匿名內部類

匿名內部類是一種特殊的區域性內部類,如果一個內部類滿足如下兩個特點,就可以改寫為匿名內部類

1)該內部類繼承自某個類或者實現某個介面

2)該內部類在整個方法,整個生命週期中只建立了一個物件

它的語法算java裡比較有特色的了,剛我們設計的那個選課系統就可以改為匿名內部類

public class TeachSystem {

	public static void main(String[] args) {
		
		Teacher teachSys = getTeachSys(1);
		teachSys.teach();
		
	}
	
	public static Teacher getTeachSys(int val){
		if(val <= 10) {
			// 返回 math
			return new Teacher() {
				@Override
				public void teach() {
					System.out.println("math    teacher");
				}
			};
		}else {
			// 返回 English
			return new Teacher() {
				@Override
				public void teach() {
					System.out.println("english  teacher");
				}
			}; 
		}
	}
}
執行結果
math    teacher