A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 古银平 中级黑马   /  2012-6-2 07:43  /  2293 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?搞不太清楚,举例说明下吧。

8 个回复

正序浏览
用final修饰的变量表示常量,只能被赋一次值。final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
假如将引用类型的变量用final修饰,那么该变量只能始终引用一个对象,但可以改变对象的内容。


public class FinalSample {

public int var;


public FinalSample(int var) {

this.var = var;

}


public static void main(String[] args) {

final FinalSample s = new FinalSample(1);

s.var = 2;

System.out.println(s.var);


// 出错,不能改变引用变量s所引用的FinalSample类的对象

// s=new FinalSample(2);

}

}


回复 使用道具 举报
1. 在定义的时候初始化。
2. final变量可以在初始化块中初始化,不可以在静态初始化块中初始化。
3. 静态final变量可以在静态初始化块中初始化,不可以在初始化块中初始化。
4. final变量还可以在类的构造器中初始化,但是静态final变量不可以。
5.finale修饰变量所有字母要大写    多字母由_连接
回复 使用道具 举报
楼主这个问题之前我也碰到过;  
使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改
变的。例如,对于如下语句:
final StringBuffer sBuffer=new StringBuffer("welcome");
执行如下语句将报告编译期错误:
sBuffer=new StringBuffer("");
但是,执行如下语句则可以通过编译:
sBuffer.append(" to heima");
有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:
public void method(final StringBuffer param)
{
}
实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

param.append("aaaa");

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
可以用于修饰类,修饰成员变量,成员方法。
                A:final修饰的类不能被继承。

                B:fainl修饰的成员方法不能被重写。

                C:final修饰的成员变量是一个常量。
               
        和变量声明的区别:final double PI = 3.14;
                A:多了一个关键字修饰。
                B:变量名大写。
                C:值不能被改变。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
使用final关键字修饰一个变量,就是说变量名与值之间连着一根线,断不了。当你调用变量名时,也就是调用他的值。该变量你现在就认为值就是该变量名,该变量名就是值。
回复 使用道具 举报
当然是引用引用不能变喽,
  1. public void method(final StringBuilder sb)
  2. {
  3.         sb.append("任然可以添加内容,但是sb引用不能改变");
  4. }
复制代码
这样你能明白吧

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1

查看全部评分

回复 使用道具 举报
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变,引用的对象属性值可以改变
回复 使用道具 举报
使用final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。final 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c:\\test.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。

评分

参与人数 1技术分 +1 收起 理由
袁錦泰 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马