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

Java語言基礎:內部類

編輯:關於JAVA

內部類,計算機面向對象程序設計概念。向對象程序設計中,可以在一個類的內部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型,即靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為內部類(inner)。內部類是Java語言的主要附加部分。內部類幾乎可以處於一個類內部任何位置,可以與實例變量處於同一級,或處於方法之內,甚至是一個表達式的一部分。

1. 普通內部類

普通內部類的一個最簡單的例子:

  1. // 外部類
  2. class OutterClass {
  3. // 內部類
  4. public class InnerClass {
  5. private int i = 0;
  6. public int getInt(){
  7. return i;
  8. }
  9. }
  10. public void proc(){
  11. InnerClass inClass = new InnerClass();
  12. System.out.println(inClass.getInt());
  13. }
  14. }
  15. public class Main {
  16. public static void main(String[] args) {
  17. OutterClass outClass = new OutterClass();
  18. outClass.proc();
  19. }
  20. }

外部類可以訪問內部類的私有成員,內部類也可以訪問外部類的私有成員:

  1. // 外部類
  2. class OutterClass {
  3. private int mOut = 10;
  4. // 內部類
  5. public class InnerClass {
  6. private int mIn = 0;
  7. public void printOutPrivate(){
  8. // 直接打印外部類的成員
  9. System.out.println(mOut);
  10. }
  11. }
  12. public void printInPrivate(){
  13. InnerClass inClass = new InnerClass();
  14. // 直接打印內部類的私有成員
  15. System.out.println(inClass.mIn);
  16. }
  17. public void printOutPrivate(){
  18. InnerClass inClass = new InnerClass();
  19. inClass.printOutPrivate();
  20. }
  21. }
  22. public class Main {
  23. public static void main(String[] args) {
  24. OutterClass outClass = new OutterClass();
  25. outClass.printInPrivate();
  26. outClass.printOutPrivate();
  27. }
  28. }

如果外部類的成員變量與內部類的成員變量名字相同,當內部類要訪問外部類的該成員時,可以使用“OutClass.this.mem”來區分:

  1. // 外部類
  2. class OutterClass {
  3. private int mMem = 10;
  4. // 內部類
  5. public class InnerClass {
  6. private int mMem = 0;
  7. public void printOutPrivate(){
  8. // 直接打印外部類的成員
  9. System.out.println(OutterClass.this.mMem);
  10. }
  11. }
  12. }

要創建普通內部類,必須先創建相應的外部類:

  1. // 外部類
  2. class OutterClass {
  3. private int mMem = 10;
  4. // 內部類
  5. public class InnerClass {
  6. private int mMem = 0;
  7. public void printOutPrivate(){
  8. // 直接打印外部類的成員
  9. System.out.println(OutterClass.this.mMem);
  10. }
  11. }
  12. }
  13. public class Main {
  14. public static void main(String[] args) {
  15. OutterClass outClass = new OutterClass();
  16. OutterClass.InnerClass inClass = outClass.new InnerClass();
  17. inClass.printOutPrivate();
  18. }
  19. }

也可以用下面的方式:

  1. // 外部類
  2. class OutterClass {
  3. private int mMem = 10;
  4. // 內部類
  5. public class InnerClass {
  6. private int mMem = 0;
  7. public void printOutPrivate(){
  8. // 直接打印外部類的成員
  9. System.out.println(OutterClass.this.mMem);
  10. }
  11. }
  12. public InnerClass newInnerClass() {
  13. return new InnerClass();
  14. }
  15. }
  16. public class Main {
  17. public static void main(String[] args) {
  18. OutterClass outClass = new OutterClass();
  19. OutterClass.InnerClass inClass = outClass.newInnerClass();
  20. inClass.printOutPrivate();
  21. }
  22. }

2. 靜態內部類

普通內部類前面加上static修飾符,就成為靜態內部類,靜態內部類類似於C++的嵌套類,與普通內部類相比有如下區別:

靜態內部類沒有指向外部類的引用,外部類對於它來說更像一個名字空間。

普通內部類不能有靜態成員,靜態方法,或另一個靜態內部類;而靜態內部類可以有這一切。

靜態內部類可以直接創建,不必先創建外部類:

  1. // 外部類
  2. class OutterClass {
  3. private int mMem = 0;
  4. // 靜態內部類
  5. static public class InnerClass {
  6. private int mMem = 0;
  7. public void printOutPrivate(){
  8. // 這是錯誤的
  9. // System.out.println(OutterClass.this.mMem);
  10. }
  11. }
  12. public void printInPrivate() {
  13. InnerClass inClass = new InnerClass();
  14. // 可以直接訪問靜態內部類的成員
  15. System.out.println(inClass.mMem);
  16. }
  17. }
  18. public class Main {
  19. public static void main(String[] args) {
  20. // 直接創建靜態內部類
  21. OutterClass.InnerClass inClass = new OutterClass.InnerClass();
  22. inClass.printOutPrivate();
  23. }
  24. }

從上面描述可以看出,靜態內部類與一般類沒有太大區別,只不過它是放在一個類的裡面,這個類相當於它的名字空間,可以防止命名沖突。

3. 局部內部類

Java可以把一個類定義在一個方法裡面,甚至是一個{}塊裡面,它的作用域就在這個塊裡面:

  1. // 外部類
  2. class OutterClass {
  3. public void testLocalInner() {
  4. if (true)
  5. {
  6. class LocalInner {
  7. public void proc() {
  8. System.out.println("hello");
  9. }
  10. }
  11. // 可以創建使用
  12. LocalInner localInner = new LocalInner();
  13. localInner.proc();
  14. }
  15. // 錯誤:超出類定義的作用域
  16. LocalInner localInner = new LocalInner();
  17. localInner.proc();
  18. }
  19. }

局部內部類的一般用途是實現某個接口,並作為這個接口傳出方法被使用:

  1. // 接口
  2. interface Talker {
  3. public void Talk();
  4. }
  5. // 外部類
  6. class OutterClass {
  7. public Talker getTalker() {
  8. // 現實該接口的局部內部類
  9. class SomeTalker implements Talker {
  10. public void Talk() {
  11. System.out.println("hello");
  12. }
  13. }
  14. // 創建類實例並作為Talker返回
  15. SomeTalker talker = new SomeTalker();
  16. return talker;
  17. }
  18. }
  19. public class Main {
  20. public static void main(String[] args) {
  21. OutterClass outClass = new OutterClass();
  22. Talker talker = outClass.getTalker();
  23. talker.Talk();
  24. }
  25. }

4. 匿名內部類

匿名內部類的語法如下:

  1. new InterfaceName(){......}; 或 new SuperclassName(){......};

它被認為是InterfaceName的實現者,或是SuperclassName的繼承類,匿名內部類沒有構建函數,如果SuperclassName有帶參數的構造函數,必須在創建匿名內部類時帶上這些參數,下面是匿名內部類最常見的使用場合:

  1. // 接口
  2. interface Talker {
  3. public void Talk();
  4. }
  5. // 外部類
  6. class OutterClass {
  7. public void Talk(Talker talker) {
  8. talker.Talk();
  9. }
  10. }
  11. public class Main {
  12. public static void main(String[] args) {
  13. OutterClass outClass = new OutterClass();
  14. // 直接生成一個匿名內部類
  15. outClass.Talk(new Talker(){
  16. public void Talk() {
  17. System.out.println("hello");
  18. }
  19. });
  20. }
  21. }
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved