final 关键字
1 final关键字
- 采用final 修饰的类不能被继承
- 采用final 修饰的方法不能被覆盖
- 采用final 修饰的变量不能被修改
- final 修饰的变量必须显示初始化
- 如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次赋值, 但被指向的对象是可以修改的
- 构造方法不能被final 修饰
final一般修饰静态常量,被修饰的常量名建议大写,每个单词之间采用下划线衔接:
static final String COUNTRY = "中国";
static final String USER_NAME = "Admin";
2 采用final修饰的类不能被继承
/**
* @author wcs
* @date 2021/8/8 16:07
*/
public class FinalClassTest01 {
public static void main(String[] args) {
}
}
//final修饰类
final class A {
public void m1() {
}
}
//不能继承A,因为A采用了final修饰
class B extends A {
public void m2();
}
报错信息:
3 采用final修饰的方法不能被覆盖
/**
* @author wcs
* @date 2021/8/8 16:13
*/
public class FinalMethodTest02 {
public static void main(String[] args) {
}
}
class A2 {
//final修饰的方法
public final void m1() {
}
}
class B2 extends A2 {
//子类无法覆盖父类的方法,因为是final修饰的
public void m1() {
}
}
报错信息:
4 采用final修饰的变量(基本类型)不能被修改
/**
* @author wcs
* @date 2021/8/8 16:22
*/
public class FinalVarTest03 {
public static void main(String[] args) {
final int i = 100;
System.out.println(i);
//不能再次修改,因为变量i是final修饰的
i = 99;
System.out.println(i);
}
}
报错信息:
5 final修饰的变量必须显示初始化
/**
* @author wcs
* @date 2021/8/8 16:26
*/
public class FinalVarTest04 {
//error:final修饰的变量必须初始化
// final int x;
final int a = 2;//这是正确的
public static void main(String[] args) {
//局部变量如果不使用可以不初始化
int i;
final int b;
}
}
报错信息:
6 如果修饰的引用,那么这个引用只能指向一个对象,也就是说这个引用不能再次被赋值,但被指的对象是可以修改的
/**
* @author wcs
* @date 2021/8/8 16:35
*/
public class FinalTest05 {
public static void main(String[] args) {
People p1 = new People();
p1.name = "jack";
System.out.println(p1.name);
final People p2 = new People();
//p2指向对象的属性可以修改
p2.name = "rose";
System.out.println(p2.name);
p1 = new People();
//error:p2采用了final修饰,限制了p2指向堆内存中的地址不能修改(p2只能指向一个对象)
// p2 = new People();
}
}
class People {
String name;
}
报错信息: