黑马程序员技术交流社区

标题: 静态初始化的顺序,看懂了你就明白了(小程序) [打印本页]

作者: 赵崇友    时间: 2013-4-9 16:28
标题: 静态初始化的顺序,看懂了你就明白了(小程序)
本帖最后由 赵崇友 于 2013-4-9 22:36 编辑
  1. class Bowl //Bowl类
  2. {
  3. Bowl(int marker)//带参数构造器
  4. {
  5. System.out.println("Bowl("+marker+")");
  6. }
  7. void f1(int marker)//成员方法
  8. {
  9. System.out.println("f1("+marker+")");
  10. }
  11. }
  12. //---------------------------------------
  13. class Table //Table类
  14. {
  15. static Bowl bowl1=new Bowl(1);//在table类中创建一个Bowl对象引用bowl1
  16. Table() //无参数构造器
  17. {
  18. System.out.println("Table()");
  19. bowl2.f1(1); //对象引用Bwol中的f1()方法
  20. }
  21. void f2(int marker)//成员方法
  22. {
  23. System.out.println("f2("+marker+")");
  24. }
  25. static Bowl bowl2=new Bowl(2);//创建Bowl对象引用bowl2
  26. }
  27. //--------------------------------
  28. class Cupboard //Cupboard类
  29. {
  30. Bowl bowl3=new Bowl(3);//创建一个Bowl对象引用bowl3
  31. static Bowl bowl4=new Bowl(4);//创建一个Bowl对象引用bowl4
  32. Cupboard() //构造器
  33. {
  34. System.out.println("Cupboard()");
  35. bowl4.f1(2);//对象调用f1()方法
  36. }
  37. void f3(int marker)//成员方法
  38. {
  39. System.out.println("f3("+marker+")");
  40. }
  41. static Bowl bowl5=new Bowl(5);//);//创建一个Bowl对象引用bowl5
  42. }
  43. //----------------------------------------
  44. public class Practice09
  45. {
  46. public static void main(String[] args)//主方法
  47. {
  48. System.out.println("Creating new Cupboard() in main");//输出语句
  49. new Cupboard();//new一个Cupboard对象
  50. System.out.println("Creating new Cupboard() in main");//输出语句
  51. new Cupboard();
  52. table.f2(1);//对象调用Table中f2()方法
  53. cupboard.f3(1);//对象调用Cupboard中的f3()方法
  54. }
  55. static Table table=new Table();//);//创建一个Table对象引用table
  56. static Cupboard cupboard=new Cupboard();//创建一个Cupboard对象引用cupboard
  57. }
  58. //以下是运行的结果:
  59. /*output:
  60. Bowl(1)
  61. Bowl(2)
  62. Table()
  63. f1(1)
  64. Bowl(4)
  65. Bowl(5)
  66. Bowl(3)
  67. Cupboard()
  68. f1(2)
  69. Creating new Cupboard() in m
  70. Bowl(3)
  71. Cupboard()
  72. f1(2)
  73. Creating new Cupboard() in m
  74. Bowl(3)
  75. Cupboard()
  76. f1(2)
  77. f2(1)
  78. f3(1)
  79. */
复制代码

作者: 曹德君    时间: 2013-4-9 17:03
本帖最后由 曹德君 于 2013-4-9 17:25 编辑

什么注释都没有。。。。。。。。。写程序记得写注释。郁闷半天没懂。求高手解释。
作者: 陈宇鹏    时间: 2013-4-9 17:18
我去  看的我眼花缭乱。。。。。
作者: 赵崇友    时间: 2013-4-9 18:24
曹德君 发表于 2013-4-9 17:03
什么注释都没有。。。。。。。。。写程序记得写注释。郁闷半天没懂。求高手解释。 ...

这还要注释啊!好吧……
作者: 黄玉昆    时间: 2013-4-9 20:22
赵崇友 发表于 2013-4-9 18:24
这还要注释啊!好吧……

建议你将代码插入到代码框中,谢谢
如果,不知道怎么操作,请看帖子:
http://bbs.itheima.com/thread-42978-1-1.html

