在一个类里面创建一个自身对象,不会无限循环吗?

tingwin 2013-02-18 02:04:33
class Price{
static final Price P=new Price(2.7);
static double initPrice=20;
double currentPrice;
public Price(double discout){
currentPrice=initPrice-discout;
}
}
public class PriceTest {
public static void main(String[] args) {
System.out.println(Price.P.currentPrice); //输出-2.7

}

}

例如这样,这样一来,P实例不是无限循环创建了吗?虽然我知道肯定不会无限循环,但是原理在哪里?虽然这样的写法很怪异,但是有助于理解java在底层的工作。
...全文
613 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
silenceburn 2013-02-18
  • 打赏
  • 举报
回复
引用 6 楼 tingwin 的回复:
引用 3 楼 silenceburn 的回复:LZ这段程序真的是一段非常好的JAVA例子,LZ是自己想出来的还是从那里看到的? 如果是从哪里看到的,烦请告诉一下出处,我也去拜读下,多谢。 这段程序说了两个关键问题, 1.初始化顺序。 基本上LS的兄弟都说了,我再补充一点,就是 static final的对象会在cinit中执行完毕, 比如LZ你把 sta……
多谢告知,原来是李刚的书啊。
fumiyaki 2013-02-18
  • 打赏
  • 举报
回复
恩,同感不解。。。。
tingwin 2013-02-18
  • 打赏
  • 举报
回复
引用 4 楼 gukuitian 的回复:
static变量是属于类的,不属于哪一个特定的对像。 只初始化一次。 去掉static修饰,就能看见死循环了。
没new一次Person对象,就会
引用 4 楼 gukuitian 的回复:
static变量是属于类的,不属于哪一个特定的对像。 只初始化一次。 去掉static修饰,就能看见死循环了。
恩,对,是这个原因,谢谢! Price p=new Price(3.3); System.out.println(p.P.P.P==p.P.P.P.P.P); //返回true 这样就很清楚了
tingwin 2013-02-18
  • 打赏
  • 举报
回复
引用 3 楼 silenceburn 的回复:
LZ这段程序真的是一段非常好的JAVA例子,LZ是自己想出来的还是从那里看到的? 如果是从哪里看到的,烦请告诉一下出处,我也去拜读下,多谢。 这段程序说了两个关键问题, 1.初始化顺序。 基本上LS的兄弟都说了,我再补充一点,就是 static final的对象会在cinit中执行完毕, 比如LZ你把 static double initPrice=20……
书名叫<<突破程序员基本功的16课>>,对,加了final就是17.3.我想这和你说的cinit和init方法有关.
龙四 2013-02-18
  • 打赏
  • 举报
回复
这个问题也有一定的启发性:http://hllvm.group.iteye.com/group/topic/34372#
gukuitian 2013-02-18
  • 打赏
  • 举报
回复 1
static变量是属于类的,不属于哪一个特定的对像。 只初始化一次。 去掉static修饰,就能看见死循环了。
silenceburn 2013-02-18
  • 打赏
  • 举报
回复
LZ这段程序真的是一段非常好的JAVA例子,LZ是自己想出来的还是从那里看到的? 如果是从哪里看到的,烦请告诉一下出处,我也去拜读下,多谢。 这段程序说了两个关键问题, 1.初始化顺序。 基本上LS的兄弟都说了,我再补充一点,就是 static final的对象会在cinit中执行完毕, 比如LZ你把 static double initPrice=20 加上 final, 就会得到你想要的结果的 17.3了。 2.cinit 和 init 之所以没有无限循环是因为分cinit类构造器和init类实例构造器,这个说起来略复杂, LZ可以找点cinit和init的文章一看便知。
abc41106 2013-02-18
  • 打赏
  • 举报
回复
楼上正解 建议楼主加断点单步调试看一下,有助于理解。
burningbloodgg 2013-02-18
  • 打赏
  • 举报
回复
首先要弄清java对象的初始化过程。先是static变量,然后是static块,然后是普通变量,然后是构造器。 static final Price P=new Price(2.7)的时候,initPrice还没有被赋值20,所以默认为0。至于死循环的问题,是LZ多想了。

62,620

社区成员

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

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