JavaSE--final关键字

发布时间 2023-08-15 10:33:11作者: 洛小依ovo

一、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 = "中国";
    // 常量一般都是公开的
}