A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蔡少凯 中级黑马   /  2013-1-4 23:06  /  1301 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);                              //②
}
}
两个结果打印出来的为什么不一样?

2 个回复

倒序浏览
因为静态变量初始化时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;
这是有区别的
回复 使用道具 举报
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方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马