作者: 胡滨    时间: 2013-4-9 21:14
本帖最后由 胡滨 于 2013-4-9 21:16 编辑
  1. <div class="blockcode"><blockquote>
  2. <blockquote>
复制代码
  1. class Bowl                                                                                         // Bowl类
  2. {
  3.         Bowl(int marker)                                                                 // 带参数构造器
  4.         {
  5.                 System.out.println("Bowl(" + marker + ")");
  6.         }

  7.         void f1(int marker)                                                                // 成员方法
  8.         {
  9.                 System.out.println("f1(" + marker + ")");
  10.         }
  11. }

  12. // ---------------------------------------

  13. class Table                                                                                 // Table类
  14. {
  15.         static Bowl bowl1 = new Bowl(1);                            // 在table类中创建一个Bowl对象引用bowl1

  16.         Table()                                                                                    // 无参数构造器
  17.         {
  18.                 System.out.println("Table()");
  19.                 bowl2.f1(1);                                                                 // 对象引用Bowl中的f1()方法
  20.         }

  21.         void f2(int marker)                                                         // 成员方法
  22.         {
  23.                 System.out.println("f2(" + marker + ")");
  24.         }

  25.         static Bowl bowl2 = new Bowl(2);                                 // 创建Bowl对象引用bowl2
  26. }

  27. // --------------------------------

  28. class Cupboard                                                                                 // Cupboard类
  29. {
  30.         Bowl bowl3 = new Bowl(3);                                                 // 创建一个Bowl对象引用bowl3
  31.         static Bowl bowl4 = new Bowl(4);                                 // 创建一个Bowl对象引用bowl4

  32.         Cupboard()                                                                                 // 构造器
  33.         {
  34.                 System.out.println("Cupboard()");
  35.                 bowl4.f1(2);                                                                 // 对象调用f1()方法
  36.         }

  37.         void f3(int marker)                                                         // 成员方法
  38.         {
  39.                 System.out.println("f3(" + marker + ")");
  40.         }

  41.         static Bowl bowl5 = new Bowl(5);                                 // 创建一个Bowl对象引用bowl5
  42. }

  43. // ----------------------------------------
  44. public class Practice09 {
  45.         public static void main(String[] args)                                           // 主方法
  46.         {
  47.                 System.out.println("Creating new Cupboard() in main");// 输出语句
  48.                 new Cupboard();                                                                           // new一个Cupboard对象
  49.                 System.out.println("Creating new Cupboard() in main");// 输出语句
  50.                 new Cupboard();
  51.                 table.f2(1);                                                                                   // 对象调用Table中f2()方法
  52.                 cupboard.f3(1);                                                                           // 对象调用Cupboard中的f3()方法
  53.         }

  54.         static Table table = new Table();                                                  // 创建一个Table对象引用table
  55.         static Cupboard cupboard = new Cupboard();                                  // 创建一个Cupboard对象引用cupboard
  56. }
复制代码

作者: 王军行    时间: 2013-4-9 21:25
我看是想问静态成员加载的问题吧,我看的晕晕的。。。
看你的结果我来说一下啊,
首先,主函数类加载,这个没啥疑问吧?
类加载要先加载静态成员,然后再加载去运行主函数的,按照你的代码顺序1.实例化table:static Table table=new Table();,加载Table类同样先加载静态,
static Bowl bowl1=new Bowl(1);static Bowl bowl2=new Bowl(2);然后构造函数,这样就先出现了
Bowl(1)
Bowl(2)
Table()
f1(1)
同样的static Cupboard cupboard=new Cupboard();/
的结果是
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
然后轮到主函数运行:注意静态成员只随着类的加载而加载一次
于是new Cupboard();的结果就是
Bowl(3)
Cupboard()
f1(2)
西边的依旧也同样。
整个过程没发现什么问题啊??
作者: 赵崇友    时间: 2013-4-9 22:35
黄玉昆 发表于 2013-4-9 20:22
建议你将代码插入到代码框中,谢谢
如果,不知道怎么操作,请看帖子:
http://bbs.itheima.com/thread-42 ...

嗯嗯,知道了!!之前没怎么发过贴




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