• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天之道

            享受編程的樂趣。
            posts - 118, comments - 7, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            淺談Java內部類

            Posted on 2013-09-28 14:26 hoshelly 閱讀(255) 評論(0)  編輯 收藏 引用 所屬分類: Java

            什么是內部類呢?顧名思義,內部類就是在類中可以定義另一個的類。內部類是外部對象的一個成員,同樣具有public , private 和 protected的訪問權限。

            public class Test
            {
                public static void main(String[] args)
                {
                  Family my = new Family(“Jonh",130);
                  my.getMsg();
                }
            }
            class Family
            {
                 Family(String name,int weight){ this.f = new Father(name,weight); }
                 private class Father
                 {
                   private int weight;
                   private String name;
                   Father(String n,int w)
                   {
                      this.name = n;
                      this.weight = w;
                   }
                   public int getWeight()
                   {
                      return weight;
                   }
                   public String getName()
                   {
                      return name;
                   }
                  }

                 private Father f;
                 public void getMsg()
                 {
                      System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight());
                 }
            }
            類Family 中有一個Father類,聲明為private,表明在Family類中可以創建一個實例對象,這個Father專屬于Family類。普通的(非內部)類不能聲明為private或者protected,只能聲明為public。因此這樣的代碼是不被允許的:
            Family.Father a = my.new Father("Jonh",150);

            如果要使用上述代碼,只要修改內部類的訪問權限就可以了,如去掉private權限,則默認為包訪問權限,同一個包中的類都可以訪問它,而不是只能從Family類才能訪問。

            public class test
            {
                public static void main(String[] args)
                {
                  Family my = new Family("Jonh",130);
                  my.getMsg();
                  Family.Father a = my.new Father("Jonh",150);
                  System.out.println("Name: "+a.getName()+"\nWeight: "+a.getWeight());
                 
                }
            }
            在上述代碼中,在創建內部類對象時,語法為:Family.Father a = my.new Father("Jonh",150); 說明內部類對象的創建是基于一個外部類對象(my),也就是說內部類對象必須依附于一個外部類對象。

            內部類可以出現在所屬類的方法內或任意作用域內。像下面的代碼將內部類嵌入在方法內:

            public class test
            {
                public static void main(String[] args)
                {
                  Family my = new Family();
                  my.getMsg("Jonh",150);
                 
                }
            }
            class Family
            {
                 Family(){ }
                 public void getMsg(String s,int n)
                 {
                   class Father
                  {
                   private int weight;
                   private String name;
                   Father(String n,int w)
                   {
                      this.name = n;
                      this.weight = w;
                   }
                   public int getWeight()
                   {
                      return weight;
                   }
                   public String getName()
                   {
                      return name;
                   }
                  }
                  Father f = new Father(s,n);
                  System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight());
                 }
            }


            閉包

            內部類可以訪問外部類的成員變量(即使是private),如在Family類中添加成員變量height,在Father類中定義一個方法 getHeight(),則能成功訪問這個height變量,而在外部類中不能訪問內部類中的成員變量。


            class Family
            {
                 private int height = 180; /*定義外部類屬性height*/
                 Family(String name,int weight){ this.f = new Father(name,weight); }
                 private class Father
                 {
                   private int weight;
                   private String name;
                   Father(String n,int w)
                   {
                      this.name = n;
                      this.weight = w;
                   }
                   public int getWeight()
                   {
                      return weight;
                   }
                   public String getName()
                   {
                      return name;
                   }
                   public int getHeight()
                   {
                      return height;   /*訪問外部類的屬性height*/
                   }
                  }

                 private Father f;
                 public void getMsg()
                 {
                      System.out.println("Name: "+f.getName()+"\nWeight: "+f.getWeight()+"\nHeight: "+f.getHeight());
                 }
            }
            public class test
            {
                public static void main(String[] args)
                {
                  Family my = new Family("Jonh",130);
                  my.getMsg();
                    /* not allowed */
              /* System.out.println(my.weight); */
                }
            }

            如果把內部類單獨拿到外面來聲明,那么要使用外部類的屬性如height,就要先創建外部類的對象,再由對象調用其height屬性,現在由于內部類處于外部類中,所以在程序調用時不必再創建外部類的對象,直接就可以使用height,這樣減少了一部分內存空間的開銷。

            嵌套static類

            在類內部定義static類,稱為嵌套static類。
            我們可以直接創建嵌套類,而不必依賴于某個外部類對象。嵌套類無法調用外部對象的方法、也無法讀取或修改外部對象的數據。
            如:
            public class Test{
                public static void main(String[] args){
                    Father.Son John = new Father.Son();
                    John.display();
                 }
            }

            class Father{
              /*嵌套類*/
             static class Son{
                 public void display(){
                    System.out.println("I am his son.");
                 }
               }
            }

            總結
            1. 內部類豐富了類的組織形式;
            2. 內部類實現了閉包。



































            精品国际久久久久999波多野| 久久综合给合综合久久| 94久久国产乱子伦精品免费| 久久无码AV中文出轨人妻| 国内精品久久久久久久久电影网| 99久久无色码中文字幕| 欧美午夜A∨大片久久 | 久久精品国产亚洲AV无码麻豆 | 区久久AAA片69亚洲| 久久国产亚洲精品麻豆| 久久人妻AV中文字幕| 精品视频久久久久| 国产精品久久一区二区三区| 国产精品久久久久久久久软件| 久久久久综合网久久| 久久夜色精品国产噜噜噜亚洲AV| 久久夜色撩人精品国产| 丁香五月综合久久激情| 999久久久免费精品国产| 久久精品国产AV一区二区三区| 久久久久女教师免费一区| 亚洲狠狠综合久久| 国产一区二区三区久久| 亚洲人成精品久久久久| 亚洲欧洲精品成人久久奇米网| 93精91精品国产综合久久香蕉| 国产精品青草久久久久婷婷| 欧美午夜精品久久久久免费视 | 91精品国产综合久久婷婷| 久久婷婷色综合一区二区| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久国产亚洲精品麻豆| 99久久无码一区人妻a黑| 日韩人妻无码精品久久久不卡| 久久人人爽人人爽人人片AV高清| 香蕉久久夜色精品国产2020| 日本久久中文字幕| 午夜精品久久久内射近拍高清| 日韩欧美亚洲国产精品字幕久久久 | 亚洲乱码中文字幕久久孕妇黑人| 国产精品99久久久精品无码|