java執行緒深度解析(一)——java new 介面?匿名內部類給你答案
阿新 • • 發佈:2018-12-26
一、內部類
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、 內部類對外部類的操作:內部類中的變數訪問形式
依次輸出122,12,1 ,這個例項主要是提醒大家在對具有內部類的類成員變數、內部類變數呼叫的時候需要注意加上對應的關鍵字。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(); }
二、內部類的常用型別
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 介面的事兒,別奇怪,匿名內部類告訴你答案。