Final关键字

final关键字的含义

        final表面意思就是不可更改的,衡量的意思;

        在java中final修饰的就是常量,而且变量名要大写:

        public static final double PI  = 3.14159265358979323846;


final的基本用法

        在java中,final关键字可以用来修饰变量,方法,类。

1)修饰变量

        被final修饰的成员变量必须要初始化(必须在定义时或者构造器中进行初始化赋值),赋值后不能再重新赋值。局部变量则是在使用之前必须对其赋值。

        对于一个final变量,如果是基本数据类型的变量,则数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再指向另外一个对象。

如:

Final关键字_第1张图片

        如果final修饰的变量是对象类型,那么不可更改指的是该变量不可以再指向别的对象,但是对象的值时可以更改的。

如:

Final关键字_第2张图片

2)修饰方法

        被final修饰的方法代表不能重写。

        注意:类的private方法会隐式地被指定为final方法。

3)修饰类

        被final修饰的类,不能被继承。

        注意:final类中所有成员方法都会被隐式地指定为final方法。

        在使用final修饰类的时候,要注意谨慎选择,除非这个类真的在以后不会用来继承或者 出于安全的考虑,尽量不要将类设计为final类。

        final不能修饰接口和抽象类!


final相关题目详解

        题目一:

Final关键字_第3张图片

        答案:

        大家可以先想一下这道题的输出结果。为什么第一个比较结果为true,而第二个比较结果为fasle。这里面就是final变量和普通变量的区别了,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。这种和C语言中的宏替换有点像。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的值。而对于变量d的访问却需要在运行时通过链接来进行。想必其中的区别大家应该明白了,不过要注意,只有在编译期间能确切知道final变量值的情况下,编译器才会进行这样的优化,比如下面的这段代码就不会进行优化:

Final关键字_第4张图片

        答案:


final和Static的区别

        static作用于成员变量用来表示只保存一份副本,final的作用是用来保证变量不可变。

        例如:

Final关键字_第5张图片

        输出为:

        运行结果,两次打印,j的值都是一样的,(j的值为myClass2生成的值),j是static类型的属于类,因此两次值相同。i不是static的因此属于对象,但是i的值是不可变的。

        简而言之:static修饰的属性所有对象都只有一个值,final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值。


static final

        static final和final static没什么区别,一般static写在前面。

        static修饰的属性强调它们只有一个,final修饰的属性表明是一个常数(创建后不能被修改)。static final修饰的属性表示一旦给值,就不可修改,并且可以通过类名访问。

        static final也可以修饰方法,表示该方法不能重写,可以在不new对象的情况下调用。

你可能感兴趣的