經典Java面試題-內部類

[面試原題]面試

如下代碼運行結果是什麼?函數

public class BwfOuterClass {this

      private int x = 1;code

      private int y = 2;對象

      private class BwfInnerClass{get

           private int x = 3;class

           public void print(){變量

                 System.out.println("博爲峯:x+y="+(x+y) );擴展

           }方法

      }

      public static void main(String[] args) {

           new BwfOuterClass().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(靜態內部類),則初始化語句能夠寫成:

      new BwfOuterClass.BwfInnerClass().print();

      可是要注意的是,靜態內部類不能夠調用非靜態外部類的屬性和方法。這點跟靜態函數是同樣的。靜態內部類與非靜態內部類還有一個區別,靜態內部類能夠定義靜態變量和方法,非靜態內部類不容許定義靜態變量和方法。

相關文章
相關標籤/搜索