天天看點

java之内部類(靜态内部類、非靜态内部類、匿名内部類、方法内部類)

内部類的概念

      一般情況,我們把類定義成獨立的單元。有些情況下,我們把一個類放在另一個類的内部定義,稱為内部類(innerclasses)。

      内部類可以使用public、default、protected 、private以及static修飾。而外部頂級類(我們以前接觸的類)隻能使用public和default修飾。

注意

      内部類隻是一個編譯時概念,一旦我們編譯成功,就會成為完全不同的兩個類。對于一個名為Outer的外部類和其内部定義的名為Inner的内部類。編譯完成後會出現Outer.class和Outer$Inner.class兩個類的位元組碼檔案。是以内部類是相對獨立的一種存在,其成員變量/方法名可以和外部類的相同。

内部類介紹

class

Outer {

private

int

age = 

10

;

public

void

show(){

System.out.println(age);

//10

}

public

class

Inner {

//内部類中可以聲明與外部類同名的屬性與方法

private

int

age = 

20

;

public

void

show(){

System.out.println(age);

//20

}

}

}

      示例編譯後會産生兩個不同的位元組碼檔案,如圖所示:
java之内部類(靜态内部類、非靜态内部類、匿名内部類、方法内部類)

圖 内部類編譯結果圖

内部類的作用:

      1. 内部類提供了更好的封裝。隻能讓外部類直接通路,不允許同一個包中的其他類直接通路。

      2. 内部類可以直接通路外部類的私有屬性,内部類被當成其外部類的成員。 但外部類不能通路内部類的内部屬性。

      3. 接口隻是解決了多重繼承的部分問題,而内部類使得多重繼承的解決方案變得更加完整。

内部類的使用場合:

      1. 由于内部類提供了更好的封裝特性,并且可以很友善的通路外部類的屬性。是以,在隻為外部類提供服務的情況下可以優先考慮使用内部類。

      2.  使用内部類間接實作多繼承:每個内部類都能獨立地繼承一個類或者實作某些接口,是以無論外部類是否已經繼承了某個類或者實作了某些接口,對于内部類沒有任何影響。

 1、非靜态内部類(外部類裡使用非靜态内部類和平時使用其他沒什麼不同)

非靜态内部類必須寄存在一個外部類對象裡。是以,如果有一個非靜态内部類對象那麼一定存在對應的外部類對象。非靜态内部類對象單獨屬于外部類的某個對象。

非靜态内部類可以直接通路外部類成員,但外部類不能直接通路非靜态内部成員。非靜态内部類不能有靜态方法、靜态屬性和靜态初始化塊。

外部類的靜态方法、靜态代碼塊不能通路非靜态内部類,包括不能使用非靜态内部類定義的變量、建立執行個體。

很像兩個人結婚,妻子可以花丈夫的錢,然而卻不準丈夫做任何事。

*

成員變量通路要點:

1、内部類裡方法的局部變量:變量名

2、内部類屬性:this.變量名

3、外部類屬性:外部類名.this.變量名

package cn.sxt.oop;
/**
 * *測試非靜态内部類
 * *内部類也是獨立的類
 * *在編譯的時候獨立生成class檔案
 * *有static就是靜态内部類,沒有static就是非靜态内部類
 * @author 高嵩
 *
 */
public class TestInnerClass {
	public static void main(String[] args) {
		Outer.Inner inner = new Outer().new Inner();
		inner.show();
	}
}


class Outer{
	private int age = 10;
	public void testOuter() {
		
	}
	
	class Inner{
		int age = 20;
		public void show() {
			int age = 30;
			System.out.println("外部類的成員變量age:"+Outer.this.age);
			System.out.println("内部類的成員變量age:"+this.age);
			System.out.println("局部變量的age:"+age);
		}
	}
}
           
 靜态内部類
package cn.sxt.oop;
/**
 * *測試靜态内部類
 * @author 高嵩
 **靜态内部類不依托于外部類對象
 */
public class TestStaticInnerClass {
	public static void main(String[] args) {
		Outer2.Inner2 inner = new Outer2.Inner2();
	}
}

class Outer2{
	
	static class Inner2{
		
	}
}
           

匿名内部類

适合那種隻需要使用一次的類。比如鍵盤的監聽操作等等·。