a只能在这里决赛.为什么?如何a在onClick()不将其保留为私有成员的情况下重新分配方法?
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)如何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中,我们看到许多final可以使用关键字的地方,但它的使用并不常见.
例如:
String str = "abc";
System.out.println(str);
Run Code Online (Sandbox Code Playgroud)
在上述情况下,str可以final但通常不会这样做.
当一个方法永远不会被覆盖时,我们可以使用final关键字.类似地,如果一个类不会被继承.
在任何或所有这些案例中使用final关键字是否真的能提高性能?如果是这样,那怎么样?请解释.如果正确使用final真正重要的性能,应在Java程序员开发什么习惯,使关键字的最好用?
到目前为止,我认为有效的 final和final或多或少是等效的,如果在实际行为中不相同,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)
所以字符串实习在这里的行为也不同(我不想在实际代码中使用这个片段,只是对不同的行为感到好奇)。
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 ".
为什么匿名内部类必须要求外部类实例变量为最终才能访问它?
首先,如果这是一个重复的问题,我道歉.我找到了许多类似的,但没有一个直接解决我的问题.
为准备即将到来的考试,我正在做一篇过去的论文.它有一个提供代码段的问题.我们必须声明它是否编译,如果不编译,则写入发生第一个编译器错误的行并解释它.这是片段:
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 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添加函数编程功能.
它是否同样处理代码?
我有一个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) 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关闭而不是关闭时,我对编译器为什么需要它这样感兴趣.