1 简介
final:不可被改变。
序号 | 修饰场景 | 描述 |
---|---|---|
1 | 变量 | 不可修改,一次性赋值 |
2 | 方法 | 不能被重写,一次性逻辑 |
3 | 类 | (1)不能被继承; (2)引用地址不可变,内容可变 |
2 应用
2.1 final修饰变量
修饰成员变量时,一次性赋值,无法修改赋值。
这也要求,final修饰的成员变量需要赋初值。
二次赋值编译期报错,如下图:
测试代码:
package com.monkey.java_study.datastructure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* final关键字测试.
*
* @author xindaqi
* @date 2022-05-05 12:03
*/
public class FinalTypeTest {
private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);
// final 引用类型或者基础类型:不可变更
private final String name = "xiaohua";
// final 引用类型或者基础类型:不可变更
private final int age = 10;
public static void main(String[] args) {
FinalTypeTest finalTypeTest = new FinalTypeTest();
logger.info(">>>>>>>>>>Name:{}, age:{}", finalTypeTest.name, finalTypeTest.age);
// final 引用类型或者基础类型:赋值后,不可变更(只能一次赋值)
finalTypeTest.name = "xiaolan";
finalTypeTest.age = 10;
}
}
2.2 final修改方法
final修饰的方法无法被重写,
表明方法也是一次性逻辑,无法再同一套JVM中二次修改,
重写final修饰的方法编译期报错,如下图:
测试代码:
package com.monkey.java_study.datastructure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* final关键字测试.
*
* @author xindaqi
* @date 2022-05-05 12:03
*/
public class FinalTypeTest {
private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);
static class User {
private String name;
public User(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public final void finalMethod() {
}
public void normalMethod() {
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
static class Customer extends User {
private String name;
public Customer(String name) {
super(name);
}
// final修饰的方法:无法被重写
@Override
public void finalMethod() {
}
@Override
public void normalMethod() {
}
}
public static void main(String[] args) {
}
}
2.3 final修饰类
final修饰类有两种用法:
(1)实例化类;
(2)定义类;
2.3.1 实例化类
实例化类时,使用final关键字,无法改变该类的指向,即引用地址无法变更,
变更引用地址编译期报错,如下图:
package com.monkey.java_study.datastructure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* final关键字测试.
*
* @author xindaqi
* @date 2022-05-05 12:03
*/
public class FinalTypeTest {
static class User {
private String name;
public User(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
public static void main(String[] args) {
// final类:引用的地址不可变,对象内容可变
final User user = new User("xiaohua");
logger.info(">>>>>>>>>初始化:{}", user.getName());
user.setName("xiaolan");
logger.info(">>>>>>>>>初始化:{}", user.getName());
// final类:引用的地址不可变,对象内容可变
user = new User("xiaolan");
}
}
2.3.2 定义类
定义类时,使用final关键字,该类无法被继承,
继承编译期报错,如下图:
package com.monkey.java_study.datastructure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* final关键字测试.
*
* @author xindaqi
* @date 2022-05-05 12:03
*/
public class FinalTypeTest {
private static final Logger logger = LoggerFactory.getLogger(FinalTypeTest.class);
static final class UserFinal {
private String age;
// setter/getter is omitted.
}
// final修饰的类:无法被继承
static class Person extends UserFinal {
}
public static void main(String[] args) {
// final类:引用的地址不可变,对象内容可变
user = new User("xiaolan");
}
}
3 小结
final关键字:一次性成型,无法编辑。
(1)提高性能;
(2)多线程共享,无需额外同步开销;
(3)JVM对final有优化;