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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小狼 中级黑马   /  2013-8-21 22:26  /  1553 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?为什么有些程序里也可以给被final修饰的变量赋值呢?
  1. public class Test
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.        final int[] Arr={5,6,12,8};
  6.        Arr[2]=-8;
  7.        System.out.println(Arr[2]);
  8.     }
  9. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

5 个回复

倒序浏览
引用变量不能变,引用变量所指的对象中的内容是可以改变的...
回复 使用道具 举报
final修饰的变量是一个常量。只能被赋值一次。
final修饰成员变量,必须初始化,初始化有两种
1,显示初始化//final int NUM = 15;
2,构造函数初始化//final int NUM;然后通过构造函数初始化
但是不能两个一起初始化,你看到的赋值应该是第二种。
回复 使用道具 举报
本帖最后由 王广亚 于 2013-8-22 08:31 编辑

被final修饰的变量只能赋值一次,对于本程序来说也就是数组arr的地址值不能变。
  1. public class Test
  2.     {
  3.         public static void main(String[] args)
  4.         {
  5.                 int[] arr1={2,3,4,5};
  6.            final int[] Arr={5,6,12,8};
  7.            Arr=arr1;//如果这样赋值的话就报错了
  8.            Arr[2]=-8;
  9.            System.out.println(Arr[2]);
  10.         }
  11.     }
复制代码
回复 使用道具 举报 1 0
本帖最后由 forward 于 2013-8-22 16:36 编辑

final可以修饰成员变量,也可以修饰局部变量、形参。final变量一旦获得初始值之后,final的变量就不能被重新赋值。
   成员变量是随类初始化或对象初始化而初始化的,当执行静态初始化块时候可以对类属性进行赋初始值,当执行普通初始化块或者构造器的时候可以对实例属性赋初始值。因此成员变量的初始值可以在定义的时候赋值或者在初始化块、构造器中指定。
   对于final修饰的成员变量而言,一旦有了初始值之后,就不能被重新赋值,因此不可以在普通方法中对成员变量赋值。要么在定义的时候赋值,要么在方法块和构造器中赋值。
   final成员变量,必须由程序员显示初始化,系统不会对final成员进行隐式初始化。

   final修饰局部变量时既可以在定义时候指定默认值,也可以不指定,在后面指定,但只能一次。
   final修饰基本类型的时候 变量不能改变
final修饰引用类型变量,final只保证这个引用的地址不变,即一直引用同一对象。但这个对象可以改变。


上面是找到的资料:
总结就是:final修饰的基本类型的变量:只要赋给了值,其值就不能呗改变
               final修饰的是引用变量,只要其引用地址没有变,其对应的值是可以改变的,(就和你说的数组就是引用类型)


public static void main(String[] s) {                final int[] Arr = { 5, 6, 12, 8 };//引用类型,其值是可以改变的            
        Arr[2] = -8;      
     System.out.println(Arr[2]);        
     final int num=1;//基本类型,其值是不可以变的      
//num=10;//num 有了初值,不能更改   
   final ArrayList list=new ArrayList();//集合是引用类型,所以其中元素的值是可以改变的     
   list.add(1);   
     list.add(2);   
    System.out.println(list);   
    list.set(0, 0);     
   System.out.println(list);     
   }
结果:
-8
[1, 2]
[0, 2]
希望对你有帮助



回复 使用道具 举报
forward 发表于 2013-8-22 16:35
final可以修饰成员变量,也可以修饰局部变量、形参。final变量一旦获得初始值之后,final的变量就不能被重 ...

哈哈!谢谢啦!很详细啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马