java中final的位置,java中final关键字介绍

本文详细介绍了Java中的final关键字,包括final变量、final参数和final方法的使用。final变量一旦初始化便不可改变,final方法不能被子类覆盖,而final类则不能被继承。此外,还探讨了final在效率和代码安全上的考量。同时,提到了空白final的特性,即未初始化的final变量必须在构造函数中完成初始化。
摘要由CSDN通过智能技术生成

Final关键字

(1)final成员

final数据

当在类中定义变量时,在前面加上final关键字,那边是说,这个变量一旦初始化便不可改变,这里的不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,但引用变量所指向的对象中的内容还是可以改变的。例如:

例如,对于如下语句:

final StringBuffer a=new StringBuffer("immutable");执行如下语句将报告编译期错误:

a=new StringBuffer("");但是,执行如下语句则可以通过编译:

a.append(" broken!");

final参数

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

例如:

public void method(final int i)

{

retrun i+1;

}

public void method(final StringBuffer param)

{

param.append("a");

}

final空白

java允许“生成空白final”,所为空白final是指被被声明为final但有未给定初值的域。

其初始化可以在两个地方,一是其定义处,也就是在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一。

例如:

package mstest;

class Poppet {

private int i;

public Poppet(int ii) { i = ii; }

}

public class BlankFinal {

private final int i = 0; //定义时初始化

private final int j; //空白final

private final Poppet p; //空白final引用

//空白finals必须在构造器中初始化

public BlankFinal() {

j = 1;

p = new Poppet(1);

}

public BlankFinal(int x) {

j = x;

p = new Poppet(x);

}

public static void main(String[] args) {

new BlankFinal();

new BlankFinal(23);

}

}

(3)final方法

使用final方法有两个原因:第一,(主要是正对继承来说的)把方法锁住,防止任何继承类修改它的含义,即说明该方法提供的功能已经满足你的要求,不需要进行扩展,并且不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也即是说可以直接使用。第二,效率。在java早期实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的所用调用都转为内嵌调用。也即所说的inline机制,他会是你在调用final方法时,直接将方法的主题插入到调用处,而不是进行例行的方法调用,例如存断点,压栈等,这样可能会使你的程序效率有所提高,然而,当你的方法主体非常庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而会影响效率,所以要慎用final进行方法定义。

注意:类中所有的private方法都隐式地指定为final的。由于无法取用private方法,所以也就无法覆盖它。可以对private方法添加final’修饰词,但这并不能给该方法增加任何额外的意义。

(3)final类

将某个类整体定义为final是,就表明该类无法被继承,换句话说,处于某种考虑,你对该类的设计用不需要做任何改动,或者处于安全考虑,你不希望他有子类。这样,final类中所有的方法都隐式指定为final的,因为无法覆盖他们。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值