还未进行初始化就使用了这些内存(很常见的编程错误),那么很有可能会 发生一些无法预料的后果。 安全性是Java最看重的目标之一,因此许多困扰C和C++程序员的问 题在Java里面已经不复存在了。数组肯定会被初始化,而要想访问数组 以外的内存也已经不可能了。边界检查的代价就是,每个数组都会多占用 些内存,而且程序运行的时候也会有些开销。不过设计者们相信,与安 全性的增强和编程效率的提升相比,这点代价值。 当你创建对象数组的时候,实际上你是在创建 reference的数组。这些 reference会被自动地初始化为一个特殊的值:null。这是个关键词,意 思就是“没有”。Java一看到n山l就知道这个 reference没有指向任 何对象。使用 reference之前,你必须用对象对它进行赋值,如果你试 图用一个仍然是nu的 reference,那么程序运行的时候就会报错。由 此,Java防止了许多常见的数组错误。 你可以创建 primitive的数组。编译器也会进行初始化,因为它会把数组 的内存全部清零 以后章节会更详细的讲解数组。 你永远不需要清理对象 在绝大多数编程语言中,要弄清变量生命周期的概念都会耗费大量的精 力。变量要生存多长时间?如果要由你来进行清理,那么应该在什么时候 进行清理?在变量生命周期方面含糊其辞,会导致很多bug。这一章会告 诉你,Java是怎样通过接管所有的清理工作来大大简化这个问题的 作用域 绝大多数过程语言都有“作用域( scope)”的概念。它决定了在这个作用 域里定义的变量的可见性与生命周期。在C,C++和]ava中,作用域是 由花括号{}的位置决定。所以,假如 int x =12 // Only x available tq=96 / Both x &g available / Only x available // g" out of scope" 在作用域中定义的变量只能用到这个作用域的结尾。 第6页共26页shhgs@wgqqh.com 6 ✁ ✂ 26 ✁ ë%&f^ç, Ì{(· (áâ
)YZmÝ;º ì03ÌÜ?(Å c# Java b<(au3æò0V C C+ + âFQ(² F Java ˶ôõX6{F,OHOº¹f^à%|±²OH E½({[ôõXÝ;,?(¸ÍL×OHƺV 3Ì{àâF&(M[ºmÌX^ "> c#(áâØ·() >8 C¸ÍÕ ¡~¥OH(Mñ`J¡F~ reference (OH Ì reference º¹ý rf^3×1\(Õnu l l ׳¹ ÍmÏJava 3<g nu l l½t × reference mZ ¥ç reference u¡'(¥¥A%&!ÕÄÅ¡" #3×Û nu l l( referenceYZâF&(Mº$, òJava %+,0V· (OH
¡ÝE~ p ri m iti ve (OHáf[º%&f^æAºPOH ({c&' Eûߺ((©£OH F)ÂVOáâ*%*&5ª0»¼@(Ö+ƺ,-ª(A ã5ª%0{VÊ4Ê ÄÅ%,¡Q%&&¢YZvwFöZM %&&¢Ê F5ª0»¼@µ¶./§0º1_V b u g 3ûº# ¡Java Õ¦^UÂDm(&¢y1QÂÂ]^ ײ( )ÂVO^âÆmÍ12 (scope)Ï(Ö+ANO,F ×1 2ËO3(5ª(Ý #0»¼@F CC+ + Java *12 ,/{ }(§¨NODE9Ä { int x = 12; // Only x available { int q = 96; // Both x & q available } // Only x available // q “out of scope” } F12*O3(5ªó;g ×12(45