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;
}本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥20 win11账户锁定时间设为0无法登录
- ¥45 C#学生成绩管理系统
- ¥15 VB.NET2022如何生成发布成exe文件
- ¥30 matlab appdesigner私有函数嵌套整合
- ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
- ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
- ¥15 关于freesurfer使用freeview可视化的问题
- ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
- ¥15 求SC-LIWC词典!
- ¥20 有关esp8266连接阿里云