CodeGym /Java Blog /Toto sisi /靜態嵌套類
John Squirrels
等級 41
San Francisco

靜態嵌套類

在 Toto sisi 群組發布
你好!我們繼續探討 Java 中嵌套類的主題。在上一個練習中,我們談到了非靜態嵌套類,也稱為內部類。靜態嵌套類 - 1今天我們繼續討論另一組類。我們將考慮靜態嵌套類。靜態嵌套類 - 3他們與其他班級有何不同?在聲明此類類時,我們使用您已經熟悉的 static 關鍵字:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {
      
       public static int getMaxPassengersCount() {
          
           return maxPassengersCount;
       }
   }
}
靜態嵌套類 - 4在這個例子中,我們有Boeing737外部類,它代表這種類型的飛機。它有一個帶有一個參數的構造函數:製造年份 ( int manufactureYear)。還有一個靜態變量:最大乘客數 ( int maxPassengersCount)。對於同一模型的所有平面,它將具有相同的值,因此我們只需要一個實例。此外,它還有一個靜態嵌套類:(Drawing代表飛機的工程藍圖)。我們用這個類來封裝飛機的所有官方信息。在我們的示例中,為簡單起見,我們將此類限制為製造年份,但它可能包含許多其他信息。 靜態嵌套類 - 5正如我們在上一課中所說,創建這樣一個嵌套類可以提高封裝性並有助於實現更現實的抽象。靜態和非靜態嵌套類有什麼區別?1.靜態類的對像Drawing不存儲對外部類的具體實例的引用。還記得上節課的自行車例子嗎:

public class Bicycle {

   private String model;
   private int maxWeight;

   public Bicycle(String model, int maxWeight) {
       this.model = model;
       this.maxWeight = maxWeight;
   }
  
   public void start() {
       System.out.println("Let's go!");
   }

   public class Handlebar {

       public void right() {
           System.out.println("Steer right!");
       }

       public void left() {

           System.out.println("Steer left!");
       }
   }

}
在那節課中,我們談到了這樣一個事實,即Handlebar內部類的每個實例都在不知不覺中傳遞了對Bicycle外部類實例的引用。沒有外部類的實例,內部類的對象就不可能存在。對於靜態嵌套類,情況並非如此。靜態嵌套類的對象完全能夠獨立存在。在這方面,靜態類比非靜態類更“獨立”。您唯一需要知道的是,在創建這樣一個對象時,您必須指定外部類的名稱:

public class Main {

   public static void main(String[] args) {

       Boeing737.Drawing drawing1 = new Boeing737.Drawing();
       Boeing737.Drawing drawing2 = new Boeing737.Drawing();
   }
}
為什麼我們Drawing在上一課中將類設為靜態Seat類(代表自行車座)非靜態?和上次一樣,讓我們添加一點“哲學”來理解這個例子:) 與自行車座椅不同,工程圖的概念並沒有嚴格地與飛機的概念聯繫在一起。如果沒有自行車,一個單獨的自行車座椅對象通常是沒有意義的(儘管並非總是如此,我們在上一節課中談到了這一點)。工程圖的概念本身就很有意義。例如,它可能對規劃飛機維護的工程師很有用。飛機不需要製定計劃,可以位於任何地方。只需要工程圖。此外,同一型號的所有飛機都將具有相同的工程師圖紙,因此不存在與自行車座椅之間的緊密關係。因此,一個Drawing對像不需要對特定飛機對象的引用。2.外部類的變量和方法的訪問方式不同。靜態嵌套類只能訪問外部類的靜態字段。在我們的示例中,該類Drawing有一個返回外部類getMaxPassengersCount()靜態變量值的方法。maxPassengersCount但是,我們不能getManufactureYear()Drawing類中創建方法來返回 的值manufactureYear。畢竟,manufactureYear變量是非靜態的,這意味著它必須屬於 的特定實例Boeing737。而且正如我們已經發現的那樣,在靜態嵌套類的情況下,外部類的對像很容易不存在。因此,限制 :) 靜態變量在外部類中具有哪個訪問修飾符並不重要。即使是private,靜態嵌套類仍然可以訪問。以上所有內容不僅適用於訪問靜態變量,也適用於靜態方法。 重要的!在內部類的聲明中,static關鍵字並不意味著只能創建一個對象。不要混淆對象和變量。如果我們談論的是靜態變量,那麼,是的,存在靜態類變量的單個實例,例如maxPassangersCount. 但是當static應用於嵌套類時,僅表示其對像不包含對外部類對象的引用。我們可以根據需要創建盡可能多的對象:

public class Boeing737 {

   private int manufactureYear;
   private static int maxPassengersCount = 300;

   public Boeing737(int manufactureYear) {
       this.manufactureYear = manufactureYear;
   }

   public int getManufactureYear() {
       return manufactureYear;
   }

   public static class Drawing {

       private int id;

       public Drawing(int id) {
           this.id = id;
       }

       public static int getPassengersCount() {

           return maxPassengersCount;
       }

       @Override
       public String toString() {
           return "Drawing{" +
                   "id=" + id +
                   '}';
       }

       public static void main(String[] args) {

           for (int i = 1; i < 6; i++) {

               Boeing737.Drawing drawing = new Boeing737.Drawing(i);
               System.out.println(drawing);
           }
       }
   }
}
我們main()直接在嵌套類中聲明該方法(沒有特殊原因——只是為了讓您知道這是可能的),並創建了 5 個Drawing對象。儘管我們沒有外部類的單個對象。如您所見,這沒有造成任何問題 :) 控制台輸出:

Drawing{id=1} 
Drawing{id=2} 
Drawing{id=3} 
Drawing{id=4} 
Drawing{id=5}
我們的課程到此結束!為了以防萬一,我會在 Oracle 文檔中為您提供有關它們的部分的鏈接。如果仍然不清楚,請閱讀。現在是我解決幾個任務的時候了!:)
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION