类的初始化时机

从语法角度来讲程序可以在两个地方对类进行初始化
---定义类变量时指定初始值。
---静态初始化块中对类进行初始化。

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

如果仅仅停留在代码表面看这个问题,很难得到正确结果,从内存角度来分析程序初始化分为两个阶段。
1.系统为Person的两个类变量分配内存空间。
2.按初始化代码的排列顺序对类执行初始化。
根据上面的描述,初始化第一阶段,系统先为I,initPrice进行分配内存,此时这两个类变量默认值为null,0.0.之后进行按初始化代码的排列顺序对类执行初始化,先为I进行初始化,赋值时需要调用Person(2.8),创建Person实例此时立即执行构造器对currentPrice进行赋值,此时initPrice的值为0,所以System.out.println(Person.I.currentPrice);的输出结果为-2.8.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,765评论 18 399
  • 《ilua》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 1...
    叶染柒丶阅读 10,972评论 0 11
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,321评论 0 7
  • 当孩子开始哭泣的时候,我们会心烦,在我们看来,孩子的哭声意味着父母的无能,于是我们会尽力的想止住他的哭声,以为止住...
    无敌桃子阅读 446评论 0 0
  • 明天老公决定去看一看挂证的事了,不知道是不是仓促呢!可是我也逼得好紧! 我真的好想在城里有一套房子!可是他又穷,又...
    通通达阅读 171评论 0 0