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在底层的工作。
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在底层的工作。
static final Price P=new Price(2.7)的时候,initPrice还没有被赋值20,所以默认为0。至于死循环的问题,是LZ多想了。
如果是从哪里看到的,烦请告诉一下出处,我也去拜读下,多谢。这段程序说了两个关键问题,1.初始化顺序。
基本上LS的兄弟都说了,我再补充一点,就是 static final的对象会在cinit中执行完毕,
比如LZ你把 static double initPrice=20 加上 final, 就会得到你想要的结果的 17.3了。2.cinit 和 init
之所以没有无限循环是因为分cinit类构造器和init类实例构造器,这个说起来略复杂,
LZ可以找点cinit和init的文章一看便知。
Price p=new Price(3.3);
System.out.println(p.P.P.P==p.P.P.P.P.P); //返回true
这样就很清楚了