1. final关键字的含义
final表面意思就是不可更改的,恒量的意思;指的是无法改变的量,这与静态标量static是有区别的,静态变量指的是只有一份存储空间,值是可以改变的。使用final一定原因是出于软件设计的角度,因为别人看到final这个关键字就知道是什么意思,达到心领神会的效果,但也正是由于这种"语义"的存在,在程序设计中要谨慎使用,以免误用。 在Java中final修饰的就是常量,而且变量名要大写; 类不能同时被声明为final和abstract。Math类:
public static final double PI = 3.14159265358979323846;
…java源码中好多变量都用final修饰
2. final的作用
final根据修饰位置的不同作用也不相同,针对三种情况:
(1)修饰变量
被final修饰的变量必须要初始化,赋初值后不能再重新赋值。 注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。 虽然final可以修饰局部变量,但是一般情况下,我们在实际应用中几乎不会这么干!没多大的意义!被final修饰的变量必须显示的初始化,初始化可以以三种方式:
1)定义时初始化
2)在构造器中设置值
3)在非静态块中为final实例变量设置值
final修饰变量指的是:这个变量被初始化后便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可变,即不能再指向其他的对象。
final修饰的变量的初始化:
public class FinalTest{
final int x1= 10000;
final int x2;
final int x3;
{
x2 = 20000;
}
public FinalTest(int x3) {
this.x3 = x3;
}
public static void main(String[] args) {
FinalTest finalTest = new FinalTest(5);
//The final field FinalTest.x1 cannot be assigned
//finalTest.x1= 3;//重新赋值时会报错 The final field FinalTest.x1 cannot be assigned
System.out.println(finalTest.x3);
}
}
如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值时可以更改的,比如:
final Operate operate = new Operate() ;// operate有一个普通变量i初始化为10
operate.i = 11;
operate.i = 12;
System.out.println(operate.i);
//输出12
上述是自定义类,即便是数组,List等集合类型,所保存的值也是可以更改的。
(1)修饰方法
被final修饰的方法代表不能重写。
(1)修饰类
被final修饰的类,不能够被继承。
注意:final修饰的类,类中的所有成员方法都被隐式地指定为final方法。
(3) final用于数组
final用于数组和引用时一样的,数组只不过是另一种引用,对于这个变量的引用是不能被重新赋值,但是对象本身是可以修改的。代码如下:package com.game.lll;
public class FinalTest {
private final Value v1 = new Value(10);
private final int[] values = { 1, 2, 3, 4, 5, 6 };
public static void main(String[] args) {
FinalTest test = new FinalTest();
//test.a = 5;//不可以这样做
test.v1.value++;
//test.v1 = new Value(12);//Error:不可以这样做
test.values[0] = 100;//对象本身是可以修改的
for(int i = 0; i < test.values.length;i++){
System.out.println(test.values[i]++);//对于这个变量的引用是不能被重新赋值
}
}
class Value{
int value;
public Value(int value) {
this.value = value;
}
}
}
3、 final和static的区别
static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变,看一下例子:
public class Test {
public static void main(String[] args) {
MyClass myClass1 = new MyClass();
MyClass myClass2 = new MyClass();
System.out.println(myClass1.i);
System.out.println(myClass1.j);
System.out.println(myClass2.i);
System.out.println(myClass2.j);
myClass1.i = 1233; //这里不可以改的
}
}
class MyClass {
public final double i = Math.random();
public static double j = Math.random();
}
输出结果
运行结果,两次打印,j的值都是一样的,j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的,这里的不可变是意思是你不能对它就行二次修改。