• <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>

            天之道

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

            淺談Java內(nèi)部類

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

            什么是內(nèi)部類呢?顧名思義,內(nèi)部類就是在類中可以定義另一個(gè)的類。內(nèi)部類是外部對(duì)象的一個(gè)成員,同樣具有public , private 和 protected的訪問(wèn)權(quán)限。

            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 中有一個(gè)Father類,聲明為private,表明在Family類中可以創(chuàng)建一個(gè)實(shí)例對(duì)象,這個(gè)Father專屬于Family類。普通的(非內(nèi)部)類不能聲明為private或者protected,只能聲明為public。因此這樣的代碼是不被允許的:
            Family.Father a = my.new Father("Jonh",150);

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

            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());
                 
                }
            }
            在上述代碼中,在創(chuàng)建內(nèi)部類對(duì)象時(shí),語(yǔ)法為:Family.Father a = my.new Father("Jonh",150); 說(shuō)明內(nèi)部類對(duì)象的創(chuàng)建是基于一個(gè)外部類對(duì)象(my),也就是說(shuō)內(nèi)部類對(duì)象必須依附于一個(gè)外部類對(duì)象。

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

            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());
                 }
            }


            閉包

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


            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;   /*訪問(wèn)外部類的屬性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); */
                }
            }

            如果把內(nèi)部類單獨(dú)拿到外面來(lái)聲明,那么要使用外部類的屬性如height,就要先創(chuàng)建外部類的對(duì)象,再由對(duì)象調(diào)用其height屬性,現(xiàn)在由于內(nèi)部類處于外部類中,所以在程序調(diào)用時(shí)不必再創(chuàng)建外部類的對(duì)象,直接就可以使用height,這樣減少了一部分內(nèi)存空間的開銷。

            嵌套static類

            在類內(nèi)部定義static類,稱為嵌套static類。
            我們可以直接創(chuàng)建嵌套類,而不必依賴于某個(gè)外部類對(duì)象。嵌套類無(wú)法調(diào)用外部對(duì)象的方法、也無(wú)法讀取或修改外部對(duì)象的數(shù)據(jù)。
            如:
            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.");
                 }
               }
            }

            總結(jié)
            1. 內(nèi)部類豐富了類的組織形式;
            2. 內(nèi)部類實(shí)現(xiàn)了閉包。



































            99久久99久久久精品齐齐| 久久久久久夜精品精品免费啦| 久久99国产精品二区不卡| 国产精品久久久久国产A级| 久久精品www| 亚洲欧美久久久久9999| 中文字幕无码精品亚洲资源网久久| 久久久国产乱子伦精品作者| 99久久精品国产麻豆| 亚洲午夜无码久久久久小说| 久久久久久久亚洲Av无码| 久久97久久97精品免视看| 精品久久久久久国产| 情人伊人久久综合亚洲| 久久午夜夜伦鲁鲁片免费无码影视 | 久久久久国产成人精品亚洲午夜| 一级女性全黄久久生活片免费 | 一本久久a久久精品亚洲| 国产精品久久久久久| 97精品依人久久久大香线蕉97| 99久久精品免费国产大片| 亚洲色婷婷综合久久| 日韩久久无码免费毛片软件| 69国产成人综合久久精品| 亚洲精品成人久久久| 国产99久久九九精品无码| 久久丫精品国产亚洲av| 久久精品国产精品亚洲精品 | 性欧美大战久久久久久久久| 久久婷婷五月综合97色直播| 久久免费美女视频| www.久久99| 久久精品人人槡人妻人人玩AV | 久久99精品久久久久子伦| 久久综合亚洲色一区二区三区| 久久免费视频6| 美女久久久久久| 香蕉久久AⅤ一区二区三区| 开心久久婷婷综合中文字幕| 亚洲性久久久影院| 热久久最新网站获取|