码迷,mamicode.com
首页 > 编程语言 > 详细

Java——final关键字

时间:2019-02-19 13:39:52      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:const关键字   不可   初始   前言   添加   语言   int   存储   告诉   

前言

Java中的关键字final的含义通常为“这是无法改变的”。下面将介绍final用于修饰数据、方法和类的这三种情况。

final数据

许多编程语言都有某种方法,来向告诉编译器这一块数据是不变的。有时候数据的恒定不变会很有用,比如编译时常量或者一个在运行时被初始化的值而你不希望改变它。对于编译期常量,编译器可以将该常量代入任何可能用到它的计算式中,也就是说,可以在编译时执行计算式,这将减轻运行时的负担。在Java中,常量必须是基本数据类型,以关键字final修饰,并且在定义的时候就必须为其赋值。一个既有static又有final修饰的域将占据一段不能改变的存储空间,这个域即表示编译时常量,也类似于C++中使用const关键字修饰的常量。

static final int MAX_NUM = 9999;    //默认既是static又是final修饰的域使用大写

当final修饰的不是基本数据类型而是对象的引用时,这时候要做好区分。当修饰基本数据类型时,是表示数值恒定不变;当修饰对象引用时,表示引用恒定不变。即,一旦引用初始化执行一个对象后,便不可以使它指向另外一个引用。但是所指向的对象自身确实可以被改变的。

空白fiinal

空白final是指声明为final但又未给定初始值的域。但是,无论在什么情况下,编译器都得确保空白final在使用前必须被初始化。空白final在关键字final的使用上提供了更大的灵活性,一个类中的final域就可以根据对象而有所不同,但又保持其恒定不变的特性。

空白final要在使用前确保被初始化,那么怎么才能确保呢?看下面这个简单的例子(《Java编程思想》)就可以明白:

class Poppet{
    private int i;
    Poppet(int ii){ i = ii;}
}

public class BlankFinal{
    private final int i = 0;    //在定义时就初始化
    private final int j;    //空白final
    private final Poppet p; //空白final引用
    public BlankFinal(){    //在构造器中必须初始化空白final域或引用
        j = 1;
        p = new Poppet(1);
    }
    public static void main(String args[]){
        new BlankFinal();
    }
} 

确保在使用空白final之前将其初始化的手段在于:必须在域的定义处或者每个构造器中用表达式对final进行赋值。

final参数

在参数列表中使用final去修饰参数,将意味着你在方法中将无法更改参数引用所指向的对象。

final方法

使用final方法的原因有两个。第一个是将方法锁定,以防止任何继承类修改它的含义。这是出于设计的考虑:想要确保在继承中使用方法行为保持不变,并且不会被覆盖。第二个原因是效率,但是在Java SE5/6后,都应该让编译器和JVM处理效率问题。因此,只有要明确禁止覆盖时,才将方法设置为final的。

final和private关键字

类中所有的private方法都隐式地指定为final的。由于无法取用到private方法,所以也就无法覆盖它。可以给private方法添加final修饰词但是这并没有任何意义。

final类

当将某个类整体定义为final时,就表明你不想该类被继承,该类就是一个终结类。final类中的所有方法都隐式地指定为final的,因此无法覆盖它们。

小结

本篇博文简要记述了Java的final关键字的使用,注意使用细节问题。

参考:
《Java编程思想》第四版

Java——final关键字

标签:const关键字   不可   初始   前言   添加   语言   int   存储   告诉   

原文地址:https://www.cnblogs.com/myworld7/p/10400067.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!