天天看點

19、java的4種内部類(成員内部類、靜态内部類、靜态内部類、匿名内部類)

内部類

内部類分為:成員内部類、靜态内部類、局部内部類、匿名内部類

1、成員内部類: 成員内部類類似于成員變量,定義在類中,和屬性|方法對齊。

//外部類類名.内部類類名 内部類對象名 = 外部類對象名.new 内部類類名();
class Inner{
	private String inner_field = "内部類的成員變量";
	int a = 100;//内部類成員變量
	//static int c;//成員内部類中不能定義靜态成員
	public void inner_method() {
		  int a = 10;//局部變量
		  System.out.println(a);//局部變量
		  System.out.println(this.a);//内部類的同名成員變量
		  System.out.println(Outer.this.a);//外部類的同名成員變量
		  System.out.println("内部類的成員方法");
		  System.out.println(inner_field);//内部類成員變量
		  System.out.println(outer_field);//外部類的私有成員變量
	}
}
	Outer outer = new Outer();
	outer.out_method();
//建立成員内部類對象必須借助于外部類對象名
	Outer.Inner inner = outer.new Inner();
	inner.inner_method();
           

2、靜态内部類: 類似于靜态屬性,定義在類中,方法的外面,被static修飾

//文法
//外部類類名.靜态内部類類名.靜态屬性;
//外部類類名.靜态内部類類名.靜态方法();

//靜态内部類
static class Inner{
		int m = 2;
		static int n = 20;
//m3()對外時 相當于加上了static 就不能直接通路外部類的普通成員
		public void m3() {
	  	  //a屬性為成員變量
		  StaticOuter so = new StaticOuter();
		  System.out.println(so.a);
		  //靜态内部類中普通方法 但是相當于給其加了static
	}
public static void m4() {
  //System.out.println(m);//靜态内部類的靜态方法不能直接通路内部類的普通成員
	  System.out.println("内部類的靜态方法");
	  System.out.println(n);
}
}

//通路靜态内部類的靜态成員 不需要建立内部類對象
//建立靜态内部類對象不需要依賴于外部類對象
           

3、靜态内部類: 類似于局部變量,定義在方法中,類似于局部變量,定義在方法中。

注意:局部内部類建立對象隻能在定義它的方法中。(局部内部類可以通路外部類的局部變量,但是必須加上final(JDK8.0中,在内部類中通路為外部類的局部變量預設加上final)。)

public void m1() {
	final int x = 10;//局部變量 作用範圍(定義位置開始到所在代碼塊結束)
	System.out.println("外部類的普通方法");
	System.out.println(x);//10
	//局部内部類
	class Inner{
		int y;
		public void m2() {
    	System.out.println("x="+x);
	    System.out.println("局部内部類的方法");
	    System.out.println(a);//通路外部類的私有成員 不破壞封裝
	}
}
Inner inner = new Inner();
System.out.println(inner.y);//0
inner.m2();
}
           

4、匿名内部類: 特殊的局部内部類,局部内部類的一切特征,匿名内部類都存在(繼承一個類或者實作一個接口)。

interface IA{
	void m1();
}
class IAImpl implements IA{//1
	public void m1() {
	System.out.println("IAImpl m1()...");
	}
}

main{
IA i1 = new IAImpl();//2
//建立的是接口的實作類對象 因為隐藏了實作類類名 是以稱之為匿名内部類
//實作類的定義與實作類對象的建立二者結合為一
IA ia = new IA() {//這一種寫法完全等價于1+2
  public void m1() {
    System.out.println("IAimpl m1...");
  }
};
}