final关键字的用途

2019-02-13  本文已影响0人  宋雾代

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

基本规则

  1. 用final修饰的类不能被扩展,也就是说不可能有子类;
  2. 用final修饰的方法不能被替换或隐藏:
  1. 用final修饰的变量最多只能赋值一次,在赋值方式上不同类型的变量或稍有不同:

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

  1. 定义:blank final变量是其声明中不包含初始化表达式的final变量。
  2. 对于引用类型变量,final修饰符表示一旦赋值该变量就始终指向堆中同一个对象,不可改变,但是其所指对象本身(其状态)是可以改变的;不象C++中的const,在Java中没有办法仅通过一个final就可声明一个对象的不变性(immutability)。
  3. 常变量(constant variable):

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!
上一篇 下一篇

猜你喜欢

热点阅读