class Soup {
  private Soup(){}
  private static Soup ps1 = new Soup();  public static void main(String[] args) {
    Soup sp = new Soup();
  }
}当属性成员ps1 为static 的时候,可以创建他的对象。上面这个正常。class Soup {
  private Soup(){}
  private Soup ps1 = new Soup();  public static void main(String[] args) {
    Soup sp = new Soup();
  }
}当ps1 为普通成员时,上面这个就会错误。请问为啥子能在一个类里面创建自己的对象(如ps1)?
谁能给点详细解释,非常感谢!!!

解决方案 »

  1.   

    当属性成员ps1 为static 的时候,为静态属性,在内存堆区只有一个Soup的对象,
    当ps1 为普通成员时,在内存堆区有多个Soup的对象,引发内存堆区溢出错误!
    "Exception in thread "main" java.lang.StackOverflowError!"
      

  2.   

    简单的说:
    static Soup ps1 = new Soup();就不在new对象的时候执行而Soup ps1 = new Soup();每次new对象都会执行,然后就是不停的new对象,不停的执行......
      

  3.   

      private static Soup ps1 = new Soup(); 可是此时new对象,它怎么知道要new多大的空间呢?因为此时Soup 还在定义中。
      

  4.   

    当然是class先加载,然后才执行new
    Soup ps1只是一个引用,仅仅是存放地址,空间大小固定
      

  5.   

    只记得在调constructor之前所有的成员变量都必须准备好,所以我连当属性成员ps1 为static 的时候的情况都不理解,请知道的说的详细点吧
    学习!
      

  6.   


    你说“Soup ps1只是一个引用,仅仅是存放地址,空间大小固定”,这个我理解。
    但是new Soup()这个对象应该是要占空间的,怎么知道他的大小呢?
      

  7.   

    编译的时候不需要知道new Soup()的实际大小
    执行的时候分配空间
    对象属性只需要分配一个存放引用的空间实在想不通,就看作private Object ps1;
      

  8.   

    对于"static Soup ps1 = new Soup();就不在new对象的时候执行":
    你是想说static的对象,只在那个.class文件第一次加载的时候才执行,对吧??????
      

  9.   

    static Soup ps1 = new Soup();
    虽然ps1 是一个引用,但是第一次加载Soup.class的时候,ps1 这个引用总应该指向一个“实在的Soup对象”吧?我的意思就是这个“实在的Soup对象”如何确定大小?
    第一次加载Soup.class的时候是怎么确定ps1 这个引用指向的确切Soup对象的?因为Soup.class只加载一次,所以以后就不会为ps1 引用重新赋与新的Soup对象了。
      

  10.   

    同意1楼,呵呵,知道不要在自己的类里去new就好了:)
      

  11.   

     这个 问题 要说 类运行顺序了。一个对象在创建过程中,先是加载static 代码、方法、变量。。
      

  12.   

    Static  只在有开始加载的时候执行一次 `
    ` ``` 只new了一次但下面那个 变成了普通成员
    但主函数new了一次后 产生了一个实例, 就要加载一次普通成员
     当加载普通成员的时候  要 执行一次Soup ps1 = new Soup();  又new 一次 又要加在加载一次哦普通成员如此  就想当于死循环了 ```
     递归创建````