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

java 嵌套類的詳解及實(shí)例代碼

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

java 嵌套類

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

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

內(nèi)部類

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

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

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

實(shí)例代碼:

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的訪問(wèn)權(quán)限,因此只能在Human內(nèi)部使用。這樣,Cup類就成為一個(gè)被Human類專用的類。

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

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)部類為默認(rèn)訪問(wèn)權(quán)限(包訪問(wèn)權(quán)限)。我們可以在Test類中訪問(wèn)Human的內(nèi)部類Cup,并使用該內(nèi)部類創(chuàng)建對(duì)象。注意我們創(chuàng)建時(shí)如何說(shuō)明類型以及使用new:

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

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

閉包

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

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

與此同時(shí),內(nèi)部類對(duì)象可以訪問(wèn)它所依附的外部類對(duì)象的成員(即使是private的成員)。從另一個(gè)角度來(lái)說(shuō),內(nèi)部類對(duì)象附帶有創(chuàng)建時(shí)的環(huán)境信息,也就是其他語(yǔ)言中的閉包(closure)特性。可參考Python閉包

我們看下面的例子:

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

運(yùn)行結(jié)果:

Vamei
Vamei
Jerry

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

嵌套static類

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

我們可以直接創(chuàng)建嵌套static類的對(duì)象,而不需要依附于外部類的某個(gè)對(duì)象。相應(yīng)的,嵌套static類也無(wú)法調(diào)用外部對(duì)象的方法,也無(wú)法讀取或修改外部對(duì)象的數(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類時(shí),我們同樣可以有不同的訪問(wèn)權(quán)限修飾符。

總結(jié)

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

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

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

相關(guān)文章

  • Java使用try-with-resources實(shí)現(xiàn)自動(dòng)解鎖

    Java使用try-with-resources實(shí)現(xiàn)自動(dòng)解鎖

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

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

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

    和田县| 平江县| 越西县| 信丰县| 来凤县| 平阴县| 太原市| 江津市| 宿松县| 高邑县| 新兴县| 阿拉善右旗| 黔西| 南安市| 四子王旗| 巨野县| 靖宇县| 会宁县| 宁国市| 灵璧县| 松阳县| 沭阳县| 嘉兴市| 苏州市| 尚志市| 兴城市| 盖州市| 垣曲县| 都兰县| 浠水县| 遂川县| 抚宁县| 伽师县| 广饶县| 竹溪县| 额尔古纳市| 红原县| 拜泉县| 资中县| 桐乡市| 宣汉县|