java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

final : 最终的,最后的

1.修饰变量:值不能被修改。必须进行显示初始化。只有一次赋值机会。

1.成员变量:

实例变量(三选一):

1.在声明时初始化。

2.实例代码块中

3.在构造器中初始化。

类变量(二选一):

1.在声明时

2.静态代码块中。

2.局部变量:只有一次初始化机会。在使用之前进行初始化

2.修饰方法:方法不能被重写

3.修饰类: 不能被继承。

首先用我个人通俗语言来解释一下final字段的意思,就是final如果初始化值,就不允许对它进行赋值运算,不允许再修改它的值了,JAVA术语叫final字段为常量. 注:本文的示例代码都没有写main方法,但代码都可以编译通过,自己可以再建一个类来进行测试.

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

1public class Test{
final int i=0;        //在声明时就初始始常量的值.
}

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

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

1public class Test{
final int i;    //声明时未初始化,如果常量不通过构造方法或块初始化会报错的
Test(){
i=1;    //通过默认的无参构造方法初始化i=1,
//如果只有默认的无参构造方法,这样每个对象的fianl常量都为一个值
}
//or
Test(int n){
i=n;    //通过构造方法重载,用有参的构造方法的参数来初始化常量为你想要的值
//这样每个对象的i属性可以为不同的值
}
}

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

1public class Test{
final int i;

//在class只打{},这样的格式语句称为块
{
i=1;    //这样初始化每一个对象的i属性都是1,以后不可以改它的值为其它
//不可以再在构造函数里初始化i的值,因为块已经把常量初始化了,再初始化就是修改它的值
}

}

为什么这样写可以呢,这个涉及到JAVA的成员初始化顺序,大家可以看我整理写的XXXX,或直接看thinkingInJava的第四章第四小节,网上有thinkingInJava的电子书下载.

3,初始化静态常量.

1public class Test{
static final int i;
static{
i=1;
}
}

(调用的顺序是:静态代码块》main方法》构造代码块》构造方法)

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

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

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

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。