深入理解java嵌套類和內部類

一、什么是嵌套類及內部類

  可以在一個類的內部定義另一個類,這種類稱為嵌套類(nested classes),它有兩種類型:靜態嵌套類和非靜態嵌套類。靜態嵌套類使用很少,最重要的是非靜態嵌套類,也即是被稱作為內部類(inner)。嵌套類從JDK1.1開始引入。其中inner類又可分為三種:
  其一、在一個類(外部類)中直接定義的內部類;
  其二、在一個方法(外部類的方法)中定義的內部類;
  其三、匿名內部類。

  下面,我將說明這幾種嵌套類的使用及注意事項。

二、靜態嵌套類

  如下所示代碼為定義一個靜態嵌套類,

public class StaticTest {   
        private static String name = "javaJohn";           
  private String id = "X001";  
  static class Person{  
    private String address = "swjtu,chenDu,China";  
    public String mail = "josserchai@yahoo.com";//內部類公有成員  
    public void display(){  
      //System.out.println(id);//不能直接訪問外部類的非靜態成員  
      System.out.println(name);//只能直接訪問外部類的靜態成員  
      System.out.println("Inner "+address);//訪問本內部類成員。  
    }  
  }  
  
  public void printInfo(){  
    Person person = new Person();  
    person.display();  
    //System.out.println(mail);//不可訪問  
    //System.out.println(address);//不可訪問  
    System.out.println(person.address);//可以訪問內部類的私有成員  
    System.out.println(person.mail);//可以訪問內部類的公有成員  
  
  }  
  public static void main(String[] args) {  
  StaticTest staticTest = new StaticTest();  
  staticTest.printInfo();  
}  
}

  在靜態嵌套類內部,不能訪問外部類的非靜態成員,這是由Java語法中"靜態方法不能直接訪問非靜態成員"所限定。若想訪問外部類的變量,必須通過其它方法解決,由于這個原因,靜態嵌套類使用很少。注意,外部類訪問內部類的的成員有些特別,不能直接訪問,但可以通過內部類來訪問,這是因為靜態嵌套內的所有成員和方法默認為靜態的了。同時注意,內部靜態類Person只在類StaticTest 范圍內可見,若在其它類中引用或初始化,均是錯誤的。

三、在外部類中定義內部類

  如下所示代碼為在外部類中定義兩個內部類及它們的調用關系:

public class Outer {   
           int outer_x = 100;  
    class Inner{  
      public int y = 10;  
      private int z = 9;  
      int m = 5;  
      public void display(){  
        System.out.println("display outer_x:"+ outer_x);  
      }  
      private void display2(){  
        System.out.println("display outer_x:"+ outer_x);  
      }  
    }  
    void test(){  
      Inner inner = new Inner();  
      inner.display();  
      inner.display2();  
      //System.out.println("Inner y:" + y);//不能訪問內部內變量  
      System.out.println("Inner y:" + inner.y);//可以訪問  
      System.out.println("Inner z:" + inner.z);//可以訪問  
      System.out.println("Inner m:" + inner.m);//可以訪問  
      InnerTwo innerTwo = new InnerTwo();  
      innerTwo.show();  
    }  
    class InnerTwo{  
      Inner innerx = new Inner();  
      public void show(){  
        //System.out.println(y);//不可訪問Innter的y成員  
        //System.out.println(Inner.y);//不可直接訪問Inner的任何成員和方法  
        innerx.display();//可以訪問  
        innerx.display2();//可以訪問  
        System.out.println(innerx.y);//可以訪問  
        System.out.println(innerx.z);//可以訪問  
        System.out.println(innerx.m);//可以訪問  
      }  
    }  
    public static void main(String args[]){  
      Outer outer = new Outer();  
      outer.test();  
    }  
  }

  以上代碼需要說明有,對于內部類,通常在定義類的class關鍵字前不加public 或 private等限制符,若加了沒有任何影響,同時好像這些限定符對內部類的變量和方法也沒有影響(?)。另外,就是要注意,內部類Inner及InnterTwo只在類Outer的作用域內是可知的,如果類Outer外的任何代碼嘗試初始化類Inner或使用它,編譯就不會通過。同時,內部類的變量成員只在內部內內部可見,若外部類或同層次的內部類需要訪問,需采用示例程序中的方法,不可直接訪問內部類的變量。

轉自:http://blog.csdn.net/hguisu/article/details/7270086

原創文章,作者:s19930811,如若轉載,請注明出處:http://www.www58058.com/2813

(0)
s19930811s19930811
上一篇 2015-04-07
下一篇 2015-04-07

相關推薦

  • vim編輯器作業

    1、復制/etc/profile至/tmp/目錄,用查找替換命令刪除/tmp/profile文件中的行首的空白字符 [root@wzc tmp]# vim profile    # By default, we want umask to …

    Linux干貨 2016-08-12
  • NTP時間服務器

        在集群環境和需要日志同步的多服務器應用中,為了能夠保證多臺服務器的之間的正常協作,就必須使它們的時間保持一致,在多臺服務器上手動調整時間是極其不科學的,這時就需要借助于NTP時間服務器來完成時間的同步。     一、NTP服務器的安裝    …

    Linux干貨 2015-06-25
  • 系統啟動及恢復

    一、知識整理 1、modinfo命令:顯示模塊的詳細描述信息: -n 只顯示模塊文件路徑 -p 顯示模塊參數 -a auther -d description -l license協議 modprobe命令:裝載或卸載內核 -r卸載內核,同rmmod 配置文件:/etc/modprobe.d/*.conf depmod命令:內核模塊依賴關系文件及系統信息映射…

    Linux干貨 2016-09-22
  • 文本處理工具之sed

    文本處理工具之sed 1、sed是一種行編輯器,對文本逐行處理。處理時,它會將文本行載入”模式空間”(臨時緩沖區),接著用sed命令對模式空間的內容進行處理,處理完成后,將模式空間內容輸出到顯示屏 與之類似的處理工具還有grep和awk,相比grep,sed不僅對文本有過濾功能,還可以對文本進行其他增刪改的操作。而相比awk,sed顯得更加簡單高效。下面我們…

    2017-03-18
  • 馬哥教育首屆IT技術博客大賽–結果揭曉

    號外、號外??!馬哥教育首屆博客大賽已圓滿結束。感謝小伙伴們的積極參與! 噼里啪啦,小伙伴們掌聲響起來,啤酒烤鴨high起來~~咳咳,跑題了,小編好像忘了一件很重要的事: 馬幫博客大賽就是與眾不同,全銀河系也就僅此一家,為啥這么說呢,您看啊,咱就喜歡原創,鼓勵原創,酷愛原創,以原創博客作為技術交流的平臺供大家隨意圍觀和吐槽,您看看,除了馬哥這里,哪里還有這么自…

    Linux干貨 2016-06-22
  • Bash shell 腳本編程全攻略(上篇)

    Bash shell 腳本編程全攻略(上篇)   什么是shell腳本呢? 當命令不在命令行上執行,而是通過一個文件執行時,該文件就稱為shell腳本,腳本以非交互的方式運行。Shell腳本把命令通過一些語法組織起來,便能實現特定的功能。   Shell腳本主要運用在系統運維中,主要功能有: 自動化常用命令; 執行系統管理和故障排除; 創…

    Linux干貨 2016-08-29
欧美性久久久久