我有一段有效的代码,我想问一下究竟发生了什么?

时间:2011-12-16 11:36:52

标签: java android

代码末尾的分号(;)是让我迷失的东西。

private View.OnClickListener onSave = new View.OnClickListener() {

    public void onClick(View v) {

        EditText name=(EditText)findViewById(R.id.name);
        EditText address=(EditText)findViewById(R.id.addr);
        r.setName(name.getText().toString());
        r.setAddress(address.getText().toString());

    }
};

5 个答案:

答案 0 :(得分:8)

我们这里有一个匿名的内部类。实际上会发生什么,你说“我想使用一个这个时间扩展View.OnClickListener”的对象。然后通过指定onClick方法代码直接内联提供该对象类型的实现。

您发布的整个代码只是一个分配,转换为:

A a = new SubclassOfA();

其中SubclassOfA直接内联定义。

答案 1 :(得分:4)

你所拥有的是一个匿名内部类的实例的实例化。分号结束赋值语句,该语句将新实例分配给onSave。这基本上就是速记:

private View.OnClickListener onSave = new MyClickListener();
//                                  the same semicolon ----^

// ...elsewhere, but inside your class...
private class MyClickListener extends View.OnClickListener() {

    public void onClick(View v) {

        EditText name=(EditText)findViewById(R.id.name);
        EditText address=(EditText)findViewById(R.id.addr);
        r.setName(name.getText().toString());
        r.setAddress(address.getText().toString());

    }
}

答案 2 :(得分:2)

末尾的半冒号是onSave声明的结尾。

就像你有:

String onSave = "hello"
;

除了“hello”位被更复杂的结构取代!

答案 3 :(得分:2)

它是一个匿名类的实例。因此最后是分号。

答案 4 :(得分:1)

您正在定义OnClickListener的实例。由于这是界面,您必须实现它的onclick方法。这也是声明,因此“;”必须在最后使用。