定义Person类,Person类具有姓名、年龄、国籍属性及自我介绍的行为,同时包含默认构造函数及带参数的构造函数用于对姓名和年龄进行初始化。在定义Person类时,默认国籍为“中国”。Person类的定义如下:
再在主类PersonDemo类中用Person类实例化两个对象,代码如下:
对PersonDemo类中p1,p2对象进行内存分析:
(1)要执行主方法,首先把主类PersonDemo.class加载入数据共享区,然后再调用main方法,PersonDemo类中的main方法进栈。
(2)在执行Person p1 = new Person("李清", 20); 时创建p1对象,先将Person.class 加载进数据共享区,在堆内存为Person实体开辟空间,再对实例变量的姓名和年龄及国籍进行初始化,最后将堆内存地址传给变量p1,使栈和堆建立关联。
(3)在执行Person p2 = new Person("王诚", 18); 时创建p2对象,其内存创建过程与p1对象是一样的。
思考:如果建立多个Person对象并且每个对象维护的国籍的值都是“中国”,则会浪费内存空间,为了优化内存,应该怎么办呢?
解决办法是让所有Person对象都共享一个country,把country放入共享区。在Java语法中如果在成员变量前加上static,则对应的成员变量被置于数据共享区被所有对象共享,因此要解决上述问题可以在定义country成员变量时,在其前加上static关键字,这样就不需要每个对象都维护一个country内存空间。
静态成员变量:在类中,用static声明的成员变量为静态成员变量,也称为类变量。类变量的生命周期和类相同,在整个应用程序执行期间都有效。类变量是为了实现对象之间重复属性的数据共享 。
静态成员变量和非静态成员变量的区别是:
(1)静态成员变量被所有的对象所共享,非静态成员变量被每个对象所拥有。(www.daowen.com)
(2)静态成员变量在内存中只有一个,非静态成员变量存于各个对象中,每个对象中的非静态成员变量的值互不影响。
(3)静态成员变量可以通过类名或对象进行访问,非静态成员变量只能通过对象进行访问。
Person类中的country成员若定义成静态成员,对country成员的引用既可以用类名访问,也可以用对象访问。
如:System.out.println(Person.country); 或System.out.println(p1.country);
(4)当且仅当类初次加载时静态成员变量会被初始化,非静态成员变量在创建对象的时候被初始化。
注意:static成员变量在类中初始化顺序按照定义的顺序进行初始化。如:
则在加载类时,对共享区中的country先初始化,再对count进行初始化。
【例4.13】
Example4_13.java
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。