一、final关键字
1、final概述
final是一个关键字,可以修饰变量、方法还有类等
final表示最终的,不可变的
2、final修饰的类
final修饰的类无法继承
final class A{
}
// B类继承A类相当于给A类进行功能扩展,
// 如果不希望别人进行扩展,进行继承,可以给A加final关键字
class B extends A{// 错误:
}
3、final修饰的方法
final修饰的方法无法被覆盖,被重写
class C{
public final void doSome(){
System.out.println("C's doSome");
}
}
class D extends C{
public void doSome(){// 错误:不能覆盖
System.out.println("D's doSome");
}
}
4、final修饰的变量
重点:final修饰的变量只能赋一次值
- final修饰的局部变量:
一旦赋值不能重新赋值
- final修饰的引用:
该引用只能指向一个对象,并且他只能永远指向该对象,无法再指向其他对象,并且指向的该对象不会被垃圾回收器回收,直到当前方法结束,才会释放空间
但是该对象内部的数据还是可以修改的哦,这没问题,
public class FinalTest01{
public static void main(String[] args){
int i = 100;
i = 200;
final k = 100;
k = 300;// 错误:无法为最终变量k分配值
final m;
m = 200;// 一次赋值可以
m = 500;// 错误:
}
}
public class FinalTest02{
public static void main(String[] args){
Person p1 = new Person(20);
final Person p = new Person(30);
p = new Person(10);// 错误:无法为最终变量p分配值
}
}
class Person{
int age;
public Person(){
}
public Person(int age){
this.age = age;
}
}
5、final修饰的实例变量
final修饰的实例变量,系统不管赋默认值,要求程序员必须手动赋值
这个手动赋值,再变量后面赋值可以,在构造方法里面赋值也可以
public class FinalTest03{
public static void main(String[] args){
}
}
class User{
// final int age;// 错误
final double height = 1.8;
// 以下这四行代码代码联合起来,weight也是赋值了1次
final double weight;
public User(){
this.weiht = 60;// 只要我赶在系统赋默认值之前赋值就行
}
public User(double d){
this.weight = d;
}
}
6、final修饰的实例变量一般添加static修饰
static fina联合修饰的变量称为“常量”,常量名建议全部大写,每个单词之间采用下划线衔接
因为既然使用了final修饰,说明该实例变量不会随着对象的变化而变化,那么100个对象在堆内存中就有100份相同的该实例变量,浪费空间,那我们加上static修饰,他就一直存在方法区,节省空间
class Chinese{
public final static String COUNTRY = "中国";
// 常量一般都是公开的
}