欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 微服務(wù)架構(gòu)

    詳解Java 微服務(wù)架構(gòu)

    這篇文章主要介紹了Java 微服務(wù)架構(gòu)的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • Java中StringBuilder常用構(gòu)造方法解析

    Java中StringBuilder常用構(gòu)造方法解析

    這篇文章主要介紹了Java中StringBuilder常用構(gòu)造方法解析,StringBuilder是一個可標的字符串類,我們可以吧它看成是一個容器這里的可變指的是StringBuilder對象中的內(nèi)容是可變的,需要的朋友可以參考下
    2024-01-01
  • 重寫equals的同時為何要重寫hashCode?

    重寫equals的同時為何要重寫hashCode?

    這篇文章主要給大家介紹了關(guān)于重寫equals的同時為何要重寫hashCode的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 解決Elasticsearch因jdk版本問題啟動失敗的問題

    解決Elasticsearch因jdk版本問題啟動失敗的問題

    這篇文章主要介紹了解決Elasticsearch因jdk版本問題啟動失敗的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java老手該當心的13個錯誤

    Java老手該當心的13個錯誤

    這篇文章主要介紹了Java老手該當心的13個錯誤,需要的朋友可以參考下
    2015-04-04
  • ShardingSphere數(shù)據(jù)分片算法及測試實戰(zhàn)

    ShardingSphere數(shù)據(jù)分片算法及測試實戰(zhàn)

    這篇文章主要為大家介紹了ShardingSphere數(shù)據(jù)分片算法及測試實戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • spring aop execution表達式的用法

    spring aop execution表達式的用法

    這篇文章主要介紹了spring aop execution表達式的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot主鍵ID傳到前端后精度丟失的問題解決

    SpringBoot主鍵ID傳到前端后精度丟失的問題解決

    這篇文章主要通過示例為大家詳細介紹一些SpringBoot如何解決雪花算法主鍵ID傳到前端后精度丟失問題,文中的示例代碼講解詳細,需要的可以參考一下
    2022-05-05
  • Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實例

    Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實例

    這篇文章主要介紹了Mybatis以main方法形式調(diào)用dao層執(zhí)行代碼實例,MyBatis 是一款優(yōu)秀的持久層框架,MyBatis 免除了幾乎所有的 JDBC 代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作,需要的朋友可以參考下
    2023-08-08
  • Java編程基本概念

    Java編程基本概念

    本文主要介紹了Java編程的基本概念,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03

最新評論