如何在android中理解新的Class.method(){some code}

时间:2015-05-30 22:35:07

标签: java android callback event-listener

我看过这段代码,它有效,但我不明白这种结构。我的意思是,第二个参数是做什么的(来自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) {

            }
        });

1 个答案:

答案 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
};

我希望这会有所帮助。