JavaRush /Java Blog /Random-TW /靜態巢狀類

靜態巢狀類

在 Random-TW 群組發布
你好!我們繼續探討 Java 中巢狀類別的主題。在上一課中,我們討論了非靜態巢狀類,或者也稱為內部類別。 靜態嵌套類別 - 2今天,讓我們轉到另一組,仔細看看靜態嵌套類別。 靜態嵌套類別 - 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 mawWeight;

   public Bicycle(String model, int mawWeight) {
       this.model = model;
       this.mawWeight = mawWeight;
   }

   public void start() {
       System.out.println("Go!");
   }

   public class SteeringWheel {

       public void right() {
           System.out.println("Steering wheel to the right!");
       }

       public void left() {

           System.out.println("Steering wheel to the left!");
       }
   }

}
在那裡我們討論瞭如何在SteeringWheel我們不注意的情況下將對外部類別(自行車)的物件的參考傳遞到內部類別(方向盤)的每個實例中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()maxPassengersCountgetManufactureYear()DrawingmanufactureYearmanufactureYearBoeing737privatestaticmaxPassangersCountstatic
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