深入理解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 19:20
下一篇 2015-04-07 19:21

相關推薦

  • Linux權限基本介紹,管理

     Linux權限機制采用UGO模式。其中 u(user)表示所屬用戶、g(group)表示所屬組、o(other)表示除了所屬用戶、所屬組之外的情況。 u、g、o 都有讀(read)、寫(write)、執行(excute) 三個權限,所以UGO模式是三類九種基本權限。         用命令 ls …

    Linux干貨 2017-07-22
  • 馬哥教育網絡班21期-第7周課程練習

    第7周課程練習 創建一個10G分區,并格式為ext4文件系統; 添加一塊硬盤sdb 要求其block大小為2048,       預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; # mke2fs -t ext4 -b 2048 -L 'MYDATA' -m 2 # mount -o ac…

    Linux干貨 2016-10-09
  • FHS文件系統以及各目錄功能

    FHS:Filesystem Hierarchy Standard(文件系統目錄標準)的縮寫,多數Linux版本采用這種文件組織形式,類似于Windows操作系統中c盤的文件目錄,FHS采用樹形結構組織文件。FHS定義了系統中每個區域的用途、所需要的最小構成的文件和目錄,同時還給出了例外處理與矛盾處理,規范在根目錄(/)下面各個主要目錄應該放什么樣的文件。 …

    Linux干貨 2016-10-17
  • LVS+Keepalived實現負載均衡

    keepalived工作原理 keepalived是基于VRRP協議實現的保證集群高可用的一個服務軟件,主要功能是實現后端真實服務器的故障隔離和負載均衡器間的失敗切換,防止單點故障。 VRRP協議全稱:虛擬路由冗余協議(Virtual Route Redundancy Protocol)。 keepalived安裝 # yum install keepali…

    2017-11-26
  • vim簡單總結

    編輯器種類 常用的文本編輯器有: 行編輯器,如sed,awk,cut等 全屏編輯器,如vi,vim(vi增強版),nano等 vim的模式 命令模式:使用vim filename打開文件后,進入的第一個模式。 直接使用鍵盤操作文本的編輯 插入模式:INSERT模式 進入:i,從當前光標處開始 進入:I,從當前行行首開始 末行模式:vim內置命令接口。 以:開…

    Linux干貨 2016-08-18
  • 分布式文件系統Mogilefs介紹與安裝

    一、分布式文件系統簡介: 什么是分布式存儲:       分布式存儲系統,是將數據分散存儲在多臺獨立的設備上。傳統的網絡存儲系統采用集中的存儲服務器存放所有數據,存儲服務器成為系統性能的瓶頸,也是可靠性和安全性的焦點,不能滿足大規模存儲應用的需要。分布式網絡存儲系統采用可擴展的系統結構,利用多臺存儲…

    Linux干貨 2016-05-04
欧美性久久久久