一、內部類
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();
-
}