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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毕影彬 中级黑马   /  2012-11-1 08:03  /  1591 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 毕影彬 于 2012-11-1 11:42 编辑

final int i;
这条语句,是不能定义在成员变量的地方。但是可以定义在方法内,并再赋予初值,是可以使用的。 有谁知道这里边的原理吗?{:soso_e181:}

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
final int i;

这条语句,可以定义在成员变量的位置,但是要在构造函数中显式赋值才可以。

final标记的成员变量必须在声明的同时或者在该类的构造方法中显式赋值,然后才能使用。

方法内的局部变量被final修饰后,相当于一个常量,可以被方法中的内部类访问。

不管是成员变量还是局部变量,被final修饰的变量都是常量,只能被赋值一次。

评分

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

查看全部评分

回复 使用道具 举报
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。
其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。

评分

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

查看全部评分

回复 使用道具 举报
张胜格 发表于 2012-11-1 11:13
当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改 ...

从来没这么写过代码, 突然被别人问到。 还真不知道可以在构造函数中初始化。{:3_60:}
回复 使用道具 举报
1.成员变量在对象创建时会被系统默认初始化。局部变量不会被默认初始化。
    而被final修饰的变量在内存中以常量形式存在。所以对成员变量需要显式的初始化。
如果没有显式的初始化,成员变量将在内存中始终以默认值存在。这样的成员变量失去了定义和实用的价值。
如 final  int a    a的默认值为0,在内存中一直为0,但是失去了定义a的意义和价值。
2.对于局部变量不会被默认初始化。所以可以以final int i这样的形式存在。
但是也只能被显式的赋值一次。
如 final  int  i;
     i =5; i 的值只能为5.

评分

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

查看全部评分

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