final关键字
final关键字
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test {
final double PI = 3.14; // 定义常量
public void fun() {
System.out.println("PI = " + PI);
}
public static void main(String[] args) {
Test t = new Test();
t.fun();
}
}
常量(常量值一旦声明就不能被改变)必须(推荐操作)在声明的同时进行初始化。常量约定俗成都大写。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class FinalTest {
static final double PI = 3.14; // 定义常量
public static void fun() {
System.out.println("PI = " + PI);
}
public static void main(String[] args) {
Test t = new Test();
// t.PI = 3.1415; // 修改常量 error!!!
t.fun();
}
}
非静态常量可以在构造方法(但是必须在每个构造函数都要这样做)和代码块和静态块中进行初始化。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test {
final double PI; // 定义常量
{ // 在代码块中初始化常量
PI = 3.141;
System.out.println(PI);
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(PI); // error
}
}
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class Test {
static final double PI; // 定义常量
static { // 在静态块中初始化常量
PI = 3.141;
System.out.println(PI);
}
public static void main(String[] args) {
Test t = new Test();
System.out.println(PI); // ok
}
}
这是因为静态变量只属于类,不属于对象,当用类名去索引PI时,并不会导致构造函数调用,造成PI没有被初始化而报告错误。
当我们将一个常量定义为静态时,就要声明的同时初始化了。