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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈从宾 中级黑马   /  2012-3-19 19:45  /  2505 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

10 个回复

倒序浏览
以前、具体怎样我也不太懂事看过下面的才懂的,也许 看了 过后你就也懂了
--   final 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c:\\test.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。形象的比喻:一个女子定义了一个final的老公,这个老公的职业和收入都是允许改变的,只是这个女人不会换老公而已。

点评

喜欢这个比喻。  发表于 2012-3-20 01:36

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
引用变量不能变,引用变量所指向的对象中的内容可以变
例如,对于如下语句:
final StringBuffer a=new StringBuffer("immutable");
执行如下语句将报告编译期错误:
a=new StringBuffer("");
但是,执行如下语句则可以通过编译:
a.append(" broken!");

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
用final修饰一个变量,是指这个变量得值不能变,如 final int NUM = 4; 这个NUM的值就一直都是4,不能再给它赋其它值了,不能再写 NUM = 6;之类的。
回复 使用道具 举报
魏昂 发表于 2012-3-19 19:50
以前、具体怎样我也不太懂事看过下面的才懂的,也许 看了 过后你就也懂了
--   final 对于常量来说,意味着 ...

明白了,您的意思是是指引用不可变,引用指向的内容是可变的,对吗?
回复 使用道具 举报
是的 下面这个例子就可以说明这一点
public class FinalEx
{
public static void main(String args[])
{
  final Student stu1=new Student(22,"Tom");
  Student stu2=new Student(25,"Jerry");
  //stu1=stu2;//出错,stu1指向的是new Student(22,"Tom")对象,不能改变
  System.out.println("stu1的name:"+stu1.sname+" stu1的age:"+stu1.sage);
  stu1.setSname("Jerry");
  stu1.setSage(25);
  System.out.println("stu1的name:"+stu1.sname+" stu1的age:"+stu1.sage);//这是stu1指向的对象发生了改变
}
}
class Student
{
    String sname;
    int sage;
public Student(int sage,String sname)
{
  this.sage=sage;
  this.sname=sname;
}
public void setSname(String sname)
{
  this.sname=sname;
}
public void setSage(int sage)
{
  this.sage=sage;
}
}
回复 使用道具 举报
魏昂 发表于 2012-3-19 20:10
是的 下面这个例子就可以说明这一点
public class FinalEx
{

明白,谢谢
回复 使用道具 举报
陈从宾 发表于 2012-3-19 20:15
明白,谢谢

要想定义个引用类型变量不被改变比如final String str="abc";可以用static+final
回复 使用道具 举报
final可以修饰类,函数,变量
1,被修饰的类不可以被继承,
2,被修饰的函数不可以重载,
3,被修饰的变量是常量,一旦被初始化不可以改变.
finally通常在处理异常结构中出现,一定需要执行的代码可以写在finally{}中
通常用于在处理数据库时关闭资源 .close()
回复 使用道具 举报
final可以修饰类、函数、变量。
1.被final修饰的类不可以被继承.
2.被final修饰的方法不可以被复写(也就是重写、覆盖).
3.被final修饰的变量是一个常量,只能赋值一次,final既可以修饰成员变量,又可以修饰局部变量.
使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
回复 使用道具 举报
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可以继承。
内部类要访问局部变量,局部变量必需定义成final类型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马