请教各位,张孝祥的那本教材中有如下源程序:
 class A
  { string name;
    public A(string x) 
      {name=x;}    public void func1()
       { system.out.println("func1 of" +name+"is calling");}    public void  func2()
       {  A  a2 =new  A("a2");
          a2.func1(); }
   }
请问:
为什么类的定义还没结束 但在public void func2()却可以创建对象 a2呢?
谢谢!!

解决方案 »

  1.   

    类加载的时候并没有给非static成员(方法和数据成员)
    分配资源,即你的a2对象在加载时候并没有创建
    只有你创建一个对象,用这个对象
    调用这个方法(你的:func2)时a2对象才会创建
      

  2.   

    class A
    {
    int num;
    static A a1 = new A();

    static
    {
    try
    {
    System.out.print("please inout a num(0~9):");
    a1.num = System.in.read() - '0';
    }
    catch(Exception e)
    {
    System.exit(0);
    }
    a1.func1(a1.num);
    } public void func1(int n)
    {
    for(int i = 1; i <= n; i++)
    {
    for(int j = 1; j <= i; j++)
    {
    System.out.print(i + "*" + j + "=" + (i*j < 10 ? " " : "") + i*j + " ");
    }
    System.out.print("\n");
    }
    }
    }
    //这段代码更有意思呢,不用main就做完了我要做的事
      

  3.   

    static{}是不用被调用就自己执行的
      

  4.   

    三楼,我运行了一下,的确能运行
    但是运行完后仍然报出了没有main的异常
    Exception in thread "main" java.lang.NoSuchMethodError: main
      

  5.   

    楼主,你是说 fun2 中为什么可以创建 A 的对象吧?java 中是可以这样写的,这与 C/C++ 要求提前定义不一样。
      

  6.   

    一楼的看了
    不过,static的方法中可以new本类的对象,还是不太明白啊
      

  7.   

    回复人:chinham() ( ) 信誉:100 2006-9-25 9:51:29 得分:0
    ?一楼的看了,不过,static的方法中可以new本类的对象,还是不太明白啊
    回复人:chinham() ( ) 信誉:100 2006-9-25 10:13:36 得分:0
    ?类比递归.
    ---------------------------------------------------
    在C++中,数据成员和对象不能在类定义时初始化
    但是在java中可以.不会引起C++的无限递归
    其时也没什么不好理解的,就想像java边解释边执行
    先加载类,但是没有给该类成员分配任何资源
    加载完类再给静态成员初始化(即给静态成员分配资源)时直接就在堆上去构造这个对象
    但此时的对象数据成员也没有分配资源(因为我们没给它初始化,此时在static块中使用a.num会出错)
    然后就是给对象数据成员初始化,使用一个初始化一个(即我们a1.num = System.in.read() - '0';也在同时给a1.num初始化)