美文网首页
final关键字的用途

final关键字的用途

作者: 宋雾代 | 来源:发表于2019-02-13 11:45 被阅读0次

Java中final修饰符既可以修饰类、方法,也可以修饰变量.

基本规则

  1. 用final修饰的类不能被扩展,也就是说不可能有子类;
  2. 用final修饰的方法不能被替换或隐藏:
  • 使用final修饰的实例方法在其所属类的子类中不能被替换(overridden);
  • 使用final修饰的静态方法在其所属类的子类中不能被重定义(redefined)而隐藏(hidden);
  1. 用final修饰的变量最多只能赋值一次,在赋值方式上不同类型的变量或稍有不同:
  • 静态变量必须明确赋值一次(不能只使用类型缺省值);作为类成员的静态变量,赋值可以在其声明中通过初始化表达式完成,也可以在静态初始化块中进行;作为接口成员的静态变量,赋值只能在其声明中通过初始化表达式完成;
  • 实例变量同样必须明确赋值一次(不能只使用类型缺省值);赋值可以在其声明中通过初始化表达式完成,也可以在实例初始化块或构造器中进行;
  • 方法参数变量在方法被调用时创建,同时被初始化为对应实参值,终止于方法体(body)结束,在此期间其值不能改变;
  • 构造器参数变量在构造器被调用(通过实例创建表达式或显示的构造器调用)时创建,同时被初始化为对应实参值,终止于构造器体结束,在此期间其值不能改变;
  • 异常处理器参数变量在有异常被try语句的catch子句捕捉到时创建,同时被初始化为实际的异常对象,终止于catch语句块结束,在此期间其值不能改变;
  • 局部变量在其值被访问之前必须被明确赋值;

关于final变量的进一步说明:

  1. 定义:blank final变量是其声明中不包含初始化表达式的final变量。
  2. 对于引用类型变量,final修饰符表示一旦赋值该变量就始终指向堆中同一个对象,不可改变,但是其所指对象本身(其状态)是可以改变的;不象C++中的const,在Java中没有办法仅通过一个final就可声明一个对象的不变性(immutability)。
  3. 常变量(constant variable):
  • 定义:常变量是用编译时常量表达式初始化的带有final修饰符的基本类型或字符串类型变量;
  • 无论静态变量还是实例变量,如果它是常变量,则其引用在编译时会被解析成该常变量所表示的值,在class文件中并不存在任何对常变量域的引用;也正是基于此,当在源代码中修改某个常变量域的初始值并重新编译后,该改动并不为其他class文件可见,除非对他们也重新编译。

final变量的初始化

共性:

  1. final在初始化之后,就不能再赋值了,也就是说,它们只能被赋值一次
  2. 一般情况下是定义时直接初始化如:
final int i=3;

但也可以定义时不初始化,叫blank final,如:

final int bi;

然后留待后面进行赋值。

但这因三种情况而不同:

1.普通auto变量(就是如方法中的局部变量):可以在其后的代码中赋值,但也可以不赋值。

final int i;//blank final
anything();
i=1;//在其后赋值。
i=3; //error!不可再次赋值

而成员变量必须被赋值,只是赋值的地方不同:

  1. 静态成员变量:
    静态成员变量必须在静态构造代码中初始化,
static final int s;
static { s=3;}//静态构造块
  1. 非静态成员变量:
    必须在构造函数中被赋值。如:
final int ai;
{ ai = 3; }//instance initializer
public Contructor(){ai=3;}//构造函数中
public Contructor(int in){ai=in;}//构造函数中

注意构造函数可以会有互相调用,注意在这过程中不要使变量被重复的赋值。

另外,如果变量是对象或数组这样的引用类型。则可以操作其对象或数组,但不可以改变引用本身:

final int [] array={1,2,3};//一个由三个数字组成的数组。
array[1]=9;//array == {1,9,3}
// array=new int[6]; error!

相关文章

网友评论

      本文标题:final关键字的用途

      本文链接:https://www.haomeiwen.com/subject/tywheqtx.html