广州北大青鸟计算机职业培训学校
互联网技术培训、软件技术培训、大数据培训、云计算培训、数据分析培训信息网
当前位置:网站首页 > 计算机教程 > 正文

Java编程中的final使用方法

作者:adminjiang发布时间:2021-07-09分类:计算机教程浏览:965


导读:final关键字在java中,final的含义在不同的场景下有细微的差别,但总体来说,它指的是"这是不可变的".下面,我们来讲final的四种主要用法.1.修饰...

final关键字

在java中,final的含义在不同的场景下有细微的差别,但总体来说,它指的是"这是不可变的".下面,我们来讲final的四种主要用法.

1.修饰数据

在编写程序时,我们经常需要说明一个数据是不可变得,我们称之为常量,在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生命周期内不可以改变它的值.更重要的是,final会告诉编辑器,这个数据是不会修改的,那么编译器就可能会在编译时期就对该数据进行替换甚至执行计算,这样可以对我们的程序起到一点优化.不过在针对基本类型和引用类型时,final关键字的效果存在细微差别.

我们来看下面的例子:

class Value {
    int v;
    public Value(int v) {
        this.v = v;
    }
}
public class FinalTest {
    
    final int f1 = 1;
    final int f2;
    public FinalTest() {
        f2 = 2;
    }
    public static void main(String[] args) {
        final int value1 = 1;
        // value1 = 4;
        final double value2;
        value2 = 2.0;
        final Value value3 = new Value(1);
        value3.v = 4;
    }
}

在上面的例子中,我们先看一下main方法中的几个final修饰的数据,在给value1赋初始值之后,我们无法对value1进行修改,final关键字起到了常量的作用.从value2我们可以看到,final修饰的变量可以不再声明时赋值,即可以先声明,后赋值.value3是一个引用变量,这里我们可以看到final修饰引用变量时,只是限定了引用变量的引用不可以改变,既不是将value3再次引用另一个value对象,但是引用的对象的值是可以改变的,从内存模型中我们看的更加清晰:

从上面,final修饰的值是用粗线条的边框表示它的值是不可改变的,我们知道引用变量的值实际是它的引用的地址,也就是说该地址的值是不可改变的,从而说明了为什么不可以改变引用变量.而实际引用的对象实际上是不受final关键字的影响的,所以他的值是可以改变的.

另一方面,我们看到了用final修饰成员变量时的细微差别,因为final修饰的数据的值是不可改变的,所以我们必须确保在使用前就已经对成员变量赋值了.因此对于final修饰的成员变量,饿哦们有且只要两个地方可以给它赋值,一个声明该成员变量时赋值,另一个是在构造方法中赋值,在这两个地方必须给它们赋初始值.

最后我们需要注意的一点是,同时使用static和final修饰的成员在内存中只占据一段不能改变的存储空间.

2.修饰方法参数

前面我们可以看到,如果变量是我们自己创建的,那么使用final修饰表示我们只会给它赋值一个且不会改变变量的值.那么如果变量是做参数传入的,我们怎么保证他的值不会改变呢?这就用到了final的第二种用法,即在我们编写方法时,可以在参数前面添加fianl关键字,它表示在整个方法中,饿哦们不会(实际上是不能)改变参数的值:

public class FinalTest {
    /* ... */

    public void finalFunc(final int i, final Value value) {
        // i = 5; 不能改变i的值
        // v = new Value(); 不能改变v的值
        value.v = 5; // 可以改变引用对象的值
    }
}

3.修饰方法

第三种方式,即使用final关键字修饰方法,它表示该方法不能被覆盖,这种使用方法主要从设计的角度考虑,即明确告诉其他继承该类的程序员,不希望它们去覆盖这个方法.这种方式我们很容易理解,然而,关于private和final关键字还有一些联系,这就是类中所有的private方法都隐示地指定为final的,由于无法在类外使用private方法,所以也就无法覆盖它

4.修饰类

了解了final关键字的其他用法,我们很容易可以想到使用final关键字修饰类的作用,那就是用final修饰的类是无法被继承的。

上面我们讲解了final的四种用法,然而,对于第三种和第四种用法,我们却甚少使用。这不是没有道理的,从final的设计来讲,这两种用法甚至可以说是鸡肋,因为对于开发人员来讲,如果我们写的类被继承的越多,就说明我们写的类越有价值,越成功。即使是从设计的角度来讲,也没有必要将一个类设计为不可继承的。Java标准库就是一个很好的反例,特别是Java 1.0/1.1中Vector类被如此广泛的运用,如果所有的方法均未被指定为final的话,它可能会更加有用。如此有用的类,我们很容易想到去继承和重写他们,然而,由于final的作用,导致我们对Vector类的扩展受到了一些阻碍,导致了Vector并没有完全发挥它应有的全部价值。


广州北大青鸟依托北京大学雄厚资源,是北大青鸟华南地区就业示范校区,学校提供学历+技能+就业服务,主要开设热门课程java培训,UI设计培训,PHP培训,Web前端培训,软件开发编程培训等全程项目实战,免费就业推荐等,详情请点击右边的咨讯框咨询在线的老师,同时还可以获取免费的试听课程,欢迎咨询哦!!!

 



计算机教程排行
标签列表
网站分类
文章归档
最近发表