《Thinking in Java》——final关键字

final成员变量——不能被改变

  • static final 修饰的变量是编译时变量,它只能是基本数据类型,由于final变量必须在使用前进行初始化,所以必须在定义时赋值(不new新对象时,不会调用构造器,所以在构造器中赋值就会失效,所以必须在定义时赋值),编译时变量会在编译时被带入计算式(如果可能的话是这样,但是变量如果是由其他方法产生,比如说随机生成,这就要在运行时才能知道变量的值);编译时变量在内存中只占据一段不可更改的存储空间。

  • final成员变量:有几个对象,就会有几个final成员变量,但每个对象中的final成员变量是不可以更改的。

  • static fianl:只有一个(因为是static的),不可更改。

  • fianl修饰对象时,引用不可变,对象可变。

空白final

  • 空白fianl:被声明为fianl但未给定初始值的域(没有static修饰哦!static final必须在定义时初始化
public class BlankFinal {
    private final int i = 0;
    private final int j;//空白final
    private final int OtherClass other;//空白final
    public BlankFinal() {
        j = 1;  //初始化空白final
        ohter = new OtherClass(); //初始化空白final
    }   
}
  • 空白fianl需要在域外或者构造器中初始化,因为final域必须在使用前进行初始化。

final参数

  • 方法中的final参数,不能在方法中更改它们的值。
//int f(final int i){return i++;} //错误! 改变了i本身的值
int f(final int i){return i + 1;} //正确! i的值没有被改变

final方法——不能被覆盖

  • 使用final方法的原因:

    • 将方法锁定,不允许子类重写此方法
    • 提高效率(内嵌调用),但是现在不通过这个方法来提高效率了
  • 声明为private的方法隐式的被指定为final的,因为不能被访问,也就不能被覆盖了。如果子类中有一个与基类private方法同名的方法,那它是一个新方法,并没有对private方法进行重写。

final类——不能被继承

  • final类中的方法隐式的被指定为final的(因为final类不能被继承,也就不能对它的方法进行重写)
  • final类中的成员变量可以自定义权限
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值