final关键字

final关键字:

  • final表示最终的,不可变得

  • final修饰的类无法被继承

  • final修饰的方法无法覆盖/重写

  • final修饰的局部变量只能赋一次值

  • final修饰的引用类型也只能赋一次值(引用也是一个变量,它的赋值体现为指向一个对象的内存地址)(赋值为null也不行)
    即final修饰的引用,在方法执行过程中,该引用指向的对象不会被GC回收,在方法执行完才会被回收
    但是,该引用指向的对象内部的数据是可以被修改的

局部变量没有默认值,实例变量系统会默认赋值,那么被final修饰的实例变量呢?

  • final修饰的实例变量系统不会为其赋默认值,必须手动赋值,但是也只能赋值一次
    如果赋值则报错:变量XXX未在默认构造器中初始化。 所以,如果在构造方法中给实例变量赋了值,则final修饰的实例变量在声明时也可以不用赋值了
class A{
  final int val;
  public static void main(String[] args) {
    A a = new A();
  }
}
//以上这样不行,报错:变量val未在默认构造器中初始化
class A{
  final int val;

  public A(){
    val = 111;    //赶在了系统为其赋默认值之前给其赋值了
  }
  public static void main(String[] args) {
    A a = new A();    
  }
}
//以上这样可以
class A{
  final int val;

  public A(int i){
    val=i;          //赶在了系统为其赋默认值之前给其赋值了
  }
  public static void main(String[] args) {
    A a = new A(111);
  }
}
//以上这样可以
  • final修饰的实例变量不会随着对象的改变而改变,即无论创建多少个对象,这个实例变量都只有一个值
    因此,final修饰实例变量一般加static修饰,变为静态的,放在方法区
    static final修饰的变量称为常量常量名全部大写
    常量一般是public的,因为无法修改,因此也不用封装了
常量和静态变量的都存在方法区,都在类加载时初始化,其区别在于,常量的值不能修改
posted @ 2021-10-08 16:07  这个世界会好的  阅读(84)  评论(0编辑  收藏  举报