1. 程式人生 > >java執行緒深度解析(一)——java new 介面?匿名內部類給你答案

java執行緒深度解析(一)——java new 介面?匿名內部類給你答案

一、內部類

1、內部類初識

一般,一個類裡主要包含類的方法和屬性,但在java中還提出在類中繼續定義類(內部類)的概念。

內部類的定義:類的內部定義類

先來看一個例項

public class Out {
	private int a=1;
	//定義內部類
	class Inner
	{
		private int a=12;
		public void show()
		{
			System.out.println(a);
		}
	}
	
	public static void main(String[] args) {
		Out.Inner in=new Out().new Inner();//例項化內部類
		in.show();
		
	}

     如Out類中定義一個a變數,再定義一個Inner內部類,該類可直接呼叫輸出a;同時為Out設定的show方法內部類也可直接呼叫。內部類的提出,唯一的好處就在於可直接使用外部類(Out類)的所有屬性,不再需要通過get、set操作資料。但這種方便是以犧牲類的基本結構為代價的。這裡需要注意的是對內部類的例項化語法。

2、 內部類對外部類的操作:內部類中的變數訪問形式

public class Out {
	private int a=1;
	//定義內部類
	class Inner
	{
		private int a=12;
		public void show()
		{
			int a=122;
			System.out.println("區域性變數:"+a);
			System.out.println("內部類變數:"+this.a);
			System.out.println("外部類變數:"+Out.this.a);
		}
	}
	
	public static void main(String[] args) {
		Out.Inner in=new Out().new Inner();//例項化內部類
		in.show();		
	}
依次輸出122,12,1 ,這個例項主要是提醒大家在對具有內部類的類成員變數、內部類變數呼叫的時候需要注意加上對應的關鍵字。

二、內部類的常用型別

1、常規內部類

常規內部類沒有用static修飾且定義在在外部類類體中。
  1.常規內部類中的方法可以直接使用外部類的例項變數和例項方法。
  2.在常規內部類中可以直接用內部類建立物件。

2、靜態內部類

用static修飾內部類

1.如果使用static修飾內部類,該內部類只能訪問外部類的靜態成員變數。

3、區域性內部類

 內部類前加上private修飾,使得該內部類只有當前外部類方法才可呼叫。其他類無例項化許可權。

4、匿名內部類

這裡著重介紹匿名內部類的使用。匿名內部類:沒有名字的內部類,它的特點是隻能使用一次,通常用於簡化程式碼編寫。使用匿名內部類必須繼承一個父類或實現一個介面。

   宣告和構造匿名內部類的一般格式如下:
   new ClassOrInterfaceName(){ //抽象類或介面

    /*類體*/ }

1)匿名內部類在抽象類上的應用

  不使用匿名內部類實現抽象類方法例項

public abstract class InnerClass2 {
	public abstract void show();
	
	public static void main(String[] args) {
		InnerClass2 in=new Child(); //多型,例項化子類,呼叫子類show方法
		in.show();
	}
}

public class Child extends InnerClass2{
		public void show()
		{
			System.out.println("jdfklj");
		}
}
   使用匿名類實現思路
public abstract class Out2 {
	public abstract void show();
	
	public static void main(String[] args) {
		Out2 out=new Out2()
		{ //匿名類-直接例項化了out2和show 方法,在呼叫out.show()
			public void show()
			{
				System.out.println("jdljsalkf");
			}
		};
		out.show();
	}	
}

    在註釋出就是使用了一個匿名類,對抽象類Out2的show例項,最後out.show()呼叫即可。
2)匿名內部類在介面上的應用

public interface Out3 {//介面
	void show();
	
	public static void main(String[] args) {
		Out3 out=new Out3()//new Out3
		{
			public void show()
			{
				System.out.println("lkjdfaj");
			}
		};
	}
}
   這裡new Out3是本片部落格出生的源頭,直接new 抽象類、new 介面??how could it be? one Answer:cause it is a Anonymous Inner Class.只要是一個抽象類或介面,那就可以使用匿名內部類來實現。最常用的是在多執行緒中繼承Thread類或實現Runnable介面。
public static void main(String[] args) {
		Thread thread =new Thread()
		{
			public void run()
			{
				System.out.println("kdjfka");
			}
		};
		thread.start();
		
		//介面
		Thread thread2=new Thread(new Runnable(){
			public void run()
			{
				System.out.println("22222222");
			}
			
		}); 
		thread2.start();
	}
    看到new 介面的事兒,別奇怪,匿名內部類告訴你答案。