Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

细节17 有始有终——内存中成员变量的运行机制

在类加载或使用类创建对象时,系统会自动为成员变量分配内存空间,然后自动为成员变量指定初始值,如果成员变量无初始值,则使用默认的初始值。

示例:

    public class Book {
      private String bookName;
      private static String author;
    }

本示例创建了类Book,该类有两个成员变量,其中,bookName 是普通的成员变量,author是静态成员变量。

下面的代码在TestBook类的主方法中加载Book类并创建该类的实例。

    public class TestBook {
      public static void main (String[] args) {
          Book book = new Book ();
      }
    }

说明

当程序执行到语句Book book = new Book ();时,如果程序是第一次使用Book类,则系统首先加载Book类,并初始化类成员,其内存分布如图5.13所示,从图中可以看出,类加载时栈内存中并没有Book类的引用,但是在堆内存中隐式地创建了Book的类对象,并为类的静态成员author进行了初始化,这里使用默认值null初始化了Book类的类成员author,但是在加载Book类时,并没有对普通成员变量bookName进行初始化。

图5.13 加载Book类后的内存分布

当程序加载Book类后,执行代码Book book = new Book ();创建Book类的引用book,此时内存分布如图5.14所示。

图5.14 创建Book类的实例book后的内存分布

说明

从图5.14可以看出,当创建了Book类的实例后,系统才为普通成员变量分配内存和指定初始值,这是因为类的普通成员变量是属于类的实例的,而不是属于类对象,但是类的静态成员变量是在加载类时就为其分配了内存并指定了初始值的,所以当创建类的实例后,就不会再为类的静态成员变量重新分配内存了。