我是java的新手,我还在尝试理解这种语言,所以如果这个问题听起来很无趣,我会道歉。
我听不到有些关于听众的事情,有时你可以看到以这种方式宣告听众:
private View.OnClickListener onSave=new View.OnClickListener() {
public void onClick(View v) {
// Some code
}
};
或:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
最令我困惑的是该方法结束后的分号和括号。
我理解内部类是为了拥有多个侦听器,但我不理解这个变量和方法的混合声明。
它的目的是什么?
如何宣布?
WTF? :P
欢呼:)答案 0 :(得分:3)
通常定义一个类,实例化一个实例,然后单独使用该实例:
class MyListener extends OnClickListener {
public void onClick(View v) {
// my onClick code goes here
}
}
MyListener foo = new MyListener();
button.setOnClickListener(foo);
但有时您需要一个只能立即实例化一次的子类,这通常是事件处理程序的情况。定义它并使用匿名(内部)类将其实例化是很方便的:
OnClickListener foo =
new OnClickListener() {
public void onClick(View v) {
// my onClick code goes here
}
};
button.setOnClickListener(foo);
但由于foo
仅使用一次,我们可以更进一步,并消除局部变量foo
,所以:
button.setOnClickListener(foo);
可以格式化为:
button.setOnClickListener(
foo
);
替换为foo
:
button.setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
// my onClick code goes here
}
}
);
再次重新格式化,没有太多的空白来查看它,因为它经常写着:
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// my onClick code goes here
}
});
我认为最后这种格式会影响可读性。我格式化我的匿名类,类似于它的最后一种格式 - 更好的可读性(恕我直言)值得多一些额外的空格。
答案 1 :(得分:2)
分解......
javax.swing.SwingUtilities.invokeLater(Runnable runnable);
invokeLater()
是SwingUtilities
上的静态方法,它以Runnable
作为参数。
注意最后的右括号和分号;它只是一种标准方法,对吧?
中间的东西只是创建一个Runnable的新实例来传递给方法。如果我将它分配给参考,你会更好地认识到它:
Runnable parameter = new Runnable()
{
public void run()
{
createAndShowGUI();
}
}
};
答案 2 :(得分:2)
这里没有任何关于分号或括号的困惑。基本上,这是在Java中分配匿名类的一种方法。如果您不熟悉此构造,您当然可以创建自己的类来实现Runnable,并将其分配如下: -
public class YourRunnableClass implements Runnable {
public void run() {
...
}
}
然后你可以让它看起来更漂亮,就像这样: -
javax.swing.SwingUtilities.invokeLater(new YourRunnableClass());
P / S:尽量不要在帖子中使用“WTF”。 :)
答案 3 :(得分:1)
这是一个anonymous inner class。这是一个非常常见且方便的结构。阅读我链接的教程!
答案 4 :(得分:1)
该代码适用匿名类。搜索并阅读此主题。
分号分别终止赋值方法调用。
PS。我一直认为这个名字是误导性的,因为你真正得到的是一个对象。
答案 5 :(得分:1)
我将尝试举例说明第二个例子。
在这种情况下,invokeLater方法需要任何对象实现 Runnable
接口。
class Example implements Runnable{
public void run(){
// do something
}
}
你的例子可能是:
javax.swing.SwingUtilities.invokeLater(new Example());
但是因为这个Example类很可能你只使用它一次,所以使用匿名类会更方便。