java的final变量只能赋值一次_关于swing:无法为java中的“final”变量赋值

private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)

{

final int c=0;

final JDialog d=new JDialog();

JLabel l=new JLabel("Enter the Element :");

JButton but1=new JButton("OK");

JButton but2=new JButton("Cancel");

final JTextField f=new JTextField(10);

JPanel panel = new JPanel();

but1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

c=Integer.parseInt(f.getText());

d.setVisible(false);

d.dispose( );

}

});

but2.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent e){

d.setVisible(false);

d.dispose( );

}

});

}

我使用的是NetBeans 7.1.1。这是我在这里的代码,我已经将"c"声明为"final int",但是行"c=integer.parseint(f.getText())";"I am getting an error"不能为最终变量赋值。如果我从声明中删除单词final并使其与"int c"相同,那么在同一行中,我会得到一个错误"局部变量c不能从类中访问;需要声明为final"。有人能告诉我为什么会这样吗?

复制品

@Markotopolnik不,这个被标记为"摇摆":p

在函数中声明了C,然后在该函数中创建了一个匿名的内部类。这个内部类,即actionListener,在您的函数终止后仍然存在,所以它不能将值赋给C,因为C是该函数的本地类。

关于"final"的警告是误导性的——这只是编译器告诉您不能从匿名类访问瞬态局部变量。不能只通过使C成为final来解决这个问题,因为这会阻止对它进行任何赋值,但是可以使C成为pushButtonActionExecuted类的实例成员。像这样:

class Something

{

int c;

private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)

{

JButton but1=new JButton("OK");

but1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

c=Integer.parseInt(f.getText());

}

});

}

}

"您不能从匿名类访问瞬态局部变量"的语句是错误的。最后一个变量不能分配给它也是错误的。如果这是真的,就不会有最终的VaR,因为它是无用的。实际上正在进行的是创建一个闭包,它在匿名类声明范围内关闭变量。Java仅具有限制,只能在最终VAR上关闭。这是为了保持螺纹安全。

您的代码示例是错误的,因为您没有关闭,所以匿名类的所有实例都将共享相同的int。

除了马尔科的仇恨,这是一个很好的解释,解决了我的问题。两个大拇指

我将跳过原因,直接讨论解决方案:使用

final int[] c = {0};

...

c[0] = Integer.parseInt(f.getText());

有关完整的故事,请参阅本帖。

我尝试了这么多的解决方案,只有这个技巧奏效了。我的变量在AsyncTask外部自定义类中。+ 1

原因是,虽然C[]数组的地址是用final关键字强制设置的常量,但其内容不是:它们是可变的。我投赞成票。

but the line"c=Integer.parseInt(f.getText());" i am getting an error"cannot assign a value to a final variable

正确的。final变量的全部意义是,您只能给它们赋值一次,但您试图给它赋值两次(在初始化时,将它设置为0一次,在引用的行中)。根据规范:

A variable can be declared final. A final variable may only be assigned to once. Declaring a variable final can serve as useful documentation that its value will not change and can help avoid programming errors.

It is a compile-time error if a final variable is assigned to unless it is definitely unassigned (§16) immediately prior to the assignment.

A blank final is a final variable whose declaration lacks an initializer.

Once a final variable has been assigned, it always contains the same value. If a final variable holds a reference to an object, then the state of the object may be changed by operations on the object, but the variable will always refer to the same object.

(他们的重点,不是我的。)

不要试图跟踪方法变量中存储在c中的状态,而是在创建匿名ActionListener的实例中的数据成员中进行跟踪。

那么如何解决这个问题呢?

使您试图在C中跟踪的状态成为您在匿名ActionListener实例中跟踪的状态,而不是在周围函数的变量中跟踪的状态(我已经更新了答案以说明这一点)。

这就是Java中存在关键字EDCOX1 0的原因。变量是最终变量,即其值不能更改。如果必须更改该值,请不要将变量标记为final。

这并不能解决OP的问题,因为他在一个本地类中改变var。

final使"变量"成为一个常量——你不能改变它。至于为什么在删除最后一个关键字后编译器会警告您,我们需要查看整个代码…

编辑:

but1.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

c=Integer.parseInt(f.getText());

d.setVisible(false);

d.dispose( );

}

});

我相信这是导致编译器触发警告的代码段。你不能在这个类中使用c…

变量用final关键字声明意味着它的值不能更改。最后的变量和常量一样

这不是OP的问题。他无法移除final,因为他正在本地类中对其进行变异。

只需从声明中删除final关键字,然后继续您的程序。由于final关键字表示值不变。

没有回答这个问题——OP已经声明,当他删除final时,他会得到另一个错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值