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

淺談Java面向對象之內(nèi)部類

 更新時間:2021年06月15日 08:50:27   作者:烏漆WhiteMoon  
內(nèi)部類是一個非常有用的特性但又比較難理解使用的特性,我們從外面看是非常容易理解的,無非就是在一個類的內(nèi)部在定義一個類。其實使用內(nèi)部類最大的優(yōu)點就在于它能夠非常好的解決多重繼承的問題

內(nèi)部類

內(nèi)部類是定義在另一個類中的類,例如 TalkingClock 類中內(nèi)嵌了 TimePrinter 類:

class TalkingClock{
   private int interval;
   private boolean beep;
 
   public TalkingClock(int interval, boolean beep){}
   public void start(){}
 
   public class TimePrinter implements ActionListener{
      public void actionPerformed(ActionEvent event){}
   }
}

內(nèi)部類可以對同一個包中的其他類隱藏細節(jié),同時內(nèi)部類中的方法可以訪問原來的類中的作用域數(shù)據(jù)。

訪問外部對象

內(nèi)部類可以訪問自身的數(shù)據(jù)字段,也可以訪問創(chuàng)建它的外圍類對象的數(shù)據(jù)字段。內(nèi)部類會有一個隱式引用,指向創(chuàng)建它的外部類對象。


對外圍類的引用在構造器中設置,編譯器會修改所有內(nèi)部類的構造器,添加一個對外部類引用的參數(shù)。使用外部類引用的語法為:

OuterClass.this

例如內(nèi)部類 TimePrinter 引用外部類 TalkingClock 的 beep 參數(shù),嚴格來說要寫成這樣。

TalkingClock.this.beep

訪問內(nèi)部對象

使用內(nèi)部類的構造器時,可以使用下面的語法來實現(xiàn):

outerObject.new InnerClass(construction parameters)

在外部類的作用域之外,想要引用內(nèi)部類就需要用下面的語法:

OuterClass.InnerClass

局部內(nèi)部類

局部內(nèi)部類類似方法的局部變量,在類外或者類的其他方法中不能訪問這個內(nèi)部類。通常情況下可以在某個方法中局部實現(xiàn)一個類,這個類將用于輔助該方法的功能實現(xiàn)。例如:

public void start(){
      class TimePrinter implements ActionListener{
            public void actionPerformed(ActionEvent event){
                  System.out.println("The time is " + Instant.ofEpochMilli(event.getWhen()));
                  if (beep) {
                        Toolkit.getDefaultToolkit().beep();
                  }
            }
      }
 
      TimePrinter listener = new TimePrinter();
      TalkingClock timer = new Timer(interval, listener);
      timer.start();
} 

聲明局部類時不能有訪問說明符,局部類的作用域被限定在了這個局部類塊中。局部類可以做到對外界的絕對隱藏,這是個很大的優(yōu)勢。
局部類還有個優(yōu)點,就是可以訪問局部變量。當局部變量傳參進來時,局部變量也會被傳入構造器,此時編譯器會為局部變量提供相應的實例字段,保存一個副本。這么做的好處是,當函數(shù)調用結束導致局部變量消失時,局部類還能夠使用這個局部變量。例如將上述的 start 方法改為傳入 2 個參數(shù),仍然不影響正常使用。

public void start(int interval, boolean beep)

匿名內(nèi)部類

使用局部類時,如果只是想建立這個局部類的一個對象,甚至不需要給出這個類的名字,這種類就成為匿名內(nèi)部類。匿名內(nèi)部類的語法為:

new SuperType(construction parameters){
      inner class methods and data
}
 
new InterfaceType(){
      methods and data
}

SuperType 指的是超類,此時局部類就需要拓展這個類。匿名局部類可以基于接口創(chuàng)建,此時局部類就要實現(xiàn)這個接口。由于構造器的名字必須和類名相同,而匿名局部類沒有類名,因此匿名局部類不能有構造器,此時如果要構造參數(shù)就需要傳遞給超類的構造器。例如將上述的局部類改造成匿名內(nèi)部類:

public void start(){
      var listener = new ActionListener(){
               public void actionPerformed(ActionEvent event){
                  System.out.println("The time is " + Instant.ofEpochMilli(event.getWhen()));
                  if (beep) {
                        Toolkit.getDefaultToolkit().beep();
                  }
               } 
          }
      TalkingClock timer = new Timer(interval, listener);
      timer.start();
} 

