Java的赋值与初始化


                                                                                                                 zhangleispirit@gmail.com

Java的赋值和初始化包括很多容易被忽视的地方,在此分类总结如下:

1.和赋值相关:

基本类型的赋值运算需要注意的是赋值时的类型转换问题,什么时候可以自动转换,什么时候需要强制类型转换是需要弄清楚的。

首先记住两个约定:

  (1)所有的字面整数都是int型的。

  (2)所有的字面浮点数都是double型的,因此声明一个float 型的浮点数,必须做类型转换,或者声明时加上f。float ads=3.13f。

第一条:一个占用int或更短长度的表达式的结果总是一个int,也就是两个byte型的结果加到一起,结果是int。举个例子,下面的代码是会出编译错误的:

byte b=3;

byte c=8;

byte d=b+c;

b+c的结果是一个int型的值,而d是一个byte型的值,转换时向着范围比较小进行转换,编译器是会报错的,如果显示的强制类型转换,则不会出问题。

从小范围到大范围的转换是不需要显示强制转换的,包括从long型向float和double型的。

当编译器知道过大而无法被变量保存的字面值赋给变量,将会得到编译错误。

byte a=128;

注意有几个运算符在类型转换的特殊地方。

   +=,-=,*=,/=这几个运算符都将使用隐式的强制类型转换。

byte b=3;

b+=7;//这时是正确的。

2和初始化有关:

(1)对于实例变量,都会初始化成默认值。对于对象引用类型的实例变量,其初始值是null。

(2)数组对象比较特殊,数组是一个对象,数组元素总是被赋予默认值,不论数组实在哪里声明和实例化,即使该数组是局部变量都是如此。如果数组元素是对象的引用,则默认值为null,如果数组元素是基本类型,则默认值是基本类型的默认值。

(3)局部变量是没有默认值的,不论是基本类型,还是对象的引用,因此,任何局部变量在使用之前都必须显式的作初始化,否则会出现编译错误。

(4)对象的引用相互赋值,并不修改对象本身(String对象除外)。

(5)对于String对象,要记住这样几点,String对象的值是不可以改变的,因此,下面的例子看起来似乎很矛盾:
      String str="zhanglei";

      String str2=str;

      str=str+" ,how are you?";

 语句的详细解释如下:

      首先在堆中创建一个String对象“zhanglei”,然后让对象引用str指向这个对象,第二条语句将对象引用str赋给str2对象引用。第三条语句将对象“zhanglei”和对象“how are you ?”做连接操作,生成一个新的对象,然后把这个对象的引用赋给str。因此,此时如果打印str2的内容还是“zhanglei”。

   (6)初始化块:
      初始化块分为两种:静态初始化块和实例初始化块;

      静态初始化块用来初始化类中的static属性成员,实例初始化块用来初始化实例属性成员。

     第一次加载类时,会运行静态初始化块,没创建一个新的实例,就会运行一次实例初始化块。实例初始化块的运行是在所有的超类构造函数运行之后。静态初始化块是在所有超类构造函数之前运行。多个初始化块并存时,运行的顺序即他们在类文件中出现的顺序。


posted @ 2008-10-14 11:01  zhanglei_spirit  阅读(2302)  评论(0编辑  收藏  举报