相关疑难解决方法(0)

为什么在匿名类中只能访问最终变量?

  1. a只能在这里决赛.为什么?如何aonClick()不将其保留为私有成员的情况下重新分配方法?

    private void f(Button b, final int a){
        b.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                int b = a*5;
    
            }
        });
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如何5 * a点击它返回?我的意思是,

    private void f(Button b, final int a){
        b.addClickHandler(new ClickHandler() {
    
            @Override
            public void onClick(ClickEvent event) {
                 int b = a*5;
                 return b; // but return type is void 
            }
        });
    }
    
    Run Code Online (Sandbox Code Playgroud)

java event-handling anonymous-class

341
推荐指数
7
解决办法
11万
查看次数

在Java中使用final关键字可以提高性能吗?

在Java中,我们看到许多final可以使用关键字的地方,但它的使用并不常见.

例如:

String str = "abc";
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)

在上述情况下,str可以final但通常不会这样做.

当一个方法永远不会被覆盖时,我们可以使用final关键字.类似地,如果一个类不会被继承.

在任何或所有这些案例中使用final关键字是否真的能提高性能?如果是这样,那怎么样?请解释.如果正确使用final真正重要的性能,应在Java程序员开发什么习惯,使关键字的最好用?

java final

332
推荐指数
8
解决办法
8万
查看次数

如何将参数传递给Java线程?

谁能告诉我如何将参数传递给线程?

此外,它如何为匿名类工作?

java multithreading

280
推荐指数
11
解决办法
33万
查看次数

有效地最终与最终 - 不同的行为

到目前为止,我认为有效的 finalfinal或多或少是等效的,如果在实际行为中不相同,JLS 会将它们相似地对待。然后我发现了这个人为的场景:

final int a = 97;
System.out.println(true ? a : 'c'); // outputs a

// versus

int a = 97;
System.out.println(true ? a : 'c'); // outputs 97
Run Code Online (Sandbox Code Playgroud)

显然,JLS 在这里两者之间产生了重要区别,我不知道为什么。

我阅读了其他主题,例如

但他们没有详细说明。毕竟,在更广泛的层面上,它们似乎几乎是等价的。但深入挖掘,它们显然不同。

是什么导致了这种行为,谁能提供一些解释这一点的 JLS 定义?


编辑:我发现了另一个相关的场景:

final String a = "a";
System.out.println(a + "b" == "ab"); // outputs true

// versus

String a = "a";
System.out.println(a + "b" == "ab"); // outputs false
Run Code Online (Sandbox Code Playgroud)

所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。

java final jls language-lawyer effectively-final

103
推荐指数
2
解决办法
3137
查看次数

为什么Java内部类需要"最终"外部实例变量?

final JTextField jtfContent = new JTextField();
btnOK.addActionListener(new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent event){
        jtfContent.setText("I am OK");
    }
} );
Run Code Online (Sandbox Code Playgroud)

如果我省略final,我看到错误" 不能引用在不同方法中定义的内部类中的非最终变量jtfContent ".

为什么匿名内部类必须要求外部类实例变量为最终才能访问它?

java inner-classes

54
推荐指数
5
解决办法
4万
查看次数

引用非最终变量:为什么这段代码会编译?

首先,如果这是一个重复的问题,我道歉.我找到了许多类似的,但没有一个直接解决我的问题.

为准备即将到来的考试,我正在做一篇过去的论文.它有一个提供代码段的问题.我们必须声明它是否编译,如果不编译,则写入发生第一个编译器错误的行并解释它.这是片段:

public static void main(String[] args) {
    JFrame f = new JFrame("hi");
    JTextField jtf = new JTextField(50);

    jtf.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent evt) {
            jtf.setText(evt.getLocationOnScreen().toString());
        }
    });

    f.add(jtf);
    f.setVisible(true);
}
Run Code Online (Sandbox Code Playgroud)

我期待它不要编译,因为jtf不是final.我通过在Eclipse中输入上面的代码测试了我的理论,它标记了预期的错误,但编译并运行得很好.只有在鼠标停留之后JTextField我才得到预期的错误:

java.lang.Error:未解决的编译问题:无法引用封闭范围中定义的非最终局部变量jtf

我做了一些搜索,发现Eclipse使用自己的Java编译器版本.所以我在Eclipse之外重新创建了文件,并通过命令行编译/运行它.它编译时没有错误或警告,当鼠标悬停在文本字段上时,显示所需的内容java.awt.Point[x=...,y=...].

我对匿名内部类的理解是他们可以访问:

  • 封闭类的字段
  • 封闭类的方法
  • 封闭范围的局部变量,只要它们是 final

那我错过了什么?根据我的知识,这段代码不应该工作.

java inner-classes java-8

27
推荐指数
2
解决办法
1982
查看次数

Java停止了内部类中非final变量的错误(java 8)

Java 7在下面的代码中说"不能引用封闭范围中定义的非最终局部变量消息":

public class Runner {   
    public static void main(String[] args) {

        String message = "Hello world";

        new Runnable() {
            @Override
            public void run() {
                System.out.println(message);
            }
        }.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

Java 8没有.

怀疑这是关于向Java添加函数编程功能.

它是否同样处理代码?

java inner-classes java-8

25
推荐指数
2
解决办法
5274
查看次数

变量"有效最终"是什么意思?

匿名类的文档说明

匿名类无法访问其封闭范围中未声明为final或者有效final的局部变量.

我不明白变量是"有效最终"是什么意思.有人能提供一个例子来帮助我理解这意味着什么吗?

java final anonymous-class

17
推荐指数
2
解决办法
1732
查看次数

从lambda表达式引用的局部变量必须是最终的或有效的final

我有一个JavaFX 8程序(适用于JavaFXPorts交叉平台),它实际上是为了做我想做的事情,但却是一步之遥.程序读取文本文件,对行进行计数以建立随机范围,从该范围中选取一个随机数并读取该行以进行显示.

The error is: local variables referenced from a lambda expression must be final or effectively final
        button.setOnAction(e -> l.setText(readln2));
Run Code Online (Sandbox Code Playgroud)

我对java有点新,但看起来我是否使用Lambda来显示下一个随机行Label l,我的button.setOnAction(e -> l.setText(readln2));行期待静态值.

我每次按下屏幕上的按钮时,如何调整我所拥有的只需创建var readln2的下一个值的任何想法?

在此先感谢,这是我的代码:

String readln2 = null;
in = new BufferedReader(new FileReader("/temp/mantra.txt"));
long linecnt = in.lines().count();
int linenum = rand1.nextInt((int) (linecnt - Low)) + Low;
try {
    //open a bufferedReader to file 
    in = new BufferedReader(new FileReader("/temp/mantra.txt"));

    while (linenum > 0) {
        //read the next line until the specific line is …
Run Code Online (Sandbox Code Playgroud)

java lambda

17
推荐指数
2
解决办法
5万
查看次数

为什么Java的try-with-resource需要声明

Java7的try-with-resources非常棒,但是我无法理解为什么需要在try语句中包含资源声明.我的直觉说以下应该是可能的:

CloseableResource thing;
try (thing = methodThatCreatesAThingAndDoesSomeSideEffect()) {
    // do some interesting things
}
thing.collectSomeStats();
Run Code Online (Sandbox Code Playgroud)

唉,这会导致语法错误(密码期待a ;).将类型定义/声明移动到try语句中是有效的,这当然会将事物移动到相应的范围中.我想知道如何解决这个问题,当我想要更多AutoClosable关闭而不是关闭时,我对编译器为什么需要它这样感兴趣.

java try-catch

14
推荐指数
2
解决办法
4155
查看次数