1. 程式人生 > >經典Java面試題-內部類

經典Java面試題-內部類

[面試原題]

以下程式碼執行結果是什麼?

public class BwfOuterClass {

      private int x = 1;

      private int y = 2;

      private classBwfInnerClass{

           private int x= 3;

           public voidprint(){

                 System.out.println("博為峰:x+y="+(x+y) );

           }

      }

      public static voidmain(String[] args) {

           newBwfOuterClass().new BwfInnerClass().print();

      }

}

[正確答案]

      博為峰:x+y=5

[面試技術點]

Java中內部類的使用。

[解讀]

      在Java中,可以將一個類定義在另一個類裡面或者一個方法裡面,這樣的類稱為內部類。廣泛意義上的內部類一般來說包括這三種:成員內部類、區域性內部類、匿名內部類,如下圖所示:


      本題考的是成員內部類。成員內部類是最普通的內部類,它的定義為位於另一個類的內部,類似於一個成員屬性。可以使用修飾符private、default、protected、public。

      本題中BwfInnerClass是BwfOuterClass的成員內部類,成員內部類可以無條件訪問外部類的所有成員屬性和成員方法(包括private成員和靜態成員)。但是值得注意的是,當成員內部類擁有和外部類同名的成員變數或者方法時,預設情況下訪問的是成員內部類的成員。如果要訪問外部類的同名成員,需要以下面的形式進行訪問:

      外部類.this.成員變數

外部類.this.成員方法

本題中,如果把print方法做如下修改:

public void print(){

      System.out.println("博為峰:x+y=" + (BwfOuterClass.this.x+y));

}

則輸出結果為:博為峰:x+y=3

[擴充套件]

      成員內部類是不能獨立被呼叫的,必須依附於外部類而存在,如果要建立成員內部類的物件,前提是必須存在一個外部類的物件。比如本題中的InnerClass例項的語句:

      new BwfOuterClass().new BwfInnerClass().print();

      因為BwfInnerClass是非靜態內部類,所以要先生成外部類的例項,再生成內部類的例項。

      如果BwfInnerClass定義為static(靜態內部類),則初始化語句可以寫成:

      newBwfOuterClass.BwfInnerClass().print();

      但是要注意的是,靜態內部類不可以呼叫非靜態外部類的屬性和方法。這點跟靜態函式是一樣的。靜態內部類與非靜態內部類還有一個區別,靜態內部類可以定義靜態變數和方法,非靜態內部類不允許定義靜態變數和方法。