1. 程式人生 > >【Java面試題】11 什麼是內部類?Static Nested Class 和 Inner Class的不同。

【Java面試題】11 什麼是內部類?Static Nested Class 和 Inner Class的不同。

Inner Class(內部類)定義在類中的類。 (一般是JAVA的說法)

Nested Class(巢狀類)是靜態(static)內部類。(一般是C++的說法)
靜態內部類:1 建立一個static內部類的物件,不需要一個外部類物件不能從一個static內部類的一個物件訪問一個外部類物件

Java內部類與C++巢狀類最大的不同就在於是否有指向外部的引用上。

內部類:就是在一個類的內部定義的類,

A.非靜態內部類中不能定義靜態成員(靜態物件是預設載入,那麼靜態內部類應該先於外部類被載入到記憶體中)

當內部類中如果有靜態成員時,該內部類也必須是靜態的。而靜態內部類只能訪問外部類中的靜態成員。 會出現兩種情況:

1,內部類靜態,但是方法沒靜態。該方法需要被物件呼叫執行。

   Outer.Inner in = new Outer.Inner();//產生了一個靜態內部類物件。

   in.show();

2,內部類靜態,而且方法也是靜態的。靜態內部類隨著物件的載入就已經存在了,靜態方法隨著內部類的載入也存在了。這時是不需要物件的。

   Outer1.Inner.show();

B.內部類可以直接訪問外部類中的成員變數

非靜態的內部類之所以可以直接訪問外部類中的成員,那是因為內部類中都持有一個外部類物件引用:外部類名.this.變數名

靜態內部類之所以可以直接訪問外部類中的靜態成員,其實持有的是外部類名。

C.內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中,如下所示:

方法體外面定義的內部類的訪問型別可以是public,protected,預設的,private4種類型,它們決定這個內部類的定義對其他類是否可見;對於這種情況,我們也可以在外面建立內部類的例項物件,一定要先建立外部類的例項物件,然後用這個外部類的例項物件去建立內部類的例項物件,程式碼如下:

Outer outer = new Outer();

Outer.Inner1 inner1 = outer.new Innner1();

方法內部定義的內部類前面不能有訪問型別修飾符,但前面可以使用final或abstract修飾符。這種內部類對其他類是不可見的其他類無法引用這種內部類,但是這種內部類建立的例項物件可以傳遞給其他類訪問。這種內部類必須是先定義,後使用,即內部類的定義程式碼必須出現在使用該類之前,這與方法中的區域性變數必須先定義後使用的道理也是一樣的。這種內部類可以訪問方法體中的區域性變數,但是,該區域性變數前必須加final

修飾符。

在方法體內部還可以採用如下語法來建立一種匿名內部類,沒有名字的內部類,即定義某一介面或類的子類的同時,還建立了該子類的例項物件,無需為該子類定義名稱:

public class Outer{

  public void start(){

   new Thread(

      new Runable(){

         public void run(){};

   }).start();

  }

}

Static Nested Class,它不再具有內部類的特性,從狹義上講,它不是內部類。Static Nested Class與普通類在執行時的行為和功能上沒有什麼區別,只是在程式設計引用時的語法上有一些差別:

1.它可以定義成publicprotected、預設的、private等多種型別,而普通類只能定義成public和預設的這兩種型別。

2.在外面引用Static Nested Class類的名稱為“外部類名.內部類名”。

3.在外面不需要建立外部類的例項物件,就可以直接建立Static Nested Class,例如,假設Inner是定義在Outer類中的Static Nested Class,那麼可以使用如下語句建立Inner類:

Outer.Inner inner = new Outer.Inner();

4.由於static Nested Class不依賴於外部類的例項物件,所以,static Nested Class能訪問外部類的非static成員變數

5.當在外部類中訪問Static Nested Class時,可以直接使用Static Nested Class的名字,而不需要加上外部類的名字了,在Static Nested Class中也可以直接引用外部類的static的成員變數,不需要加上外部類的名字。

在靜態方法中定義的內部類也是Static Nested Class,這時候不能在類前面加static關鍵字,靜態方法中的Static Nested Class與普通方法中的內部類的應用方式很相似,它除了可以直接訪問外部類中的static的成員變數,還可以訪問靜態方法中的區域性變數,但是,該區域性變數前必須加final修飾符。

備註:內部類的總體方面的特點:兩個地方可以定義,可以訪問外部類的成員變數,不能定義靜態成員,這是大的特點。然後再說一些細節方面的知識,例如,幾種定義方式的語法區別,靜態內部類,以及匿名內部類。

轉自:http://blog.sina.com.cn/s/blog_105817120102vyyv.html

相關介紹:http://www.cnblogs.com/wangzhongqiu/p/6574019.html

http://www.cnblogs.com/wangzhongqiu/p/6574110.html