java 中常用的关键字有:final、static、extends、super、abstract、interface、implements。下面讲述
final 这个关键字。 final 翻译成中文,最终,结束,不可改变的,在 java 中用来表示不可修改的。
final修饰类
- final修饰的类不能被继承
- 使用场景:基于安全考虑,不想被其他人继承该类的功能
// 定义父类
public final class Person {
int age;
public Person(int age) {
this.age = age;
}
public void show(){
log.info("age:{}",age);
}
}
// 定义子类时报错:Cannot inherit from final 'apractice.keyword.Person'
public class Student extends Person{
String name;
public Student(int age, String name) {
super(age);
this.name = name;
}
}
final 修饰方法
- final修饰的方法不能被重写
- 使用场景:基于安全考虑,不想被其他人继承该类的功能
// 定义父类
public class Person {
int age;
public Person(int age) {
this.age = age;
}
final public void show(){
log.info("age:{}",age);
}
}
// 定义子类时重写show()方法报错:'show()' cannot override 'show()' in 'apractice.keyword.Person'; overridden method is final
public class Student extends Person{
String name;
public Student(int age, String name) {
super(age);
this.name = name;
}
final public void show(){
log.info("age:{}",age);
}
}
final 修饰变量
使用场景:作为常量,final 修饰的变量只能被赋值一次,不想被修改。具有有如下区分
- final 修饰局部变量必须在使用前赋值
- final 修饰成员变量如果定义时没有赋值称为(空白final),空白final 必须在构造器或者静态代码块中赋值。
@Slf4j
public class Person {
final int age;
final int hight;
static final int whight;
int hiar;
static {
// 1、使用 static final 修饰的变量必须在静态代码块中初始化
whight = 100;
}
public Person(int age, int hight) {
// 2、使用 final 修饰的成员变量必须在构造器中初始化
this.age = age;
this.hight = hight;
}
public void show() {
log.info("age:{},hight:{},whight:{}",age,hight,whight);
log.info("hiar:{}",hiar); // 无修饰的变量,有默认值 0
// 1、使用 final 修饰的变量赋值一次后不可修改,报错 Cannot assign a value to final variable 'age'
// age = 20;
final String name;
final String englishName = "Lily";
log.info("englishName:{}",englishName);
// 2、final 修饰的变量未初始化就使用,报错:Variable 'name' might not have been initialized
// log.info("name:{}", name);
name = "周芷若";
log.info("name:{}", name);
}
}