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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
在java语义中final 表示“无法改变的”,但是我在给一个对象用final修饰后,其属性还是可以改变的

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

10 个回复

倒序浏览
本帖最后由 esirong 于 2013-2-24 18:39 编辑

final修饰符
    final的意思是不可变,他可以修饰类、字段、方法。
修饰类后类不能被扩展(extends),也就是不能被继承。
修饰字段后字段的值不能被改变,因此如果有final修饰字段,应该对字段进行手动初始化。即赋值
修饰方法后该方法不能被改变,也就是不可重写。
希望可以帮到你。

回复 使用道具 举报
final修饰的对象的值,和String类定义的对象应该是一样的.
字符串的值一旦确定,其值不可改变,但是String定义的引用,可以随意更改指向.
final定义的成员属性其值不可改变,如果你的成员属性全部final了.你的对象能改吗?
java 的面向对象的思想是根据现实中事物来的.一般我们使用的对象.都不会final化,因为可变化性.
回复 使用道具 举报
当给一个对象用final修饰后,不可以改变的是这个对象的引用,java没有提供使对象恒定不变的途径



回复 使用道具 举报
李培根 来自手机 金牌黑马 2013-2-24 18:37:04
报纸
是引用不可变,值还是可以改变的。
回复 使用道具 举报
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,
但对于引用类型变量而言,它保存的仅仅是一个引用,final只保证这个引用类型变量所引用的地址不会改变,即一直引用同一个对象,但这个对象完全可以发生改变。
举个例子:
  1. class Person
  2. {
  3.         private int age;
  4.         public Person(){}
  5.         //有参数构造器
  6.         public Person(int age)
  7.         {
  8.                 this.age = age;
  9.         }
  10.         //省略age Field的setter和getter方法
  11.         //age Field的setter和getter方法
  12.         public void setAge(int age)
  13.         {
  14.                 this.age = age;
  15.         }
  16.         public int getAge()
  17.         {
  18.                 return this.age;
  19.         }
  20. }
  21. public class FinalReferenceTest
  22. {
  23.         public static void main(String[] args)
  24.         {
  25.                 //final修饰数组变量,iArr是一个引用变量
  26.                 final int[] iArr = {5, 6, 12, 9};
  27.                 System.out.println(Arrays.toString(iArr));
  28.                 //对数组元素进行排序,合法
  29.                 Arrays.sort(iArr);
  30.                 System.out.println(Arrays.toString(iArr));
  31.                 //对数组元素赋值,合法
  32.                 iArr[2] = -8;
  33.                 System.out.println(Arrays.toString(iArr));
  34.                 //下面语句对iArr重新赋值,非法
  35.                 //iArr = null;
  36.                 //final修饰Person变量,p是一个引用变量
  37.                 final Person p = new Person(45);
  38.                 //改变Person对象的age Field,合法
  39.                 p.setAge(23);
  40.                 System.out.println(p.getAge());
  41.                 //下面语句对p重新赋值,非法
  42.                 //p = null;
  43.         }
  44. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报 1 0
新手解答:  在我看来引用是变量名,变量名自然不能变,但是可以把这个变量名代表的引用赋给另一个引用。

final修饰后只能赋值一次,也就是你说的对象复制后就不能再变了。

也不可以变换属性。例如
                int x = 0;
                System.out.println(((double)x));
                System.out.println(x);
输出结果是
0.0
0

回复 使用道具 举报
张宁 中级黑马 2013-2-24 19:12:26
8#
final 根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

  final类不能被继承,没有子类,final类中的方法默认是final的。

  final方法不能被子类的方法覆盖,但可以被继承。

  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  final不能用于修饰构造方法。

回复 使用道具 举报
冯佩 中级黑马 2013-2-24 19:42:51
9#
 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
回复 使用道具 举报
//final修饰基本数据类型变量时,只能赋值一次,再赋重值也不行,变量的值是不可改变的,修饰引用数据类型对象时对象的地址是
//不可变的,但对象中的成员属性可变。
class AboutFinal{
        //定义属性,默认、显示初始化都不赋值,而在构造方法中赋值。
        final int var ;
        //{this.age = 5;}加上该句将报错

        //无参构造
        AboutFinal(){
                var = 0;
                System.out.println("无参构造 var = "+var);
        }
        //有参构造
        AboutFinal(int var){
                this.var = var;
                System.out.println("有参构造 var = "+var);
        }
        public static void main(String args[]){
                AboutFinal af = new AboutFinal();
                af = new AboutFinal(10);
        }
}
回复 使用道具 举报
嗯,5楼讲的很有道理!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马