您的位置:程序门 -> java -> j2se / 基础类



请问:java编程思想第三版第111页的程序中的初始化问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


请问:java编程思想第三版第111页的程序中的初始化问题[已结贴,结贴人:zhu_apollo]
发表于:2007-10-15 15:32:33 楼主
这个程序如下所示:

class   bowl   {
    bowl(int   marker)   {
        system.out.println("bowl("   +   marker   +   ")");
    }
    void   f(int   marker)   {
        system.out.println("f("   +   marker   +   ")");
    }
}

class   table   {
    static   bowl   b1   =   new   bowl(1);
    table()   {
        system.out.println("table()");
        b2.f(1);
    }
    void   f2(int   marker)   {
        system.out.println("f2("   +   marker   +   ")");
    }
    static   bowl   b2   =   new   bowl(2);
}

class   cupboard   {
    bowl   b3   =   new   bowl(3);
    static   bowl   b4   =   new   bowl(4);
    cupboard()   {
        system.out.println("cupboard()");
        b4.f(2);
    }
    void   f3(int   marker)   {
        system.out.println("f3("   +   marker   +   ")");
    }
    static   bowl   b5   =   new   bowl(5);
}

public   class   staticinitialization   {
   
    public   static   void   main(string[]   args)   {
        system.out.println("creating   new   cupboard()   in   main");
        new   cupboard();
        system.out.println("creating   new   cupboard()   in   main");
        new   cupboard();
        t2.f2(1);
        t3.f3(1);
     
    }
    static   table   t2   =   new   table();
    static   cupboard   t3   =   new   cupboard();
}  


输出结果是:

bowl(1)
bowl(2)
table()
f(1)
bowl(4)
bowl(5)
bowl(3)
cupboard()
f(2)
creating   new   cupboard()   in   main
bowl(3)
cupboard()
f(2)
creating   new   cupboard()   in   main
bowl(3)
cupboard()
f(2)
f2(1)
f3(1)


我对着这个结果还有疑惑,要问大家,关于“静态初始化”,它的初始化顺序到底是什么???

对于这个程序而言,从输出结果看,是先从static   table   t2   =   new   table();   这一行代码开始的,这是为什么呢???

为什么不从其它地方开始???


发表于:2007-10-15 15:40:361楼 得分:0
加载任何类都是“先静态后动态”的,staticinitialization也是一个类也要加载,所以要初始化后才到main方法中去的
发表于:2007-10-15 15:55:182楼 得分:0
对于非继承类,是先从public类的static成员开始初始化起的,且static成员只初始化一次
发表于:2007-10-15 16:10:203楼 得分:0
楼上的说的对

可是如果public类中没有静态成员的话

而其他的3个类中有静态成员

那么此时会怎么样的

发表于:2007-10-15 16:58:264楼 得分:0
其它类只有在用new   constructor()创建对象时,才按“先static,再是非static,最后是构造器“的顺序来进行初始化
发表于:2007-10-15 17:11:225楼 得分:0
请看下面的程序:

class   cup   {
cup(){}
    cup(int   marker)   {
        system.out.println("cup("   +   marker   +   ")");
    }
    void   f(int   marker)   {
        system.out.println("f("   +   marker   +   ")");
    }
}

class   cups   {
    static   cup   c1;
    static   cup   c2;
    static   {
        c1   =   new   cup(1);
        c2   =   new   cup(2);
    }
    cups()   {
        system.out.println("cups()");
    }
}

public   class   explicitstatic   {
      public   static   void   main(string[]   args)   {
        system.out.println("inside   main()");
                         
       
    }
 
    cup   x   =   new   cup(13);
    static   cups   y   =   new   cups();    
}  


输出结果是:

cup(1)
cup(2)
cups()
inside   main()


我的问题是:

    既然书上说“静态”对象的初始化顺序先于“非静态”对象的初始化,

    那么根据这个推理,cup   x   =   new   cup(13)这一行应该在static   cups   y   =   new   cups()     初始化后得到初始化,调用  

    cup类的构造方法,

输出结果应该是:

cup(1)
cup(2)
cups()
inside   main()
cup(13)

但是:我编译后,为什么不出现这个结果呢???也就说为什么cup   x   =   new   cup(13)这一行没有得到初始化???


苦思不得其解,还希望有人能够帮助我,谢谢了。

发表于:2007-10-15 17:24:306楼 得分:0
explicitstatic类没有被实例化。
发表于:2007-10-15 17:30:577楼 得分:0


explicitstatic类没有被实例化,这个有什么意义,楼上的可否说明白点。
发表于:2007-10-15 18:20:408楼 得分:5
没有用new   explicitstatic()来创建该类的对象,
“对于非继承类,是先从public类的static成员开始初始化起的,且static成员只初始化一次”
cup   x   =   new   cup(13);     x不是static的,只有在创建对象时才会先于构造器被加载。


发表于:2007-10-15 22:36:459楼 得分:0
楼上的johnsoncr

你的意思就是说:对于非继承类,是先从public类的static成员开始初始化起的,且static成员只初始化一次,然后对于

cup   x   =   new   cup(13);       x不是static,那么必须先创建一个包含这个类的实例,那么x就可以得到初始化,是这样理解

的吗?


快速检索

最新资讯
热门点击