黑马程序员技术交流社区

标题: private Single s =new Single();不设定为static的问题 [打印本页]

作者: 高鑫    时间: 2012-5-3 02:50
标题: private Single s =new Single();不设定为static的问题
  1. class Single
  2. {  private int num;
  3.         public void setNum(int num)
  4.         {        this.num=num;
  5.         }
  6.         public int getNum()
  7.         {
  8.                 return num;
  9.         }
  10.          Single(){}
  11.         private  Single s =new Single();  //把static取掉
  12. }
  13. class SingleDemo
  14. {
  15.         public static void main (String[]args)
  16.         {
  17.         Single s1=new Single();
  18.         Single s2=new Single();
  19.         s1.setNum(30);
  20.         System.out.println(s2.getNum());
  21.         }
  22. }
复制代码
去掉标注处的static 后,编译可以通过,但是执行后是连续的at Single.<init>(new.java:11),谁能解释下里面到底是怎么运行的?再问下这里取消static后,这个变量s是不是就存到堆内存中了???
作者: 崔仁军    时间: 2012-5-3 08:40
1.你把single设为是私有的属性    就不能用直接new    那不就报错了吗      如果你加上static 的话是在加载虚拟机的时候就会回执行了   所以能通过
作者: 马超    时间: 2012-5-3 08:46
变量名s应该是在 栈内存当中存放的吧?咋能跑到堆内存当中去呢啊?推内存当中存放的是对象和成员属性啊
作者: 袁培育    时间: 2012-5-5 14:00
不加static时会出现你见到的那种情况,原因是内存溢出,因为你single类中有一个private  Single s =new Single();当类加载时会执行这个代码,于是在堆内存中建立一个single对象,在建立single对象时又执行了这个代码(因为这个代码在single类中,只要建立single对象就会执行),这是你无意之间搞了个递归,程序会不断建立single对象直到内存溢出才停止。加上static后,s就是共享的了,只需建立一次就行了。
作者: 何阳    时间: 2012-5-6 20:26
class Single
{  private int num;
        public void setNum(int num)
        {        this.num=num;
        }
        public int getNum()
        {
                return num;
        }
         Single(){}
        private  Single s =new Single();  //把static取掉
}
class SingleDemo
{
        public static void main (String[]args)
        {
        Single s1=new Single();
        Single s2=new Single();
        s1.setNum(30);
        System.out.println(s2.getNum());
        }
}
//这个问题是内存的溢出
//解释原因
//你在主函数中创建对象,那么S1会调用自己的类中的构造函数初始化此对象,初始化S1自己的成员属性
//而 private  Single s =new Single(); 属性成员对象,那么他也要初始化,所以会在内存的堆中开辟空间
//因为此时的成员属性也是在初始化对象,那么他会继续调用Singel并初始化它,有在内存中开辟空间
//此时类推,一直在创建对象,但是一直没有完成这个初始化动作,他会一直在堆内存中创建,直到系统给JVM
//分配的空间用完,所以会有以上的错误。
//但是你把那个成员属性加了静态,那么它会在内存的方法去,而不是内存的堆中,他是一个共享的数据,只会有一个对象
//类加载时,他已经完成了初始化的动作了.





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