当前位置 主页 > 网站技术 > 代码类 >

    Java基于final修饰数据过程解析

    栏目:代码类 时间:2019-12-18 12:06

    这篇文章主要介绍了Java基于final修饰数据过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    final是Java中的一个重要关键字,它可以修饰数据、方法和类,本篇将从final修饰的数据角度对final做出总结。

    final修饰的数据代表着:永远不变。意思是,一旦你用final修饰一块数据,你之后就只能看看它,你想修改它,没门。
    我们不希望改变的数据有下面两种情况:

    永不改变的编译时常量。

    //编译时知道其值
    private final int valueOne = 9;

    在运行时(不是编译时)被初始化的值,且之后不希望它改变。

    //在编译时不能知道其值
    private final int i4 = rand.nextInt(20);

    设置成常量有啥好处呢?

    很简单,让编译器觉得简单,就是最大的好处。比如把PI设置成final,且给定值为3.14,编译器自然会觉得这个东西不会再被修改了,是足够权威的。那么,编译器就会在运行之前(编译时)就把这3.14代入所有的PI中计算,这样在真正运行的时候,速度方面当然会快一点。

    有初始值的final域

    即声明为final且当场就给定初始值的域。

    private final int valueOne = 9;

    final+基本数据类型

    final修饰的基本数据类型变量存储的数值永恒不变。

    /*基本类型变量*/
    //带有编译时数值的final基本类型
    private final int valueOne = 9;
    private static final int VALUE_TWO = 99;
    public static final int VALUE_THREE = 39;
    //!false:fd1.valueOne++;
    //!false:fd1.VALUE_TWO++;
    //!false:fd1.VALUE_THREE++;

    康康上面醒目的三句false语句,很好地印证了我们之前说的:数值不让改!!!

    需要注意的是,按照惯例,下面是定义常量的典型方式:

    //典型常量的定义方式
    public static final int VALUE_THREE = 39;
    public修饰符使其可被用于包之外。 static使数据只有一份。 final表示其无法被更改 名称全为大写英文字母,以下划线隔开。

    final+引用数据类型

    我们之前说过,基本类型存数值,引用类型存地址值。那么既然final+基本数据类型不让改数值,聪明的我们稍微一联想就明白,final+引用数据类型就是不让你改变量存储实际对象的地址值啦。(也就是不能再让它指向新的对象,很专一)

    private Value v1 = new Value(1);
    private final Value v2 = new Value(22);
    private static final Value V_3 = new Value(333);
    //引用变量并不是常量,存储地址可以改变
    fd1.v1 = new Value(10);
    
    //v2是引用变量,final修饰之后表示地址不能改变,但是实际对象的值是可以改变的
    fd1.v2.i++;
    //!false:fd1.v2 = new Value(3);
    
    //V_3与v2类似,是静态和非静态的区别,下面会说明
    fd1.V_3.i++;
    //!false:fd1.V_3 = new Value(10);
    }

    通过例子,确实也证明上面所说,一个以final修饰的引用数据类型变量,无法再指向一个新的对象,因为它所存储的地址值已经无法被更改,但是并不影响它指向的实际对象。就拿一个比较典型的引用类型来举例,我们知道数组就是一种典型的引用类型,数组的引用变量存储的是数组再堆中的地址,堆中存放的就是数组每个索引的数值。

    /*引用变量之数组*/
    private final int[] a = {1,2,3,4,5,6};

    引用变量a被指定为final,所以它里面的地址值不能再改,也就无法再让它指向一个新的数组。