在JAVA中为什么可以在一个类当中New自己类 例如: public class A{ A a = new A();//为什么可以new自己 }

 我来答
anrainie
推荐于2017-11-24 · TA获得超过1012个赞
知道小有建树答主
回答量:306
采纳率:0%
帮助的人:363万
展开全部
先问下,问什么不能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;
}
嗯,事实上,有些专门的写法,如单例,工厂类,就是需要在某个类里面实例化它本身。这个,楼主等你基础打好了,再研究吧。
更多追问追答
追问
那么假如  我这个类里面有一个方法同个这个方法new  当前类,会导致内存溢出么?
public calss A{
public int doX(){
A a = new A();
}
}
追答
不会的,你应该在脑子里自己模拟下运行顺序。
在doX()这个方法被调用前,new A()是不会运行的,对不对?

当然 你也可以这么写使之溢出:

public class A{
A(){
doX();//因为new A()会调用的构造方法A(),这里会被调用到。
}
public int doX(){
A a = new A();
return 0;//注意,有返回值的方法一定要return。不然就写void吧。
}
}
百度网友8243043
2012-01-06 · TA获得超过247个赞
知道小有建树答主
回答量:240
采纳率:100%
帮助的人:158万
展开全部

一看你就才开始学习,这东西建议你买本这方面的书看看。

1、这牵涉到内存的问题

2、new 就是在内存中创建一个对象

3、在你要用这个对象的时候直接调用他里面飞属性和方法就可以了

package com.demo;

public class Person{

public Person(){

System.out.println("-->"+name);

System.out.println("-->"+age);

System.out.println("-->"+sex);

}

public Person(String name1,int age1,String sex1){

name = name1;

age = age1;

sex = sex1;

}

public String getName(){

return name;

}

public int getAge(){

return age;

}

public String getSex(){

return sex;

}

private String name="Tom";

private int age=23;

private String sex="male";

{//动态的代码块

System.out.println("动态的代码块内容");

System.out.println("==>"+name);

System.out.println("==>"+age);

System.out.println("==>"+sex);

}

}

class TestPerson{

public static void main(String args[]){

//创建具体的对象并且通过构造方法将属性值设置;

//Person p = new Person("Tom",23,"male");

Person p = new Person();

/*System.out.println(p.getName());

System.out.println(p.getAge());

System.out.println(p.getSex());

System.out.println(p);*/

}

}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hello1_hello2
2012-01-06
知道答主
回答量:11
采纳率:0%
帮助的人:4.6万
展开全部
实例化一个对象属性,如果在一个学习团队中存在一带一的辅导,即一个优秀学生带一个差生,优秀学生本身是个Student对象,差生也是个Student对象,要在Student对象中显示他所带的学生时就要新建一个Student对象表示,这时就需要Student类中存在Student b=new Student();的语句了;或者如上说的单例中,将构造方法私有化后,就需要这个语句了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gegecuicui
2012-01-06 · TA获得超过616个赞
知道小有建树答主
回答量:802
采纳率:0%
帮助的人:497万
展开全部
递归调用
追问
递归的过程中会一直调用 A   a  = new  A();这个过程?还是不再调用了?
追答
会一直new。。。   这个不能这样    有this关键字    还有  构造函数   你不能直接这样new自己
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
15494gjy
2012-01-06
知道答主
回答量:2
采纳率:0%
帮助的人:3308
展开全部
他们都说了,递归调用,我就不献丑了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式