浅谈final修饰的变量
定义:
【以下摘自Java编程思想 第四版】
根据上下文环境,Java的关键字final的含义存在着细微的区别,但通常它指的是“这是无法改变的”。不想做改变可能出于两种理由:设计或效率。由于这两个原因相差很远,所以关键字final有可能被误用。
一个既是static又是final的域只占据一段不能改变的存储空间。
当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果)。这一限制同样适用数组,它也是对象。
一个既是static又是final的域只占据一段不能改变的存储空间。
当对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑。对于基本类型,final使数值恒定不变;而用于对象引用,final使引用恒定不变。一旦引用被初始化指向一个对象,就无法再把它改为指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果)。这一限制同样适用数组,它也是对象。
实例代码:
/**
* Test class
* 参考:https://blog.csdn.net/zhangjk1993/article/details/24196847
*
* @author libin
* @date 2019/3/27 11:27
*/
public class Test {
// 【成员变量】
// 方法一:直接赋值
final int a = 1;
// 方法二:构造方法初始化
final int b;
public Test() {
b = 2;
}
// 【会报错】如果采用构造方法初始化,以后每个构造方法中都要有 b 赋值的语句。
/*public Test(String name){
}*/
// 为了方便可以这样写
public Test(String name) {
this();
}
// 【会报错】因为对 b 重复赋值
/*public Test(String name,int age){
this();
b = 2;
}*/
// 方法三:声明完变量后在构造代码块中为其赋值
final int c;
{
c = 3;
}
// 【静态变量(类变量)】
// 方法一:直接赋值
final static int d = 4;
// 方法二:变量同时采用 static final 修饰时,不能再采用构造方法或者构造代码块赋值了,可以采用静态代码块或者直接赋值。
final static int e;
static {
e = 5;
}
public static void main(String[] args) {
Test t = new Test();
t.f1(6);
}
public void f1(int x) {
// 局部变量,static 不能修饰局部变量。
final int a;
a = x;
System.out.println("a:" + a);
final int b = 7;
System.out.println("b:" + b);
final int c;
c = 8;
System.out.println("c:" + c);
}
}
参考答案
```
a:6
b:7
c:8
```
面试题:Java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
/**
* TestFinal class
*
* @author libin
* @date 2019/3/28 16:48
*/
class People {
private String name;
private int age;
People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return name + ": " + age;
}
}
public class TestFinal {
public static void main(String[] args) {
final People p1 = new People("张三", 21);
System.out.println("p1: " + p1);
p1.setAge(23);
System.out.println("p1: " + p1);
People p2 = new People("李四", 22);
// p1 = p2; // Cannot assign a value to final variable 'p1'
System.out.println("p2: " + p2);
p2 = p1;
System.out.println("p2: " + p2);
System.out.println("----------------");
final StringBuilder sb = new StringBuilder("Good ");
sb.append("Morning!");
System.out.println(sb.toString());
// sb = new StringBuilder("Hello World!"); // Cannot assign a value to final variable 'sb'
}
}
参考答案
```
p1: 张三: 21
p1: 张三: 23
p2: 李四: 22
p2: 张三: 23
----------------
Good Morning!
```
参考资料: