A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏天 初级黑马   /  2012-8-23 21:59  /  2203 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏诗瑶 于 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();
        }
}

问题:程序有错吗?错在哪?代码在内存中是如何做的。    如有错,该怎么修改?  

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

9 个回复

倒序浏览
撇开其他的不谈  光是这个
       Demo d = new Demo();
        Demo()
        {
                System.out.println("demo run");
        }
     我认为 也不对, 因为它的构造函数在创建对象后面才定义的。。。。  
请大神 讲解下。。


回复 使用道具 举报
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:09
class Demo
{
        Demo d ;//= new Demo();

虽然是在重复调用,会造成堆栈溢出。
但我认为你的第一种方法没有意义。
第二种方法是对的,但是应该不是回答老师想问的内容。
回复 使用道具 举报
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();这一句就行。

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
夏诗瑶 发表于 2012-8-23 22:25
虽然是在重复调用,会造成堆栈溢出。
但我认为你的第一种方法没有意义。
第二种方法是对的,但是应该不 ...

但是这样的是对的!等毕老师讲了在告诉我一下哈!
回复 使用道具 举报
如果你真的想声明一个建立一个Demo d对象,那么你就在语句前加 static Demo d = new Demo();将其静态化,应该可以解决

回复 使用道具 举报
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异常

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

回复 使用道具 举报
夏天 初级黑马 2012-8-24 13:03:26
9#
本帖最后由 夏诗瑶 于 2012-8-24 13:04 编辑

目前认为7楼可能符号老毕题目的意思,等老毕讲吧~~
回复 使用道具 举报
我会做的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马