【OCJP】 第3题---类变量的初始化

最近在一本书上看到一个题目,第一眼看起来没什么特别的,很容易看完,就得出了自己的答案,然而做错了,题目是这样的:


本题中main()方法,就是比较类实例的变量INSTANCE.currentPrice和对象的变量p.currentPrice之间的不同。

class Price{
	//类成员是Price实例
	final static Price INSTANCE = new Price(2.8);
	//再定义一个类变量
	static double initPrice = 20;
	//定义该Price的currentPrice实例变量
	double currentPrice;
	public Price(double discount){
		//根据静态变量计算实例变量
		currentPrice = initPrice - discount;
	}
}
public class Main{
	public static void main(String[] args) {
		//通过Price的INSTANCE访问currentPrice实例变量
		System.out.println(Price.INSTANCE.currentPrice);
		//显式创建Price实例
		Price p = new Price(2.8);
		//通过显式创建的Price实例访问currentPrice实例变量
		System.out.println(p.currentPrice);
	}
}


我最开始以为答案是两个17.2,其实是-2.8 和 17.2 。

看了题目解释才明白,抱着半信半疑的心态,又在eclipse中跑了一下,确实如此。

现在把我的理解给大家分享下。

只说为什么INSTANCE.currentPrice的结果是-2.8。

Price类中有两个类变量(INSTANCE 和 initPrice),系统首先给这两个类变量分配内存空间,此时这两个变量的值分别是 null 和 0.0 ,接着开始初始化,类变量初始化是顺序是按代码的先后顺序执行的,先执行这一句:

final static Price INSTANCE = new Price(2.8);


这句代码要用到Price的构造函数:

public Price(double discount){
		//根据静态变量计算实例变量
		currentPrice = initPrice - discount;
	}

执行构造函数时,initPrice的值还是0,还是0,还是0。重要的事情说三遍。而不是20,这个时候还没轮到下面这句代码:

static double initPrice = 20;

0 - 2.8 = -2.8,好了,currentPrice初始化完毕,按照代码顺序,现在开始对initPrice进行初始化,赋值为20,这时它对currentPrice已没有影响了(不过它对main()方法中p对象会有影响)。到此为止,两个类变量初始化完毕。


快完了,最后放个大招,嘿嘿。

class Main {
	static {
		System.out.println(Main.string + " " + Main.integer);
	}
	final static String string = "static";
	final static Integer integer = 1;

	public static void main(String[] args) {
	}
}

很快答案就算出来了,

来对下答案,

恭喜你,

答错了。

正确答案是:static null

你的答案是:static 1吧,是的一开始我也是这么写的。先来看下下边的代码:

class Main {
	final static String string = "static";
	final static Integer integer = 1;
	static {
		System.out.println(Main.string + " " + Main.integer);
	}

	public static void main(String[] args) {
	}
}

再做答一次,什么,你不敢说答案了,说吧,嗯,对,就是:stack 1。

这是为什么呢。

这里有解释:http://stackoverflow.com/questions/12448465/in-what-order-are-static-blocks-and-static-variables-in-a-class-executed

看不懂,用UC、360浏览器的翻译,还是看不懂。暂时理解为Integer i是个对象。

结合里边的答案,再写一个demo。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值