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在底层的工作。

解决方案 »

  1.   

    首先要弄清java对象的初始化过程。先是static变量,然后是static块,然后是普通变量,然后是构造器。
    static final Price P=new Price(2.7)的时候,initPrice还没有被赋值20,所以默认为0。至于死循环的问题,是LZ多想了。
      

  2.   

    LZ这段程序真的是一段非常好的JAVA例子,LZ是自己想出来的还是从那里看到的?
    如果是从哪里看到的,烦请告诉一下出处,我也去拜读下,多谢。这段程序说了两个关键问题,1.初始化顺序。
    基本上LS的兄弟都说了,我再补充一点,就是 static final的对象会在cinit中执行完毕,
    比如LZ你把 static double initPrice=20 加上 final, 就会得到你想要的结果的 17.3了。2.cinit 和 init
    之所以没有无限循环是因为分cinit类构造器和init类实例构造器,这个说起来略复杂,
    LZ可以找点cinit和init的文章一看便知。
      

  3.   

    static变量是属于类的,不属于哪一个特定的对像。 只初始化一次。去掉static修饰,就能看见死循环了。
      

  4.   

    这个问题也有一定的启发性:http://hllvm.group.iteye.com/group/topic/34372#
      

  5.   

    书名叫<<突破程序员基本功的16课>>,对,加了final就是17.3.我想这和你说的cinit和init方法有关.
      

  6.   

    没new一次Person对象,就会恩,对,是这个原因,谢谢!
    Price p=new Price(3.3);
    System.out.println(p.P.P.P==p.P.P.P.P.P); //返回true
    这样就很清楚了