黑马程序员技术交流社区

标题: 为什么final static修饰的变量不能构造函数里初始化? [打印本页]

作者: lonely_zb    时间: 2013-9-14 19:52
标题: 为什么final static修饰的变量不能构造函数里初始化?
本帖最后由 杨增坤 于 2013-9-14 22:37 编辑

package com.dd;
public class ConstructFinalTest {


private static final String name = "lisi";

public ConstructFinalTest(String name){
  
  this.name= name;
  
  
}
}


编译不能通过...哪位能给个详细的说明吗?

QQ截图20130914195126.png (38.01 KB, 下载次数: 113)

QQ截图20130914195126.png

作者: 张文豪    时间: 2013-9-14 20:01
本帖最后由 张文豪 于 2013-9-14 20:03 编辑

对于final修饰的成员变量而言,一旦有了初始值,就不能重新赋值,
因此不可在普通方法中对成员变量重新赋值,
成员变量只能在定义该变量时指定默认值
你的private static final String name = "lisi";final修饰的 name已经有了初始值了,所以后面不能赋值。
this.name= name;这句编译当然不能通过


作者: 毋须繁华    时间: 2013-9-14 20:16
final:最终
final修饰变量叫做最终变量
final变量必须赋初始值
final变量不能修改值

final也可以用于修饰方法内的变量
final修饰的变量只能被赋值一次

作者: 晓天s    时间: 2013-9-14 20:27
final static修饰的是变量属于类变量,在类已加载的时候就会初始化,而构造函数修饰的是面向对象的,只能对实例变量进行修改,而final修饰的变量必须初始化,一旦初始化将不可被修改!!
作者: 光脚丫的小白兔    时间: 2013-9-14 20:28
1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用. 如果属性被修饰为static静态类资源,那么这个字段永远只有一个,也就是说不管你new test()多少个类的对象,操作的永远都只是属于类的那一块内存资源.final 用于声明属性,方法和类,分别表示属性一旦被分配内存空间就必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。 b.在构造函数里初始化4.同时被final和static修饰的类的属性变量只能在两种情况下初始化: b.在类的静态块里初始化
作者: Yuan先生    时间: 2013-9-14 20:36
给变量加final修饰就是不让它再改变,final变量的初始值就是最终值,当然会编译错误
作者: 周文斌    时间: 2013-9-14 21:52
private static final String name = "lisi";
String属于复合数据类型,String name意思是声明一个 叫做name,只能引用String类型的对象的内存空间首地址的引用变量。

final String name 则是规定了name引用变量中所存的地址值 是“最终”值,即只能一次赋值,不能更改。

final修饰符将使修饰的变量视作 常量 。

所以你编译才会报错啦~~~~
作者: 赵凯    时间: 2013-9-14 22:00
被final修饰的变量叫做最终变量,被初始化值之后就不能被改变,只能赋值一次
你这个this.name=name,就是给已经被final修饰的name进行赋值,当然不能编译通过了
作者: lizhangzhi    时间: 2013-9-14 22:15
被final修饰的叫做最终变量,也就是常量,一旦赋值,不能修改,构造函数里的参数要求的是变量。
作者: 杨增坤    时间: 2013-9-14 22:35
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]
希望对你有帮助


作者: wrswuxiaoyan    时间: 2013-9-15 13:17
亲,变量只要是加了final修饰符的,就不能被重新赋值了!好好听听毕老师讲的final关键字的用法哦!
作者: yanglfree    时间: 2013-9-17 00:02
final修饰的相当于常量,是不能被改变的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2