网站建设编码中成员的初始化

为了确保变量在使用之前已经进行了初始化,Java做得还要彻底。如果变量是在方法内部定义的局部变量,这种保障就表现为编译时的错误信息。这个错误信息会告诉你还没有初始化。当然编译器原本可以给一个缺省值,但这看上去更像是程序员犯的错误,而给了缺省值之后反而会把这个错误给掩盖了。强制程序员提供初始化的值更像是在找bug。

但是,如果这个primitive是类的成员数据,那么情况就有些不同了。由于任何方法都可能初始化或用到这个数据,因此要求用户在使用数据之前就对它进行适当的初始化,就显得不那么现实了。然而把垃圾值留给它也是不安全的,所以类的primitive类型的数据都能确保获得一个初始值。

静态数据初始化

对类而言,初始化的顺序是由变量在类的定义里面的顺序所决定的。变量的定义可能会分散在类定义的各个地方,并且与方法的定义相互交错,但是变量的初始化会先于任何方法,甚至是构造函数的调用。我们把对象的定义分散到各个地方,你可以从程序的输出中看到,变量的reference被初始化了两次:一次是在构造函数调用之前。(这前一个对象被扔掉了,因此会被当作垃圾回收。)这种做法的效率好像不怎么样,但是却能保证进行适当的初始化,如果你还重载了一个不对变量进行初始化的构造函数,而定义变量的时候又没有提供缺省的初始化值,那又会怎样呢?

数组内部成员初始化

所有数组(不论它是primitive的还是对象的)都有一个可供查询的内部成员)但是你不能修改——它会告诉你这个数组有多少元素。这个成员就是length。由于Java的数组,同C和C++的一样,是从零开始计算的,因此你能访问的最大的数组下标length-1。如果是C和C++的数组,即使你过了界,它也会安安静静地接受这个指令,然后放你到内存里乱串一气,许多臭名昭著的bug就是由此产生的。

但是Java能让你免受这些问题的困扰。一旦你出了界,就会引发一个运行时错误。当然,每次访问数组的时候都要花时间检查,而且代码也会长些,但是你没法把它关了,也就是说,如果效率非常重要,那么访问数组就可能会成为拖累程序效率的一个因素。但是为了internet的安全和程序员的编程效率,Java的设计者们认为这个代价还是值得的。

数组的初始化

在C语言里,初始化数组是一件既常容易出错又冗长乏味的事。C++用所谓的“集合初始化”大大增强了这个过程的安全性。由于Java的一切都是对象,因而它没有C++的“集合”。它也有数组,并且提供了数组的初始化。数组只是一个列在同一个标识符名下的简单序列,这个序列既可以是primitive的,也可以是同一种类型的对象的。数组是通过由方括号括起来的数组下表来定义和使用的。

要定义一个数组,只要直接在类型的名字后面加上一对空的方括号就行了。你也可以将方括号放到标识符的后面,这样做的意思是相同的。这种写法是C和C++程序员们所预想的。但是前一种写法可能更好一些,因为它在说这个类型是“一个int型的数组”。

«1»
最近发表
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
搜索
Tags列表
网站收藏
图标汇集
  • 订阅本站的 RSS 2.0 新闻聚合
友情链接

热门搜索: 外链域名 高外链域名 高收录域名

Copyright www.thyst.cn. Some Rights Reserved.