final关键字

final:最终的 不能改变的
final可以用来修饰的结构:类、方法、变量。
static final 用来修饰属性:全局常量。

final修饰类
此类不能被其他类所继承。
比如:String类、System类、StringBuffer类。

final class Hoo{
    
}
//class Ioo extends Hoo{} //编译错误,final的类不能被继承
class Joo{}
final class Koo extends Joo{} //正确,不能当老爸,但能当儿子

final修饰方法
表明此方法不可以被重写。
比如:Object类中getClass()。

class Foo{
    void show(){}
    final void test(){}
}
class Goo extends Foo{
    void show(){}
    //void test(){} //编译错误,final修饰的方法,不能被重写
}

final修饰变量(成员变量和局部变量)
变量分为成员变量和局部变量,他们被final修饰时有不同的注意事项。
(1) final修饰成员变量:该成员变量必须在其所在类对象创建之前被初始化(且只能被初始化一次)。
所以当我们在定义被final修饰的成员变量时 该成员变量必须在其所在类对象创建之前被初始化 这种初始化的方法有三种
1).直接初始化(赋值)

public class Demo{
    private final int a = 5;
    public static void main(String[] args) {
  }
}

2).构造代码块中将其初始化(赋值)
构造代码块会在类对象构造方法之前执行(即创建对象前执行)

public class Demo{
    //被final修饰的成员变量 在其类对象创建之前必须完成初始化
    private final int a;
    //在构造代码块中为a赋值
    //构造代码块会在该类对象创建之前执行
    {
        a = 5;
    }
    public static void main(String[] srgs){
  }
}

3).在成员变量所在类的构造方法将其初始化(赋值)

public class Demo{
    //被final修饰的成员变量 在其类对象创建之前必须完成初始化
    private final int a;
    //带参数的构造方法 在构造方法中被final修饰的成员变量初始化
    public Demo2(int b){
      this.a = b;
  }
    public static void main(string[] args){
  }
}

3.1).final修饰局部变量:该变量必须在使用之前赋值 且只能赋值一次

public class Demo{
    public static void main(String[] args){
  }
    public void test(){
      //在test方法定义一个被final修饰的局部变量 该变量的作用域就是在test方法内
      final int a;
  }
}

static final常量:应用率高

  • 必须声明同时初始化
  • 由类名打点来访问,不能被改变
  • 建议:常量所有字母都大写,多个单词用_分隔
  • 编译器在编译时会将常量直接替换为具体的数,效率高
  • 何时用:数据永远不变,并且经常使用

总结:
final修饰成员变量,该变量必须在 其所在类对象 创建之前完成初始化且只能被初始化一次
final修饰局部变量,该变量在定义时可以不被初始化,但是使用之前,必须完成初始化且只能初始化一次

总而言之一句话:
final修饰的成员变量在定义时必须初始化(三种方法),final修饰的局部变量定义时可以不被初始化,但是使用之前必须完成初始化!

版权声明:本文为自带光环的宇原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/burberry/p/16478962.html