使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?| Java Debug 笔记

279 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

使用 final 关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

final StringBuffer s = new StringBuffer("xcbeyond");

执行如下语句将报告编译期错误:

s = new StringBuffer("xcbeyond1");

但是,执行如下语句则可以通过编译:

 a.append(" hello!"); 

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param) {

}

实际上,这是错误的,因此,final不能修饰方法中的参数。倘若能够修饰,则违背了final修饰变量不能修改这一原则。在该方法内部仍然可以增加如下代码来修改参数对象: param.append("a");

final回顾:

  1. final 修饰的变量,其引用变量是不可以改变的,而其引用变量指向对象的内容却是可以改变哦!正如此笔试题所述。

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

  • Java 的 String 就是 final 类,不能被继承!Math 也是 final

  • 在实际项目开发中,原则上不允许使用final类!如:Spring,Hibernate,Struts 2,这些框架经常动态代理(动态继承)技术。使用final的类可以造成这些框架的工作  问 题。

  1. final修饰的方法,不能再被覆盖。

在实际项目开发中,原则上不允许使用 final方法!

  1. final 修饰的变量,初始化以后不允许再修改。

  2. final static , java使用 final static 修饰的变量作为一般要求变量名都有大写字母。