final修饰符

final修饰的变量

final修饰的成员变量一定由程序员指定初始值,并且一经赋值后,变量值将无法被修改

实例成员变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//  实例成员变量有3种方式为其赋初始值
final class test3{
//直接赋值
final int height = 180;

// 实例成员变量
final String name;
final int age;

{
// 实例代码块中为final修饰的实例变量赋予初始值
name = "默认";
}
public test3(){
// 构造器中为final修饰的实例变量赋予初始值
age = 20;
}
}
// 其实三者本质上还是同一种赋值方式,因为他们编译后都会被还原到构造器中

类成员变量

1
2
3
4
5
6
7
8
9
10
11
12
//类成员变量有两种方式为其赋初始值
final class test4{
// 直接赋值
final static age = 20;
// 类成员变量
final static String name;
static {
// 静态代码块中为final修饰的实例变量赋予初始值
name = "默认";
}
}
// 二者本质上也是同一种赋值方式,类成员变量在编译后会被还原到类代码块中

局部变量

1
2
3
4
5
6
7
8
9
10
11
12
final class test5{
public static void methods1(){
final int a = 10;
final String b = "默认值";
}

public void methods2(){
final int a = 10;
final String b = "默认值";
}
// 局部变量本来就需要显式赋予初始值,因此没有太大变动
}

引用类型

final修饰引用类型的变量时,只保证这个引用类型变量引用的地址不会发生改变,但对象可以被改变

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class finalTest {
public static void main(String[] args){
// 此时obj.getName会返回小红
final finalObj obj = new finalObj("小红");
// 通过set方法修改name值为小刚
obj.setName("小刚");
System.out.println(obj.getName()); // 输出小刚
}
}

final class finalObj{
private String name;
// set
public void setName(String name){
this.name = name;
}
// get
public String getName(){
return this.name;
}
// 构造器
public finalObj(String name){
this.name = name;
}
}

对于final变量来说,不管是类变量、实例变量、局部变量,只要满足下面三个条件,就不是变量,而相当于一个直接量

  1. 使用final修饰符修饰
  2. 在定义该变量时指定了初始值
  3. 该初始值可以在编译时就被确定下来

final修饰的方法

final修饰的方法不可被重写

1
2
3
4
5
6
7
8
9
10
11
public class finalTest {
final public void 铠甲勇士(){
System.out.println("铠甲勇士");
}
}
class final方法重写 extends finalTest{
@Override
public void 铠甲勇士(){
// final修饰的方法无法被重写,将会报错
}
}

final修饰的类

final修饰的类不可被继承

完~