Java內部類使用總結


 1.定義

內部類是指在一個外部類的內部再定義一個類。
內部類作為外部類的一個成員,並且依附於外部類而存在的。
內部類可為static,可用public、protected、private修飾。(而外部類不可以:外部類只能使用publi和default)。

2.分類
在一個類(外部類)中直接定義的內部類(成員內部類)、
局部內部類、
靜態內部類、
匿名內部類。

3.使用方法

A. 在一個類中直接定義的內部類

 

1)      外部類不能直接訪問內部類的的成員,但可以通過內部類對象來訪問。

2)      內部類作為外部類的成員,可以訪問外部類的所有成員。

3)      注意:內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。對於一個名為outer的外部類和其內部定義的名為inner的內部類。編譯完成后出現outer.class和outer$inner.class兩類。

4)      成員內部類與普通的成員沒什么區別,可以與普通成員一樣進行修飾和限制。

public class MyMain {

int outer_x = 100;

class Inner{
//局部變量,其范圍為定義它的代碼塊(不受修飾符的影響)。
public int y = 10; //局部變量
private int z = 9;
int m = 5;
//static int k=1;//內部類中不允許定義靜態變量

public void display1(){
System.out.println("display outer_x:"+ outer_x);
}

private void display2(){
System.out.println("display outer_x:"+ outer_x);
}
}

void test(){
Inner inner = new Inner();

inner.display1();
inner.display2();

System.out.println("Inner y:" + inner.y);//可以訪問
System.out.println("Inner z:" + inner.z);//可以訪問
System.out.println("Inner m:" + inner.m);//可以訪問
}

public static void main(String args[]){
MyMain outer = new MyMain();
outer.test();
}
}

B. 在一個方法中定義的內部類

        在方法中定義的內部類稱為局部內部類。與局部變量類似,在局部內部類前不加修飾符public和private,其范圍為定義它的代碼塊。其他用法和成員內部類相同。

C. 靜態內部類

        靜態內部類:不能訪問外部類的非靜態成員,這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定。若想訪問外部類的變量,必須通過其它方法解決,由於這個原因,靜態嵌套類使用很少。

        靜態內部類其實已經脫離了外部類。在創建靜態內部類對象時也不需要外部類對象的存在。其實質是一個放置在別的類內部的普通類。而關鍵字static也只是說明其在創建對象時不依賴於外部類對象的存在,並不是說這個類本身是靜態的。

  • 靜態內部類與前面所講的兩種非靜態內部類的語法基本相同。區別主要是在內部類的聲明前面要加上static 關鍵字。另外,靜態內部類也不可以用private進行定義。
  • 靜態內部類的對象可以直接生成,而不需要外部類的對象來生成,這樣實際上是使靜態內部類成為了一個頂級類。這主要是因為靜態內部類是外部類的靜態成員,並不依賴於外部類的對象而存在。
  •  靜態內部類與非靜態內部類的區別是本質上的。非靜態內部類是外部類對象組成的一部分,主要是輔助外部類對象工作的,與外部類對象存在這對成員變量的共享關系。

D.匿名類

      匿名內部類是一種特殊的局部內部類,這種內部類沒有類名。該類適用於只使用一次並且不需要多次創建對象的類。使用匿名內部類可以使類代碼與創建對象同時完成,這樣做不但方便,還提高代碼的可維護性。

  • 匿名內部類是唯一一種沒有構造方法的類。正因為其沒有構造方法,所以匿名內部類的使用范圍非常有限。
  • 大部分匿名內部類用於接口回調。
  • 匿名內部類在編譯的時候由系統自動起名為Out$1.class
  • 匿名內部類用於繼承其他類或是實現接口,並不需要增加額外的方法,只是對繼承方法的實現或是重寫。

語法規則:new <類或接口> <類的主體> 

interface pr   
{
void print1();
}

public class noNameClass
{
public pr dest()
{
//這個用法的作用是:創建一個對象的實例,並且 override 它的一個函數,然后返回。
return new pr(){
public void print1() {
System.out.println("Hello world!!");
}
};
}

public static void main(String args[])
{
noNameClass c=new noNameClass();
pr hw=c.dest();
hw.print1();
}
}

 

 --------------------------------------------------------------------

PS: 歡迎關注公眾號"Devin說",會不定期更新Java相關技術知識。

--------------------------------------------------------------------

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM