java基础之关键字final

final关键字简述####

final关键字是在编写java程序中出现频率和很高的关键字,如果想要更好的编写java程序,那么掌握final关键字的运用是非常必要的。让我们先看一下final关键字可以修饰的地方有哪些

  • final关键字修饰在类上
  • final关键字修饰在方法上
  • final关键字修饰在成员变量上
  • final关键字修饰匿名内部类方法上
鉴于本人知识结构有限,若有错误忘不吝赐教,甚为感谢。#####

  • final关键字修饰在类上
    当final关键字修饰在类上时代表该类是不可被继承,我们非常熟悉的String、Integer等都是由final修饰类,《java编程思想》里有阐述过String等基本类型的封装类之所以用final修饰就是不希望String类被其他类继承从而改变String类特性。
public final class FinalKeyWordTest {
  public FinalKeyWordTest(){}
  public void myFinalMethod(){
      System.out.println("this final");
  }
}
class MyTest1 extends FinalKeyWordTest{ //编译错误}
  • final关键字修饰在方法上
    当final修饰在方法上时代表该该方法不允许被覆盖(重写)。《java编程思想》写到:使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的Java版本中,不需要使用final方法进行这些优化了。
    如果想要禁止子类覆盖某一个父类方法,那么使用final去修饰它是最好的办法
public  class FinalKeyWordTest {
  public FinalKeyWordTest(){}
  public final void myFinalMethod(){
      System.out.println("this final");
  }
}
class MyTest1 extends FinalKeyWordTest{
    @Override
    public final void myFinalMethod(){//编译错误
          System.out.println("this sub final");
      }
}
  • final关键字修饰在成员变量上
    用final修饰成员变量是最常见的运用方式,对于一个final修饰的变量:
    1.如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改。
public  class FinalKeyWordTest {
  public final int i; //编译错误
}
public  class FinalKeyWordTest {
  public final int i;
  public FinalKeyWordTest(){
      this.i = 1;
  }
}
//编译是正确的

2.如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

public  class FinalKeyWordTest {
  public static void main(String[] args) {
      final MyTest1 m = new MyTest1();
      m = new MyTest1(); //编译错误
  }
}

public  class FinalKeyWordTest {
  public static void main(String[] args) {
      final MyTest1 m = new MyTest1();
      System.out.println(++ m.c);
  }
}
class MyTest1{
     int c = 0;
}
//正确
  • final关键字修饰匿名内部类方法上
    此处待整理状态,目前没有查到更多的资料显示为什么匿名内部类方法参数必须要final修饰,到是有查过几篇博客说的都很笼统,有的博客说匿名内部类方法参数之所以用final修饰 是不希望在方法内修改参数数据从而影响外部调用类方法执行。这么说其实不是很全面,我们知道java当中参数专递如果是基本数据类型那么是按值传递,如果是引用类型则是按引用传递。那么参数不管是 基本数据类型,还是引用类型 这说的都没有道理,如果参数是基本数据类型 内部类方法修改参数内容,外部类是根本获取不到的,如果参数是引用数据类型,内部类方法可以修改引用里的属性变量 从而是可以破坏外部调用类执行的
原文地址:https://www.cnblogs.com/gaoqiri/p/8242188.html