黑马程序员技术交流社区

标题: java基本功之初始化的过程 [打印本页]

作者: 马胜平    时间: 2012-3-14 18:07
标题: java基本功之初始化的过程
说出下面程序输出什么结果为什么
  1. class Price{
  2.         final static Price INSTANCE=new Price(2.8);
  3.         static double initPrice=20;
  4.         double currentPrice;
  5.         public Price(double discount){
  6.                 currentPrice=initPrice-discount;
  7.         }
  8. }
  9. public class PriceTest {
  10.         public static void main(String[]args){
  11.                 System.out.println(Price.INSTANCE.currentPrice);
  12.                 Price p=new Price(2.8);
  13.                 System.out.println(p.currentPrice);
  14.                
  15.         }
  16. }
复制代码

作者: 段浩亮    时间: 2012-3-14 18:45
本帖最后由 段浩亮 于 2012-3-16 09:29 编辑

我运行过了打印结果是
-2.8
17.2
你的Price类中的构造函数定义错了  前边没有修饰符,现在Price类中只有一个空参数的构造函数,所以打印结果不是你想要的

sorry 我的回答是错误的,很惭愧{:soso_e110:}
作者: 田啸    时间: 2012-3-14 19:03
本帖最后由 田啸 于 2012-3-14 19:12 编辑

首先看第一个输出语句:
System.out.println(Price.INSTANCE.currentPrice);
这里打印的是 Price 类的静态实例INSTANCE里的currentPrice 属性

  这时候final static Price INSTANCE=new Price(2.8); 因为是在类内部直接new的对象,里会通过构造函数去直接初始化静态实例INSTANCE, (不会像第二种输出里正常地加载类里的变量)而这时候没有执行到下面的
static double initPrice=20;(或者说是没有加载到这个变量)
  因此此时构造函数中的 initPrice初始值默认为零 ,也就得到了结果: currentPrice= 0 - 2.8 = -2.8

第二个输出语句就是正常的输出了,再此不多描述.

改了下代码,这样看起来清楚一点:

class Price{
            final static Price INSTANCE=new Price(2.8);
        static double initPrice=20;
      
        double currentPrice;
        Price(double discount){
                System.out.println(initPrice);
                currentPrice=initPrice-discount;
        }
}
public class PriceTest {
        public static void main(String[]args){
                System.out.println(Price.INSTANCE.currentPrice);
              
                Price p=new Price(2.8);
                System.out.println(p.currentPrice);
               
        }
}


输出结果:
0.0
-2.8
20.0
17.2
作者: 马胜平    时间: 2012-3-14 20:23
楼上答得好啊
作者: 贠(yun)靖    时间: 2012-3-14 21:13
田啸 发表于 2012-3-14 19:03
首先看第一个输出语句:
System.out.println(Price.INSTANCE.currentPrice);
这里打印的是 Price 类的静态实 ...

学习了  这个分析真心好~~~!




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