黑马程序员技术交流社区

标题: java 类中的静态变量存放在 方法区中的静态区 [打印本页]

作者: 刘海陆    时间: 2013-6-1 10:47
标题: java 类中的静态变量存放在 方法区中的静态区
本帖最后由 刘海陆 于 2013-6-1 18:46 编辑

java 类中的静态变量存放在 方法区中的静态区, 那么静态方法是不是也存放在静态区呢?

作者: 刘海芳    时间: 2013-6-1 11:08
亲,我们的名字好像哦:lol
说下自己的理解:
我记得《thinking in java》原话:无论创建多少对象,static数据都只只用一份存储区域。static关键字不能应用于局部变量,因此他只能这用于域。如果一个域是基本类型,并且没有给它初始化,那么他会默认为基本类型的标准初始值;如果是一个引用,那么他会默认为初始值null。
  1. //: initialization/StaticInitialization.java
  2. // Specifying initial values in a class definition.
  3. import static net.mindview.util.Print.*;



  4. class Bowl {
  5.   Bowl(int marker) {
  6.     print("Bowl(" + marker + ")");
  7.   }
  8.   void f1(int marker) {
  9.     print("f1(" + marker + ")");
  10.   }
  11. }



  12. class Table {
  13.   static Bowl bowl1 = new Bowl(1);
  14.   Table() {
  15.     print("Table()");
  16.     bowl2.f1(1);
  17.   }
  18.   void f2(int marker) {
  19.     print("f2(" + marker + ")");
  20.   }
  21.   static Bowl bowl2 = new Bowl(2);
  22. }



  23. class Cupboard {
  24.   Bowl bowl3 = new Bowl(3);
  25.   static Bowl bowl4 = new Bowl(4);
  26.   Cupboard() {
  27.     print("Cupboard()");
  28.     bowl4.f1(2);
  29.   }
  30.   void f3(int marker) {
  31.     print("f3(" + marker + ")");
  32.   }
  33.   static Bowl bowl5 = new Bowl(5);
  34. }



  35. public class StaticInitialization {
  36.   public static void main(String[] args) {
  37.     print("Creating new Cupboard() in main");
  38.     new Cupboard();
  39.     print("Creating new Cupboard() in main");
  40.     new Cupboard();
  41.     table.f2(1);
  42.     cupboard.f3(1);
  43.   }
  44.   static Table table = new Table();
  45.   static Cupboard cupboard = new Cupboard();
  46. }

  47. /* Output:
  48. Bowl(1)
  49. Bowl(2)
  50. Table()
  51. f1(1)
  52. Bowl(4)
  53. Bowl(5)
  54. Bowl(3)
  55. Cupboard()
  56. f1(2)
  57. Creating new Cupboard() in main
  58. Bowl(3)
  59. Cupboard()
  60. f1(2)
  61. Creating new Cupboard() in main
  62. Bowl(3)
  63. Cupboard()
  64. f1(2)
  65. f2(1)
  66. f3(1)
  67. */
复制代码
Bowl类使得看到类的创建,而Table类和Cupboard类在他们的类中分别定义了Bowl类的static成员对象。注意在定义静态数据成员之前,Cupboard类先定义了一个Bowl类型的非静态成员bowl3。

   由此可见静态数据只有在必要时才进行初始化。如果不创建Table对象,也不引用Talbe的bowl1和bowl2,那么Talbe的bowl1和bowl2永远都不会被创建。只有在第一个Talbe被创建时或第一次访问其中的Bowl类型的静态成员时,他们才会被初始化。此后静态数据不会在被初始化。

   通过上面的事例可以总结:在创建一个类时,初始化的顺序是先是静态数据,并且仅初始化一次(如果它们尚未因前面对象的创建或某些动作的执行未被初始化),而后是非静态数据(每次在创建时都会初始化),然后是构造函数。

     另外直接用类名调用静态数据和静态方法时,这个类中的所以静态成员都会被初始化(非static成员不会被初始化),前提是他们从未被初始化过。

  从结果中可以观察到这一点。要执行main()(stati方法),必须加载StaticInitialization类,然后是StaticInitialization 类中的sataic成员table 和cupboard 的初始化,这将导致Tabel和Cupboard 类中的静态数据也会被初始化。这样在main()未开始之前,所有对象已经被初始化。然而在main()方法在执行创建Cupboard 类对象时,Cupboard 中的static数据不会再被初始化,因为static数据已经在main()之前已经被第一次初始化。
作者: 刘海陆    时间: 2013-6-1 16:08
静态方法和静态变量都放在静态区吗????
作者: yooc    时间: 2013-6-1 16:38
你可以这样认为,静态方法和静态变量都存在于静态区。甚至非静态方法也存在于静态区,只有当它被实例化后,其实例将在动态区获得一份拷贝。
作者: xiatian    时间: 2013-6-1 16:39
静态方法也是存放在静态区的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2