黑马程序员技术交流社区

标题: 费解的一个例子 [打印本页]

作者: 蔡少凯    时间: 2013-1-4 23:06
标题: 费解的一个例子
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 PriceTest
{
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);                              //②
}
}
两个结果打印出来的为什么不一样?
作者: 夏振博    时间: 2013-1-5 00:51
因为静态变量初始化时currentPrice是0 ,这时调用INSTANCE的静态常量 就调用了构造器将2.8传入 所以0-2.8=-2.8
Price p = new Price(2.8); 初始化完了 再传参就变为20-2.8了
注意初始化顺序
当你把static变量 initPrice放到INSTANCE前面时 就变为17.2了
因为它先初始化了
static double initPrice = 20;
final static Price INSTANCE = new Price(2.8);
--------------------------------------------------------------
final static Price INSTANCE = new Price(2.8);
static double initPrice = 20;
这是有区别的

作者: sun~~    时间: 2013-1-5 16:24
static double initPrice = 20;
final static Price INSTANCE = new Price(2.8);
--------------------------------------------------------------
final static Price INSTANCE = new Price(2.8);
static double initPrice = 20;
是不一样的建议你在看看final的概念 好好理解一下:
一、final
1、关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
final类不能被继承,没有子类,final类中的方法默认是final的。
final方法不能被子类的方法覆盖,但可以被继承。
final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

2、final类
 final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。

3、final方法
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2