final关键字的问题

liumingwei2009 2009-10-14 05:40:40
先向大家推荐一个帖子,http://topic.csdn.net/u/20081028/17/f2993356-f89b-4dde-a94f-9ec5821c5ac3.html
final变量(常量)
用final修饰的成员变量表示常量,值一旦给定就无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。


这是我看那个final关键字总结的时候发现的一句话。
我测试它的正确性时发现了如下的问题,大惑不解中。。。。。。。。

首先在构造方法中赋初值,编译通过了。
public class A {
final int E;
A(int x) {
E = x;
}
}

然后我想声明后立刻赋初值,编译出错。
public class A {
final int E;
E = 10;
}


我以为一定要在某个方法中赋初值,可是还是错了。
public class A {
final int E;
void f(int x) {
E=x;
}
}


那么如此说来,是不是非要在构造方法中赋初值,然后实现让不同的对象的赋初值,那是不是上面的教程要改一下。
...全文
127 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayqean 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 softcarrier 的回复:]
如果定义一个final成员变量没有赋值,那么在构造方法中就一定要赋值;那么如果定义一个成员变量时就直接赋值,那么最好把它定义为 static final ,这样可以节省空间。

Java codepublicclass A {finalint e;//没有赋值,构造中如果还不赋值就…… A(int x) {
e= x;
}
}publicclass A {staticfinalint e=5;
}
[/Quote]
有道理
softcarrier 2009-10-14
  • 打赏
  • 举报
回复
如果定义一个final成员变量没有赋值,那么在构造方法中就一定要赋值;那么如果定义一个成员变量时就直接赋值,那么最好把它定义为 static final ,这样可以节省空间。

public class A {
final int e; //没有赋值,构造中如果还不赋值就……
A(int x) {
e = x;
}
}

public class A {
static final int e = 5;
}
专注or全面 2009-10-14
  • 打赏
  • 举报
回复
final类型的变量可以直接赋值,也可以在构造函数中复制,如果有多个构造函数的话(构造函数重载),每个构造函数中都要初始化(赋值)!!!
likeyver 2009-10-14
  • 打赏
  • 举报
回复
首先,第二个例子是不能用的,正如二楼所说,这是错误的变量声明及赋值。
其次,会不会有编译错误,关键在于这个常量有没有在类的对象生成时,就会被分配内存并赋值。
例如,第一个例子中在构造方法中赋值,是可以的,但是如果你在增加一个不同参数的构造方法,给它赋值,应该也是可以的。同样的原因,因为这个方法在new对象时,不同分配内存及赋值,所以在非static的方法中,是不能赋值的。
最后,教材上的东西不能全信。我现在学习,也是准备了三分教材,而且,其中一个说,不要相信教材,如果非要相信什么的话,就相信Java自带的帮助文档。尽量多去考虑为什么,多从本质上考虑,而不是,简单的理解。
bigbro001 2009-10-14
  • 打赏
  • 举报
回复
一个容易被忽略的问题...

public class A {
final int E;
E = 10; //第一个问题出在这里,类的成员变量(包括final的常量),要么必须在声明时同时赋值
//要么就要在构造器中赋值,不可以脱离于声明单独赋值
}



public class A {
final int E;
//第二个问题在于,定义一个可以修改fianl的成员变量值的方法,违背了final的本意,无法通过编译
void f(int x) {
E=x;
}
}
mctdhenry08409 2009-10-14
  • 打赏
  • 举报
回复
原因很简单:
为了保证在使用前初始化的顺利完成,final必须在域的定义处或每个构造器中用表达式赋值
amdgaming 2009-10-14
  • 打赏
  • 举报
回复
只能赋值1次。
mouer 2009-10-14
  • 打赏
  • 举报
回复
public class A {
final int E;
{
E = 10;
}
}

is ok!
justformygame 2009-10-14
  • 打赏
  • 举报
回复
lz说得基本正确
final变量,需要在构造完成前初始化
swandragon 2009-10-14
  • 打赏
  • 举报
回复
finale int E = 0;
这样可以
final int E;
E = 10;
这样不可以,E = 10是错误的语法,不单是final变量,其他类型的变量也一样

在方法里赋值也不行,因为方法可以被多次调用
justinavril 2009-10-14
  • 打赏
  • 举报
回复
不是啊 final修饰的变量可以在任何地方赋值,但是只能赋值1次。

通常,习惯在构造方法里初始化一些变量,但绝对不是只能在构造方法中去赋值。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