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中匿名类的用途是什么?我们可以说匿名类的使用是Java的优势之一吗?
是否可以传递参数或访问外部参数到匿名类?例如:
int myVariable = 1;
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// How would one access myVariable here?
}
});
Run Code Online (Sandbox Code Playgroud)
有没有办法让侦听器访问myVariable或传递myVariable而不将侦听器创建为实际的命名类?
给出以下代码:
public interface Selectable {
public void select();
}
public class Container implements Selectable {
public void select() {
...
}
public void createAnonymousClass() {
Selectable s = new Selectable() {
public void select() {
//see comment below.
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
我想Container.select()从我的匿名类' select()方法中访问.但是,this.select()会再次调用匿名类的select()方法.
我的建议是:
在Container中引入一个字段,例如
private Container self = this;
Run Code Online (Sandbox Code Playgroud)
现在我可以Container.select()通过self.select()在匿名类中调用来访问.
这是一种合理的方式吗?还是有更好的方法吗?
由于Java8最近已经发布,并且它的全新lambda表达式看起来非常酷,我想知道这是否意味着我们习以为常的Anonymous类的消亡.
我一直在研究这个问题,并找到了一些很酷的例子,说明Lambda表达式将如何系统地替换这些类,例如Collection的sort方法,它用于获取Comparator的Anonymous实例来执行排序:
Collections.sort(personList, new Comparator<Person>(){
public int compare(Person p1, Person p2){
return p1.firstName.compareTo(p2.firstName);
}
});
Run Code Online (Sandbox Code Playgroud)
现在可以使用Lambdas完成:
Collections.sort(personList, (Person p1, Person p2) -> p1.firstName.compareTo(p2.firstName));
Run Code Online (Sandbox Code Playgroud)
而且看起来非常简洁.所以我的问题是,有没有理由继续在Java8中使用这些类而不是Lambdas?
编辑
同样的问题,但在相反的方向,使用Lambdas而不是匿名类有什么好处,因为Lambdas只能用于单个方法接口,这个新功能只是在少数情况下使用的快捷方式还是真的有用?
我正在阅读以下新功能:http://www.javaworld.com/article/2078836/java-se/love-and-hate-for-java-8.html
我看到了下面的例子:
使用匿名类:
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
System.out.println("Action Detected");
}
});
Run Code Online (Sandbox Code Playgroud)
使用Lambda:
button.addActionListener(e -> {
System.out.println("Action Detected");
});
Run Code Online (Sandbox Code Playgroud)
MouseListener如果他们想在匿名类中实现多个方法,有人会做什么,例如:
public void mousePressed(MouseEvent e) {
saySomething("Mouse pressed; # of clicks: "
+ e.getClickCount(), e);
}
public void mouseReleased(MouseEvent e) {
saySomething("Mouse released; # of clicks: "
+ e.getClickCount(), e);
}
Run Code Online (Sandbox Code Playgroud)
... 等等?
是否可以在Java中创建接口实例?
在某处我读过使用内部匿名类,我们可以这样做,如下所示:
interface Test
{
public void wish();
}
class Main
{
public static void main(String[] args)
{
Test t=new Test()
{
public void wish()
{
System.out.println("output: hello how r u");
}
};
t.wish();
}
}
cmd> javac Main.java
cmd> java Main
output: hello how r u
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
Volume in drive C has no label.
Volume Serial Number is 2041-64E7
Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet
2009-07-02 23:54 .
2009-07-02 23:54 ..
2004-09-06 14:57 582 WelcomeApplet.html
2004-09-06 15:04 1,402 WelcomeApplet.java
2 File(s) 1,984 bytes
2 Dir(s) 2,557,210,624 bytes free
C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>javac WelcomeApplet.java
C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet>dir
Volume in drive C has no label.
Volume Serial Number is 2041-64E7
Directory of C:\Program Files\Java\jdk1.6.0_05\CoreJava\v1\v1ch2\WelcomeApplet
2009-07-02 23:54 .
2009-07-02 23:54 ..
2009-07-02 23:54 975 WelcomeApplet$1.class
2009-07-02 23:54 1,379 WelcomeApplet.class
2004-09-06 … 我有以下代码片段:
public class A {
public static void main(String[] arg) {
new Thread() {
public void run() {
System.out.println("blah");
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,如何start()在不创建线程类实例的情况下为线程调用方法?