您的位置:首页 > 编程语言 > Java开发

Java final和static字段的初始化详解

2012-07-03 08:38 260 查看
JAVA的final关键词可以用在三方面,一是字段,二是方法,三是类,本文主要讨论final字段的几种初始化方法.

首先用我个人通俗语言来解释一下final字段的意思,就是final如果初始化值,就不允许对它进行赋值运算,不允许再修改它的值了,JAVA术语叫final字段为常量.

注:本文的示例代码都没有写main方法,但代码都可以编译通过,自己可以再建一个类来进行测试.

第一种情况是最常用的,就是在声明一个常量,并初始化它的值.

public class Test{

final int i=0; //在声明时就初始始常量的值.

}

第二种情况就是声明常量时,不初始化它的值,通过构造方法或块(关于块大家可以看我的”什么是java块”)来初始化.

1.通过构造方法来初始化.

public class Test{

final int i; //声明时未初始化,如果常量不通过构造方法或块初始化会报错的

Test(){

i=1; //通过默认的无参构造方法初始化i=1,

//如果只有默认的无参构造方法,这样每个对象的fianl常量都为一个值

}

//or

Test(int n){

i=n; //通过构造方法重载,用有参的构造方法的参数来初始化常量为你想要的值

//这样每个对象的i属性可以为不同的值

}

}

2,通过块来初始化常量.

public class Test{

final int i;

//在class只打{},这样的格式语句称为块

{

i=1; //这样初始化每一个对象的i属性都是1,以后不可以改它的值为其它

//不可以再在构造函数里初始化i的值,因为块已经把常量初始化了,再初始化就是修改它的值

}

}

3,初始化静态常量.

public class Test{

static final int i;

static{

i=1;

}

}

静态常量比较特别,不能通过构造方法或非静态块来进行初始化,从设计角度来考虑,如果可以通过构造方法或非静态块来进行初始化,那每new一个对象都会对静态的常量进行再一次的赋值操作,也就是说修改它的值,这样与常量不能修改的意思相冲突.

一个类的静态属性是所有对象公有的,而非静态属性是每一个对象私有的,所以我们只能用静态块对static常量初始化,或通过声明时就初始化,而非静态常量可以构造方法,块,声明时初始化三种初始化方法.

从成员的初始化顺序来考虑这个问题.当直接通过“类名.属性”或“类名.方法名”这样的方式访问,都会自动先调用static块,然后再调用静态属性,如果是直接调用静态方法,最后才进行静态方法的调用,而以后直接”类名.”访问时,都不会再调用static块,因为静态的是共享的,只用初始化一次.扩展一下,从这里大家想到为什么不可以在静态的方法里调用非静态成员属性不?因为当直接通过类名.方法名调用非静态的成员属性时,有可以成员属性没有初始化,是通过构造方法new时才初始化,这样就有可能导致空引用的存在.sun程序员为了避免这样的情况出现,只有规定静态方法不能调用非静态属性.

原文出处与链接:http://www.eplato.cn/CutDeer-Blog/218-javafinalziduandechushihuaxiangjie.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: