程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 介紹嵌套類和內部類

介紹嵌套類和內部類

編輯:關於JAVA

在另一個類中定義的類就是嵌套類(nested classes)。嵌套類的范圍由裝入它的類的范圍限制。這樣,如果類B被定義在類A之內,那麼B為A所知,然而不被A的外面所知。嵌套類可以訪問嵌套它的類的成員,包括private 成員。但是,包圍類不能訪問嵌套類的成員。

嵌套類一般有2種類型:前面加static標識符的和不加static 標識符的。一個static的嵌套類有static修飾符。因為它是static,所以只能通過對象來訪問它包圍類的成員。也就是說,它不能直接引用它包圍類的成員。因為有這個限制,所以static嵌套類很少使用。

嵌套類最重要的類型是內部類(inner class)。內部類是非static的嵌套類。它可以訪問它的外部類的所有變量和方法,它可以直接引用它們,就像外部類中的其他非static成員的功能一樣。這樣,一個內部類完全在它的包圍類的范圍之內。

下面的程序示例了如何定義和使用一個內部類。名為Outer 的類有一個名為outer_x 的示例變量,一個名為test()的實例方法,並且定義了一個名為Inner 的內部類。

// Demonstrate an inner class.

class Outer {

int outer_x = 100;

void test() {

Inner inner = new Inner();

inner.display();

}

// this is an inner class class Inner { void display() {System.out.println("display: outer_x = " + outer_x); }}}

class InnerClassDemo {

public static void main(String args[]) {

Outer outer = new Outer();

outer.test();

}

}

該程序的輸出如下所示:

display: outer_x = 100

在本程序中,內部類Inner 定義在Outer 類的范圍之內。因此,在Inner 類之內的任何代碼可以直接訪問變量outer_x 。實例方法display() 定義在Inner 的內部,該方法以標准的輸出流顯示 outer_x 。InnerClassDemo 的main( ) 方法創建類Outer 的一個實例並調用它的test( )方法。創建類Inner 和display() 方法的一個實例的方法被調用。

認識到Inner 類只有在類Outer 的范圍內才是可知的是很重要的。如果在類Outer 之外的任何代碼試圖實例化Inner 類,Java 編譯器會產生一條錯誤消息。總體來說,一個嵌套類和其他任何另外的編程元素沒有什麼不同:它僅僅在它的包圍范圍內是可知的。

我們解釋過,一個內部類可以訪問它的包圍類的成員,但是反過來就不成立了。內部類的成員只有在內部類的范圍之內是可知的,而且不能被外部類使用。例如:

// This program will not compile.

class Outer {

int outer_x = 100;

void test() {

Inner inner = new Inner();

inner.display();

}

// this is an inner class

class Inner {

int y = 10; // y is local to Inner

void display() {

System.out.println("display: outer_x = " + outer_x);

}

}

void showy() { System.out.println(y); // error,y not known here!}}

class InnerClassDemo {

public static void main(String args[]) {

Outer outer = new Outer();

outer.test();

}

}

這裡,y是作為Inner 的一個實例變量來聲明的。這樣對於該類的外部它就是不可知的,因此不能被showy() 使用。

盡管我們強調嵌套類在它的外部類的范圍之內聲明,但在幾個程序塊的范圍之內定義內部類是可能的。例如,在由方法定義的塊中,或甚至在for 循環體內部,你也可以定義嵌套類,如下面的程序所示:

// Define an inner class within a for loop.

class Outer {

int outer_x = 100;

void test() { for(int i=0; i<10; i++) { class Inner { void display() {System.out.println("display: outer_x = " + outer_x);

}

}

Inner inner = new Inner();

inner.display();

}

}

}

class InnerClassDemo {

public static void main(String args[]) {

Outer outer = new Outer();

outer.test();

}

}

該程序的這個版本的輸出如下所示。

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

display: outer_x = 100

盡管嵌套類在日常的大多數編程中不使用,但當處理applet (小應用程序)時是特別有幫助的。在第20章中我們將繼續嵌套類的話題。在那裡你將看到對於某些類型的事件內部類如何被用來簡化代碼。你也將了解匿名內部類(anonymous inner classes),它是一個沒有名字的內部類。

最後一點:嵌套類在Java 的最初的1.0版本中是不允許的。直到Java 1.1 中才添加了嵌套類。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved