JavaRush /Java 博客 /Random-ZH /静态嵌套类

静态嵌套类

已在 Random-ZH 群组中发布
你好!我们继续探讨 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