最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 嵌套類的詳解及實例代碼

 更新時間:2017年03月01日 10:52:36   投稿:lqh  
這篇文章主要介紹了java 嵌套類的詳解及實例代碼的相關(guān)資料,需要的朋友可以參考下

java 嵌套類

到現(xiàn)在為止,我們都是在Java文件中直接定義類。這樣的類出現(xiàn)在包(package)的級別上。Java允許類的嵌套定義。

這里將講解如何在一個類中嵌套定義另一個類。

內(nèi)部類

Java允許我們在類的內(nèi)部定義一個類。如果這個類是沒有static修飾符,那么這樣一個嵌套在內(nèi)部的類稱為內(nèi)部類(inner class)。

內(nèi)部類被認為是外部對象的一個成員。在定義內(nèi)部類時,我們同樣有訪問權(quán)限控制(public, private, protected)。

在使用內(nèi)部類時,我們要先創(chuàng)建外部對象。由于內(nèi)部類是外部對象的一個成員,我們可以在對象的內(nèi)部自由使用內(nèi)部類:

實例代碼:

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    me.drinkWater(0.3);
  }
}

class Human
{
  /**
   * inner class
   */
  private class Cup
  {
    public void useCup(double w)
    {
      this.water = this.water - w;
    }

    public double getWater()
    {
      return this.water;
    }

    private double water = 1.0;
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.myCup = new Cup();
    this.name = n;
  }

  public void drinkWater(double w)
  {
    myCup.useCup(w);
    System.out.println(myCup.getWater());
  }


  private Cup myCup;
  private String name;
}

上面的例子中,Cup類為內(nèi)部類。該內(nèi)部類有private的訪問權(quán)限,因此只能在Human內(nèi)部使用。這樣,Cup類就成為一個被Human類專用的類。

如果我們使用其他訪問權(quán)限,內(nèi)部類也能從外部訪問,比如:

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    me.drinkWater(0.3);

    Human.Cup soloCup = me.new Cup(); // be careful here
  }
}

class Human
{
  /**
   * inner class
   */                                                                               
  class Cup
  {
    public void useCup(double w)
    {
      this.water = this.water - w;
    }

    public double getWater()
    {
      return this.water;
    }

    private double water = 1.0;
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.myCup = new Cup();
    this.name = n;
  }

  public void drinkWater(double w)
  {
    myCup.useCup(w);
    System.out.println(myCup.getWater());
  }


  private Cup myCup;
  private String name;
}

這里,內(nèi)部類為默認訪問權(quán)限(包訪問權(quán)限)。我們可以在Test類中訪問Human的內(nèi)部類Cup,并使用該內(nèi)部類創(chuàng)建對象。注意我們創(chuàng)建時如何說明類型以及使用new:

Human.Cup soloCup = me.new Cup();

我們在創(chuàng)建內(nèi)部類對象時,必須基于一個外部類對象(me),并通過該外部類對象來創(chuàng)建Cup對象(me.new)。我將在下一節(jié)講述其中的含義。

閉包

可以看到,我們直接創(chuàng)建內(nèi)部類對象時,必須是基于一個外部類對象。也就是說,內(nèi)部類對象必須依附于某個外部類對象。

                                            內(nèi)部對象與外部對象

與此同時,內(nèi)部類對象可以訪問它所依附的外部類對象的成員(即使是private的成員)。從另一個角度來說,內(nèi)部類對象附帶有創(chuàng)建時的環(huán)境信息,也就是其他語言中的閉包(closure)特性??蓞⒖糚ython閉包

我們看下面的例子:

public class Test
{
  public static void main(String[] args)
  {
    Human me    = new Human("Vamei");
    Human him    = new Human("Jerry");

    Human.Cup myFirstCup = me.new Cup();
    Human.Cup mySecondCup = me.new Cup();
    Human.Cup hisCup   = him.new Cup();
    System.out.println(myFirstCup.whosCup());
    System.out.println(mySecondCup.whosCup());
    System.out.println(hisCup.whosCup());
  }
}

class Human
{
  /**
   * inner class
   */
  class Cup
  {
    public String whosCup()
    {
      return name; // access outer field
    }
  }

  /**
   * constructor
   */
  public Human(String n)
  {
    this.name = n;
  }


  public void changeName(String n)
  {
    this.name = n;
  }

  private String name;
}

運行結(jié)果:

Vamei
Vamei
Jerry

 在上面的例子中,我們通過內(nèi)部類對象訪問外部類對象的name成員。當我們基于不同的外部對象創(chuàng)建內(nèi)部類對象時,所獲得的環(huán)境信息也將隨之變化。

嵌套static類

我們可以在類的內(nèi)部定義static類。這樣的類稱為嵌套static類(nested static class)。

我們可以直接創(chuàng)建嵌套static類的對象,而不需要依附于外部類的某個對象。相應(yīng)的,嵌套static類也無法調(diào)用外部對象的方法,也無法讀取或修改外部對象的數(shù)據(jù)。從效果上看,嵌套static類拓展了類的命名空間(name space),比如下面的Human.Mongolian:

public class Test
{
  public static void main(String[] args)
  {
    Human.Mongolian him = new Human.Mongolian();
    him.Shout();
  }
}

class Human
{
  /**
   * nested class
   */
  static class Mongolian
  {
    public void Shout()
    {
      System.out.println("Oh...Ho...");
    }
  }
}

在定義嵌套static類時,我們同樣可以有不同的訪問權(quán)限修飾符。

總結(jié)

嵌套類允許我們更好的組織類

內(nèi)部類實現(xiàn)了閉包

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Java使用try-with-resources實現(xiàn)自動解鎖

    Java使用try-with-resources實現(xiàn)自動解鎖

    項目中使用Redission分布式鎖,每次使用都需要顯示的解鎖,很麻煩,Java 提供了 try-with-resources 語法糖,它不僅可以用于自動關(guān)閉流資源,還可以用于實現(xiàn)自動解鎖,本文將介紹如何利用 try-with-resources 實現(xiàn)鎖的自動釋放,需要的朋友可以參考下
    2025-01-01
  • Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui詳解

    Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui詳解

    這篇文章主要介紹了Mybatis-Plus開發(fā)提速器mybatis-plus-generator-ui,本文簡要介紹一款基于Mybatis-Plus的代碼自助生成器,文章通過實例集成的方式來詳細講解mybatis-plus-generator-ui,從相關(guān)概念到實際集成案例,以及具體的擴展開發(fā)介紹,需要的朋友可以參考下
    2022-11-11
  • 最新評論

    从化市| 内乡县| 新津县| 东海县| 陵川县| 元氏县| 侯马市| 时尚| 卓资县| 慈溪市| 孙吴县| 朝阳市| 扎鲁特旗| 阳山县| 吉安市| 宿州市| 板桥市| 古浪县| 铜鼓县| 滨海县| 西乌珠穆沁旗| 额敏县| 绥江县| 益阳市| 昌图县| 潢川县| 健康| 五指山市| 南康市| 疏勒县| 虎林市| 大埔县| 怀宁县| 渝北区| 垫江县| 海安县| 古浪县| 藁城市| 桓台县| 会理县| 永年县|