黑马程序员技术交流社区

标题: 老毕上课出的一个附加题 [打印本页]

作者: 夏天    时间: 2012-8-23 21:59
标题: 老毕上课出的一个附加题
本帖最后由 夏诗瑶 于 2012-8-24 13:12 编辑

已解决

class Demo
{
        Demo d = new Demo();

        Demo()
        {
                System.out.println("demo run");
        }

        public static void main(String[] args)
        {
                new Demo();
        }
}

问题:程序有错吗?错在哪?代码在内存中是如何做的。    如有错,该怎么修改?  
作者: 夏天    时间: 2012-8-23 22:03
撇开其他的不谈  光是这个
       Demo d = new Demo();
        Demo()
        {
                System.out.println("demo run");
        }
     我认为 也不对, 因为它的构造函数在创建对象后面才定义的。。。。  
请大神 讲解下。。



作者: 贾成龙    时间: 2012-8-23 22:09
class Demo
{
        Demo d ;//= new Demo();

        public Demo()
        {
                System.out.println("demo run");
        }

        public static void main(String[] args)
        {
                new Demo();
        }
}

或者:

class Demo
{
        //Demo d = new Demo();

        public Demo()
        {
                System.out.println("demo run");
        }

        public static void main(String[] args)
        {
                new Demo();
        }
}
都可以,因为在创建对象,重复调用本身,创建对象有问题!
作者: 夏天    时间: 2012-8-23 22:25
贾成龙 发表于 2012-8-23 22:09
class Demo
{
        Demo d ;//= new Demo();

虽然是在重复调用,会造成堆栈溢出。
但我认为你的第一种方法没有意义。
第二种方法是对的,但是应该不是回答老师想问的内容。

作者: 黑马张涛    时间: 2012-8-23 22:33
class Demo
{
         Demo d = new Demo();

        Demo()
         {
                 System.out.println("demo run");
         }

        public static void main(String[] args)
         {
                 new Demo();
         }
}
程序执行,从main方法执行,他会new一个Demo对象,而在产生Demo对象时,Demo对象第一句话又会生成Demo对象,所以会陷无入限递归的情况,不断创建新的Demo对象,直到程序提示堆栈溢出!
如果只是想生成一个Demo对象,去除Demo d = new Demo();这一句就行。
作者: 贾成龙    时间: 2012-8-23 23:50
夏诗瑶 发表于 2012-8-23 22:25
虽然是在重复调用,会造成堆栈溢出。
但我认为你的第一种方法没有意义。
第二种方法是对的,但是应该不 ...

但是这样的是对的!等毕老师讲了在告诉我一下哈!
作者: 梁志冰    时间: 2012-8-24 00:32
如果你真的想声明一个建立一个Demo d对象,那么你就在语句前加 static Demo d = new Demo();将其静态化,应该可以解决


作者: 冯培军    时间: 2012-8-24 00:34
9、一个对象实例化过程
Person p = new Person();       
1、当输入 java   Test 时, JVM加载Test类文件并调用Test . Main()方法,
(这就是为什么主函数是静态的)
2、JVM会读取指定的路径下的Person.class文件,并加载进内存,
并会先加载Person的父类(如果有直接的父类的情况下).
3、在堆内存中的开辟空间,分配地址。
4、并在对象空间中,对对象中的属性进行默认初始化。
5、调用对应的构造函数进行初始化。
6、在构造函数中,第一行会先到调用父类中构造函数进行初始化。
7、父类初始化完毕后,在对子类的属性进行显示初始化。(即在写子类时,
将子类的成员属性赋一个值时。)
8、在进行子类构造函数的特定初始化。
9、初始化完毕后,将地址值赋值给引用变量.
像你上面这样的,创建对象一直在初始化对象,直到内存溢出.....出现init异常
作者: 夏天    时间: 2012-8-24 13:03
本帖最后由 夏诗瑶 于 2012-8-24 13:04 编辑

目前认为7楼可能符号老毕题目的意思,等老毕讲吧~~
作者: 刘立川    时间: 2015-12-25 15:33
我会做的




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