被fianl修饰的对象类型的成员变量
final修饰的成员变量,其值是不能改变的(这里的值指的是对象的引用)。必须进行初始化。另外,在一般情况下创建对象的时候,系统都是对其成员变量进行默认初始化的,一旦被fianl修饰的成员变量是不会被初始化的
public class FinalDemo {
//声明对象类型的变量
final String str;//在编译时会提示The blank final field str may not have been initialized
//意思是:fianl修饰的字段str未被初始化
public static void main(String[] args) {
}
}
初始化的方法有三种
1.直接在变量后直接赋值
final String str = "hello";
2.在构造方法中进行赋值
final String str;
public FinalDemo (){
str = "hello";
}
3.在代码块中进行赋值
final String str;
{
str = "hello";
}
PS:如果是在静态代码块中进行初始化赋值,那么该成员变必须要被static修饰
验证被fianl修饰对象类型的成员变量是引用不可变,值可变
public class FinalDemo {
final StringBuilder str = new StringBuilder("Hello");
public static void main(String[] args) {
//创建FinalDemo对象
FinalDemo demo = new FinalDemo();
System.out.println("str内容是"+demo.str);
System.out.println("str的hashCode值是"+demo.str.hashCode());
//对成员变量str进行追加
demo.str.append(" China");
System.out.println("sb的值是"+demo.str);
System.out.println(demo.str+"的hashCode值是"+demo.str.hashCode());
// 输出结果如下所示
// str内容是Hello
// str的hashCode值是1690552137
// sb的值是Hello China
// Hello China的hashCode值是1690552137
}
}
如上所诉:
可以看出StringBuilder中的内容变了 而所指向的哈希编码却没发生变化,在Java中每一个对象都有自己独一无二的哈希编码,根据这个编码就可以找到相关的对象,也就是说,根据这个编码可以独一无二地确定这个对象。
因而使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容是可以改变的。
被fianl修饰的基本类型的成员变量
final修饰基本类型的成员变量时,其值是不能被改变的,也是必须进行初始化。
public class FinalDemo {
final int a = 5;
public static void main(String[] args) {
FinalDemo demo = new FinalDemo();
demo.a = 6;//The final field FinalDemo.a cannot be assigned
//意思是:无法赋值被fianl修饰的字段
}
}
基本数据类型的变量,则其数值一旦在初始化之后便不能改变