注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之十构造器的初始化顺序  

2014-12-02 20:35:10|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之十构造器的初始化顺序

在高级语言中,静态变量和类初始化的过程都是十分重要的,这涉及到一些对调用顺序要求时会不会产生异常,这是程序健壮性的重要的一环。

在《Java编程思想》中,5.6节说,Java尽力保证所有变量在使用前都得到恰当的初始化。对于方法的局部变量,Java以编译时错误来贯彻这种保证。

初始化的方法不外乎有以下几种:

1、指定初始化(在老的C++版本中不支持,但在C++11以上的版本已经支持)

即声明一个类时直接在其成员上赋值:

Public class Test{

  Int temp = 0;

}

2、构造器初始化。这几乎是所有的面向对象的高级语言必须提供的一类方法。

Public class Test{

Int temp;

Test(){

Temp = 0;

}

}

但是这样就引出了本文的问题,初始化的顺序,而且有静态与非静态之分。

A)请大家一定要记清楚的是,Java里,成员变量定义的顺序,决定了其初始化的顺序。即使变量定义散布于方法定义之间,它们仍然会在任何方法(包括构造器)被调用之前得到初始化。

B)静态数据只占用一份存储区域,不管你创建多少个类的对象。 而且它无法应用于局部变量,所以它只能作用于域。如果一个域是 的基本类型域,且没有显示的初始化,那么它就会获得基本类型的标准初值;如果其是一个对象引用,那么它的默认初始化值就是null,那么下面就值得注意了:静态数据成员初始化只有在必要的时刻才会进行。假如有一个类Test,其内部有一个静态变量t,如果不new Table或者Test.t,那么静态变量是不会被创建的,这一点应该和C++有一些区别。

只有第一个对象创建或者第一次引用静态变量时,静态的成员才会被初始化,其后便不再初始化。

Java的构造函数其实是一个隐匿的static静态方法,这也是Java的一种对对象处理的方式吧。另外在Java中还 一种显示的静态初始化,这个在调用库时大多这样用。

Public class Test{

Static int I;

Static{

  I = 7;

}

}

当然也可以使用最普通的方法,即非静态实例初始化,也就是直接初始化,这个是高级语言最常用的方法。

这里还需要提一下数组的初始化,Java中数组的定义是两种方式都可以,即int [] a;int b[];

这和C#正好是不一样的,C#只能使用前者。

最后总结一下:

初始化的顺序是先静态成员,然后再非静态成员中的指定初始化成员,然后才是构造器。

  评论这张
 
阅读(357)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017