Arlen_hu 2017-11-03 09:09 采纳率: 50%
浏览 1797
已采纳

java程序语言设计进阶版习题答案

图片说明

这两个习题有啥错误呀

  • 写回答

3条回答 默认 最新

  • a521314963 2017-11-03 09:19
    关注

    左边的怎么自己new自己啊,这样编译没问题运行起来不行吧
    先问下,问什么不能new自己。
    当然,假如按楼主的写法,当这个A第一次被调用的时候,就出抛异常,超出堆栈、内存溢出之类。
    楼主,你需要理解“声明”和“实例化”的概念。
    A a;
    即是声明,创建了一个A类型的变量a
    new A();
    即是实例化,实实在在地在内存里为A()划分了一块内存空间
    a=new A();即是使a指向new A()。以后只要你不更改a的引用,对a的任何操作都会影响到你分配出来的这块内存空间。
    理解了这个再回到问题
    public class A{}
    这个是对类的一个定义,此时,A只是一个“概念”,在电脑里并没有实体存在,但是java的虚拟机(jvm)已经得知了该类的所有定义,就是说,该类被加载进jvm的类加载器(class loader)了,其他的类有可能访问到该A类。
    此时A本身就是jvm中的一个类,它自己当然是和自己同包,对不对?
    所以A必然可以访问到A
    那么public class A{ A a=new A();}
    这句话,编译期是正确的,不存在错误,所以可以声明也(被jvm认为)可以实例化。
    但是到了运行期,真正的跑起来的时候,它是错误的
    因为这是个迭代的死循环。
    在new A()的时候,又会执行一遍A a= new A();
    然后该new A()又执行一遍A a= new A();
    如此往复,直到堆栈溢出。
    当然 以下写法是正确的
    public class A{
    A a=null;
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)