靜態(tài)內(nèi)部類

有時候使用內(nèi)部類只是想隱藏一個類,并不需要內(nèi)部類有外部類的引用,因此可以用 static 關鍵字聲明靜態(tài)內(nèi)部類。例如定義 ArrayAlg 類中實現(xiàn) minmax 方法,minmax 方法的功能是同時返回一個數(shù)組的最大值和最小值,但是用 return 只能返回一個值。因此可以定義一個靜態(tài)內(nèi)部類 Pair,Pair 類有兩個參數(shù)可以分別存儲最大和最小值,這樣就可以通過返回 Pair 方法同時返回 2 個值了。

class ArrayAlg{
   public static class Pair{
      private double first;
      private double second;
 
      public Pair(double f, double s){
         first = f;
         second = s;
      }
 
      public double getFirst() { return first; }
      public double getSecond() { return second; }
   }
 
   public static Pair minmax(double[] values){
      double min = Double.POSITIVE_INFINITY;
      double max = Double.NEGATIVE_INFINITY;
      for (double v : values){
         if (min > v) min = v;
         if (max < v) max = v;
      }
      return new Pair(min, max);
   }
}

只要內(nèi)部類不需要訪問外圍類對象,就應該聲明為靜態(tài)內(nèi)部類。和其他內(nèi)部類不同,靜態(tài)內(nèi)部類可以有靜態(tài)字段和方法。

以上就是淺談Java面向對象之內(nèi)部類的詳細內(nèi)容,更多關于Java面向對象內(nèi)部類的資料請關注腳本之家其它相關文章!

相關文章

  • Java實現(xiàn)的日期處理類完整實例

    Java實現(xiàn)的日期處理類完整實例

    這篇文章主要介紹了Java實現(xiàn)的日期處理類,結合完整實例形式分析了Java針對日期的獲取、運算、轉換等相關操作技巧,需要的朋友可以參考下
    2017-09-09
  • SSH框架網(wǎng)上商城項目第18戰(zhàn)之過濾器實現(xiàn)購物登錄功能的判斷

    SSH框架網(wǎng)上商城項目第18戰(zhàn)之過濾器實現(xiàn)購物登錄功能的判斷

    這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第18戰(zhàn):過濾器實現(xiàn)購物登錄功能的判斷,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java多線程之線程同步

    Java多線程之線程同步

    這篇文章主要介紹了Java多線程之線程同步,文中有非常詳細的代碼示例,對正在學習java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • java文件刪除不了的坑,特別是壓縮文件問題

    java文件刪除不了的坑,特別是壓縮文件問題

    這篇文章主要介紹了java文件刪除不了的坑,特別是壓縮文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 如何在springMVC的controller中獲取request

    如何在springMVC的controller中獲取request

    這篇文章主要介紹了如何在springMVC的controller中獲取request,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 聊聊Java Double相加出現(xiàn)的怪事

    聊聊Java Double相加出現(xiàn)的怪事

    這篇文章主要介紹了Java Double相加出現(xiàn)的怪事,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Jmeter非GUI模式運行分布式測試

    Jmeter非GUI模式運行分布式測試

    這篇文章主要介紹了Jmeter非GUI模式運行分布式測試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • Java中創(chuàng)建線程的四種方法解析

    Java中創(chuàng)建線程的四種方法解析

    這篇文章主要介紹了Java中創(chuàng)建線程的四種方法解析,線程是Java編程語言中的一個重要概念,它允許程序在同一時間執(zhí)行多個任務,線程是程序中的執(zhí)行路徑,可以同時執(zhí)行多個線程,每個線程都有自己的執(zhí)行流程,需要的朋友可以參考下
    2023-10-10
  • Java使用Instant時輸出的時間比預期少了八個小時

    Java使用Instant時輸出的時間比預期少了八個小時

    在Java中,LocalDateTime表示沒有時區(qū)信息的日期和時間,而Instant表示基于UTC的時間點,本文主要介紹了Java使用Instant時輸出的時間比預期少了八個小時的問題解決,感興趣的可以了解一下
    2024-09-09
  • java中字符串與日期的轉換實例

    java中字符串與日期的轉換實例

    java中字符串與日期的轉換實例,需要的朋友可以參考一下
    2013-05-05

最新評論