转至:https://blog.csdn.net/youyaecho/article/details/51198777
一、final修饰变量
final修饰变量不可变,这里是指引用不可变(Java中共提供两种数据类型,原始数据类型8种和引用类型),即它只指向初始时指向的那个对象,而不关心指向对象内容的变化。
final修饰的变量必须初始化。初始化根据变量类型而不同:
1、static变量。只能在定义,或者静态块中初始化。
//定义、声明 --也就是常量
private static final String NAME="abc";
//静态块
private static final String DESC;
static{
DESC="def";
}
2、普通实例变量。可以在定义,非静态块,构造函数中初始化。
//定义 声明
private final String name="feiniu5566";
//非静态块
private final String age;
{
age=28;
}
//构造函数
private final sex;
public ClassA(){
sex="男";
}
3、局部变量。只能在定义时初始化。
//局部变量
public void print(String str){
final String name="world";
}
注:static变量无法再非静态块和构造函数中初始化,因为静态变量在二者之前加载。同理,实例变量也无法在静态块中初始化,因为静态块加载时实例变量还没有定义。
public static void main(String[] args) {
final int aInt = 10;//必须初始化
aInt = 1;//编译期间错误
System.out.println("aInt = "+aInt);
final StringBuffer s = new StringBuffer("Hello");
s.append(" World!");
System.out.println(s);//结果为Hello World!
final StringBuffer s1 = new StringBuffer(" Hello");
s1 = new StringBuffer("Hello World!"); //编译期间错误,不可以指向别的对象.
/*
* 不可变有两层含义:1 引用不可变 2 对象不可变
* 综上,final指的是引用不可变,只能指向初始时指向的那个对象,而不关心对象内容的变化.
* */
}
final数据另一种分类方法:
1.一个永不改变的编译时常量,还有static时命名全部大写:public static final int VALUE_ONE = 99;
2.一个在运行时初始化的值,而你不希望它被改变。private int i = (Random)random.nextInt(20);数值在运行时内被初始化时才会显现,编译时不知道。