在类中创建本来对象的问题,求解释!!!

afgkidy 2008-09-18 09:56:49
class Soup {
private Soup(){}
private static Soup ps1 = new Soup();

public static void main(String[] args) {
Soup sp = new Soup();
}
}

当属性成员ps1 为static 的时候,可以创建他的对象。上面这个正常。

class Soup {
private Soup(){}
private Soup ps1 = new Soup();

public static void main(String[] args) {
Soup sp = new Soup();
}
}

当ps1 为普通成员时,上面这个就会错误。

请问为啥子能在一个类里面创建自己的对象(如ps1)?
谁能给点详细解释,非常感谢!!!
...全文
234 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lihua8062 2008-09-23
  • 打赏
  • 举报
回复
同意1楼,呵呵,知道不要在自己的类里去new就好了:)
afgkidy 2008-09-23
  • 打赏
  • 举报
回复
都没回答到实质,郁闷~
nyzlhao 2008-09-23
  • 打赏
  • 举报
回复
递归创建,学习了!!!
no9988 2008-09-23
  • 打赏
  • 举报
回复
Static 只在有开始加载的时候执行一次 `
` ``` 只new了一次

但下面那个 变成了普通成员
但主函数new了一次后 产生了一个实例, 就要加载一次普通成员
当加载普通成员的时候 要 执行一次Soup ps1 = new Soup(); 又new 一次 又要加在加载一次哦普通成员

如此 就想当于死循环了 `

``
递归创建````
hwxiang 2008-09-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 afgkidy 的帖子:]
class Soup {
private Soup(){}
private static Soup ps1 = new Soup(); //对象 已经创建 并且是在 构造函数之前已经创建 . 而在 下面的 sp 对象是能创建出来的.也成只能创建一个对象.(单例模式)

public static void main(String[] args) {
Soup sp = new Soup();
}
}

当属性成员ps1 为static 的时候,可以创建他的对象。上面这个正常。

class Soup {
private Soup(){}
private Soup ps1 = new Soup();

public static void main(String[] args) {
Soup sp = new Soup(); // 创建对象,开始你的构造函数是private 的外面 //不 能 new 对象
}
}

当ps1 为…
[/Quote]


这个 问题 要说 类运行顺序了。一个对象在创建过程中,先是加载static 代码、方法、变量。。
sinsuo 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangdu328 的回复:]
当属性成员ps1 为static 的时候,为静态属性,在内存堆区只有一个Soup的对象,
当ps1 为普通成员时,在内存堆区有多个Soup的对象,引发内存堆区溢出错误!
"Exception in thread "main" java.lang.StackOverflowError!"
[/Quote]
赞同这种说法
afgkidy 2008-09-22
  • 打赏
  • 举报
回复
1
afgkidy 2008-09-22
  • 打赏
  • 举报
回复
static Soup ps1 = new Soup();
虽然ps1 是一个引用,但是第一次加载Soup.class的时候,ps1 这个引用总应该指向一个“实在的Soup对象”吧?我的意思就是这个“实在的Soup对象”如何确定大小?
第一次加载Soup.class的时候是怎么确定ps1 这个引用指向的确切Soup对象的?因为Soup.class只加载一次,所以以后就不会为ps1 引用重新赋与新的Soup对象了。
afgkidy 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fosjos 的回复:]
简单的说:
static Soup ps1 = new Soup();就不在new对象的时候执行

而Soup ps1 = new Soup();每次new对象都会执行,然后就是不停的new对象,不停的执行......
[/Quote]


对于"static Soup ps1 = new Soup();就不在new对象的时候执行":
你是想说static的对象,只在那个.class文件第一次加载的时候才执行,对吧??????
bloodtears 2008-09-19
  • 打赏
  • 举报
回复
学习了~~~
fosjos 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 afgkidy 的回复:]
private static Soup ps1 = new Soup();

可是此时new对象,它怎么知道要new多大的空间呢?因为此时Soup 还在定义中。
[/Quote]
当然是class先加载,然后才执行new
Soup ps1只是一个引用,仅仅是存放地址,空间大小固定
dreamhunter_lan 2008-09-19
  • 打赏
  • 举报
回复
只记得在调constructor之前所有的成员变量都必须准备好,所以我连当属性成员ps1 为static 的时候的情况都不理解,请知道的说的详细点吧
学习!
fosjos 2008-09-19
  • 打赏
  • 举报
回复
编译的时候不需要知道new Soup()的实际大小
执行的时候分配空间
对象属性只需要分配一个存放引用的空间

实在想不通,就看作private Object ps1;
jishu_vip 2008-09-19
  • 打赏
  • 举报
回复
Classloader完
afgkidy 2008-09-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fosjos 的回复:]
引用 7 楼 afgkidy 的回复:

  private static Soup ps1 = new Soup();

可是此时new对象,它怎么知道要new多大的空间呢?因为此时Soup 还在定义中。

当然是class先加载,然后才执行new
Soup ps1只是一个引用,仅仅是存放地址,空间大小固定
[/Quote]

你说“Soup ps1只是一个引用,仅仅是存放地址,空间大小固定”,这个我理解。
但是new Soup()这个对象应该是要占空间的,怎么知道他的大小呢?
afgkidy 2008-09-18
  • 打赏
  • 举报
回复
private static Soup ps1 = new Soup();

可是此时new对象,它怎么知道要new多大的空间呢?因为此时Soup 还在定义中。
「已注销」 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 pgyzyzj 的回复:]
"请问为啥子能在一个类里面创建自己的对象",这个问题我也想知道他的答案!二楼的说"递归创建了"是什么意思?

学习!
[/Quote]


就是对象创建时要初始化自己的成员对象,

成员对象再创建这个类型的对象,再初始化,再创建…………

就是递归了
「已注销」 2008-09-18
  • 打赏
  • 举报
回复


静态的对象只创建一次,所以不存在问题

而非静态对象为成员对象,是在对象创建时就再次创建一个同一类型的对象,

递归创建没完没了,也就出错了

fosjos 2008-09-18
  • 打赏
  • 举报
回复
简单的说:
static Soup ps1 = new Soup();就不在new对象的时候执行

而Soup ps1 = new Soup();每次new对象都会执行,然后就是不停的new对象,不停的执行......
pgyzyzj 2008-09-18
  • 打赏
  • 举报
回复
"请问为啥子能在一个类里面创建自己的对象",这个问题我也想知道他的答案!二楼的说"递归创建了"是什么意思?

学习!
加载更多回复(2)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