在SO和谷歌寻找这个问题的答案,但找不到任何答案.
我有以下代码:
MyClass variable = new MyClass();
Button b = new Button();
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
System.out.println("You clicked the button");
variable.doSomething();
}
});
Run Code Online (Sandbox Code Playgroud)
编译器返回:
从内部类中访问局部变量变量; 需要宣布最终
什么variable必须是最终的技术原因是什么?
我的问题是为什么我应该使用final来装饰变量,列表?它由匿名内部类的实例使用而不是final,它不会编译.
代码如下所示:
public class TwoThreadsOneListCurrModi
{
public static void main(String[] args)
{
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
for (int i =0 ; i<20;i++)
list.add(String.valueOf(i));
Thread t1 = new Thread(new Runnable(){
@Override
public void run()
{
synchronize(list) {
System.out.println("size of list:" +list.size());
}
}
});
t1.start();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用普通课,那很好.
public class TwoThreadsOneListCurrModi2
{
public static void main(String[] args)
{
final List<String> list = Collections.synchronizedList(new ArrayList<String>());
initialize list;
Thread t1 = new WorkThread(list);
Thread t2 = new WorkThread(list);
t1.start();
t2.start();
} …Run Code Online (Sandbox Code Playgroud) 为什么我不能在不同方法中定义的内部类中引用非final变量?
我已经看过关于这方面的主题,并且大多数人都说你的组件应该是最终的...... 但没人说为什么?!! 我不知道这种限制背后的哲学是什么.
令我困惑的是,以下代码是错误的:
JButton removeJBtn = new JButton("Remove");
JButton addJBtn = new JButton("Add");
//...
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
removeJBtn.disable();//Error here,Cannot ...
}
});
Run Code Online (Sandbox Code Playgroud)
而如果我定义
JButton removeJBtn
Run Code Online (Sandbox Code Playgroud)
作为成员字段(在类的主体中,而不是方法),不需要将其定义为final!
我真的很感激我(也可能是许多其他人)总是面临的每日限制的任何合理答案.
亲爱的用户将此问题标记为重复,请至少提供原始问题的参考(已经得到肯定答复!),在我的问题上面添加了一个链接,我已经仔细阅读但是它充满了矛盾,一些人(88票)表示java捕获了最终变量的值,并且完全被它下面的评论(16票)拒绝.
输入:
Hi. I am John.
My name is John. Who are you ?
Run Code Online (Sandbox Code Playgroud)
输出:
Hi
I am John
My name is John
Who are you
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,第一个if语句抱怨current_guy不能是a,final但第二个if语句抱怨current_guy不是最终的.我没有想法.
final int current_guy=0;
if (a.equals("bf")){
current_guy=1;
}
guy1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (current_guy==1) {
// TODO Auto-generated method stub
}
}
Run Code Online (Sandbox Code Playgroud) 所以我有一个JList,我试图在一个内部使用它JButton小号actionPerformed方法,它要求我做出JList final这是为什么,下面的代码片段
public SomeClass() {
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
list.clearSelection();
}});
}
Run Code Online (Sandbox Code Playgroud)
我实际上没有问题使它成为最终的,我只是不确定为什么我需要.
我试图在循环中实现一个内部类,并进入一个有趣的情况.内部类有方法,但是,当我尝试访问变量时,Netbeans给了我一个编译错误并告诉我让int最终.
由于int是循环变量,因此它不能是最终的.我已经尝试创建新变量并将它们等同于循环变量,但这仍然会引发相同的错误.
这是基本语法(伪代码):
for(int i = 0; i < 10; i++)
{
panels[i].printI(new printI(){System.out.println(i);});
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我在系统的代码中注意到有人实例化了一个匿名类,如下所示
Class ExampleClass{
MyObj obj;
methodA(new ClassA(){
@override public void innerMethodA(){
//code...
}
});
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.
现在,为了使用在方法之前声明的obj,我通常将其定义为final.
我真的不明白为什么,但我这样做,因为编译器要求.在这段代码中,我在innerMethodA()中看到了用法
ExampleClass.this.obj()
Run Code Online (Sandbox Code Playgroud)
没有最后的.
我的问题:
1.为什么我在使用obj时必须进行最终决定?
2.什么是ExampleClass.this?请注意,ExampleClass是Class而不是实例.什么是"这个"?如果它有几个实例?
3.如果我在内部方法运行时更改obj会发生什么(在我的代码内部方法中循环运行,所以我打算更改它.它会爆炸吗?)
为什么局部变量最后是方法参数还是内部方法.
private void add(final int a , final int b) {
final int c = 0;
}
Run Code Online (Sandbox Code Playgroud)
请任何人澄清.我正在搜索很多,但我没有找到确切的答案.
Local Inner类不仅可以访问实例变量,还可以访问方法的局部变量(在其中定义它们),但必须声明局部变量final.
为什么final在这种情况下必须声明局部变量?
我问同事他为什么在这种方法中使用final关键字进行分配,他的回答是"为什么不呢?".我没有看到将决赛放在这里的好处.或者经常,我也会在课堂定义中看到它.
protected void sendIndexWorkflowRequest(Status status)
{
final long contextId = status.getAppContextId();
PrepareIndexPostData preparePostData = new PrepareIndexPostData.Builder(contextId).build();
searchIndexService.activateAggsIndex(preparePostData);
}
Run Code Online (Sandbox Code Playgroud) 我写了一些代码,一切正常,但是当我在另一台计算机上打开相同的代码时,出现以下错误:
Cannot refer to the non-final local variable usernameTextField defined in an enclosing scope
Cannot refer to the non-final local variable portTextField defined in an enclosing scope
Cannot refer to the non-final local variable usernameTextField defined in an enclosing scope
Cannot refer to the non-final local variable portTextField defined in an enclosing scope
Run Code Online (Sandbox Code Playgroud)
给出此错误的代码:
private static GridPane initGUI(){
GridPane root = new GridPane();
TextField usernameTextField = new TextField();
TextField portTextField = new TextField();
Button button = new Button("Login!");
root.add(new Label("Username:"),0,0); …Run Code Online (Sandbox Code Playgroud) 我的程序中有一些问题.
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityenter code here`_main);
ImageView ob4 = (ImageView) findViewById(R.id.imageView4);
ShapeDrawable d4 = new ShapeDrawable(new OvalShape());
d4.setIntrinsicHeight(150);
d4.setIntrinsicWidth(40);
d4.getPaint().setColor(Color.WHITE);
d4.setVisible(true, true);
ob4.setImageDrawable(d4);
Button btn_start = (Button) this.findViewById(R.id.button1);
btn_start.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//Cannot refer to a non-final variable d4 inside an inner class defined in a different method
//But i don't want to make this field "final", becouse i will change color …Run Code Online (Sandbox Code Playgroud)