我看过这段代码,它有效,但我不明白这种结构。我的意思是,第二个参数是做什么的(来自new ..)?
我理解这一点:
new Class() = new Class.constructormethod();
new Class.anymethod(){} //?? how is it possible to add code between braces? What kind of Class ot patron admit this type of code injection?
setNegativeButton(android.R.string.no,new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
答案 0 :(得分:1)
我无法理解你在前两行中的含义。
如果您询问第4行的代码,那么, 你所看到的是anonymous class.
的实例化匿名类表达式包含以下内容:
新运营商
要实现的接口的名称或要扩展的类。在这 例如,匿名类正在实现接口HelloWorld。
包含构造函数参数的括号,就像一个 普通类实例创建表达式。注意:实施时 接口,没有构造函数,所以你使用一对空 括号,如本例所示。
一个正文,它是一个类声明体。更具体地说,在 body,方法声明是允许的,但声明不允许。
因为匿名类定义是表达式,所以它必须是 声明的一部分。在此示例中,匿名类表达式 是实例化frenchGreeting对象的语句的一部分。 (这解释了为什么在结束括号后有分号。)
OnClickListener
不是一种方法,而是一种界面本身。
为了帮助您理解它,代码正在执行类似于以下内容的操作
public class Test {
public static void main(String[] args) {
class MyDialogInterface implements DialogInterface.OnClickListener {
@Override
public void onClick(DialogInterface dialog, int which) {
//do something
}
}
setNegativeButton(android.R.string.no,new MyDialogInterface());
}
}
class DialogInterface {
interface OnClickListener {
public abstract void onClick(DialogInterface dialog, int which);
}
}
在您的代码中,您不是首先声明一个实现OnClickListener接口的新类,然后在下一行中实例化它,而是用一个句子完成所有操作。
当您需要针对特定代码段的特定类或接口实现时,这通常很有用。您通常会在侦听器和回调中看到这一点。
最重要的是你总是可以写
new MyInterface() { //implement abstract methods here }
而不是
class MyIntefaceImplementation implements MyInterface {
//implement abstract methods here
}
new MyInterfaceImplementation()
你可以看到,顾名思义,匿名实现没有可以在代码中的其他地方调用的命名构造函数。
您可以匿名实例化从类和接口派生的类。
您可以将参数传递给parens
之间的父类构造函数new ConstructorWithParams(params) {
//implementation here
};
我希望这会有所帮助。