0

我已经学习编码两个月了。我在 Android 平台上使用 Java。我试图更好地理解未命名的对象。

参考本例的第 7 行,“this.button2.setOnClickListener(new OnClickListener(){...});”

a) OnClickListener 是一个对象吗?(我认为是,因为使用了“new”关键字)

b) 可以(并且应该)命名它吗?

c) 它将如何命名?

d) 将来人们会如何提及它?是否可以?如果需要,可以在运行时修改它吗?

e) 这行得通吗?:“this.button2.setOnClickListener(OnClickListener namedObject = new OnClickListener(){//methods go here});”

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main2);     
    this.button2 = (Button) this.findViewById(R.id.button2);    
    this.button2.setOnClickListener(new OnClickListener()   
    {
        public void onClick(View v) 
        {                       
            Intent i = new Intent(getApplicationContext(), Absolute.class);
            startActivity(i);
        }
    });
}
4

4 回答 4

4

a)是的,它是一个对象。

b)是的,它可以被命名,但它不一定必须是(如果您将来不需要引用它,或者有其他引用它的方式)。

c)你可以这样做:

OnClickListener myOnClickListener = new OnClickListener() {
    // Contents of the OnClickListener go here...
}
this.button2.setOnClickListener(myOnClickListener);

d)如果您已命名它(如上所示),则可以通过名称来引用它。如果您通过在对象上调用任何 mutator 方法来引用它,则可以在运行时引用它。

e)该语法无效。有关进行此调用的正确方法,请参见 (c)。

于 2012-04-10T00:21:28.597 回答
0

正如您所怀疑的,OnClickListener 是一个对象,被称为匿名类/对象。它不需要命名,因为它被用作对象 button2 的“回调”。这意味着您正在向 button2 传递一个对象,而 button2 将委托两个工作。在这种情况下,这项工作就是单击按钮时发生的一切。

因此,当单击按钮时,它将调用您在此处设置的对象。为了发挥作用,必须定义“onClick”方法,您可以在代码示例中执行此操作。因为该方法存在,所以 button2 能够调用它,并执行您提供的代码 - 在本例中创建一个 Intent 对象并启动一个活动。

因为它是在函数调用中声明的,所以一旦该函数调用完成,它就会超出范围并且您无法引用它。由于这个原因没有特别的理由来命名它(button2 将有一个您无权访问或关心的内部名称)。如果您在函数调用之外声明该类,您可以命名它并稍后引用它......但通常这不是必需的。

我认为它可以在运行时进行修改,但除非必要,否则应该避免这种复杂性。

于 2012-04-10T00:21:50.037 回答
0

这是java的匿名类。
不需要命名,当然可以命名,但是如果类只使用一次,为了方便可以使用匿名类。
新的 onclicklistener() 表示这个匿名类是从 onclicklistener 派生的。
您可能还想在匿名类中实现一些接口。

于 2012-04-10T00:24:50.293 回答
0

一种。OnClickListener 是一个类型(抽象类/接口),恰好有一个方法需要实现。在这种情况下,您只需实现缺少的方法“内联”b。它可以被命名。但不应该有这样的事情。这是一个选择问题。如果你打算多次重复使用同一个对象,你可以命名它。

C。通过实施内联,如:

OnClickListener ocl = new OnClickListener() {
    public void onClick() {
       ...
    }
}

OR

public class MyOnClickListener extends OnClickListener {
    public void onClick() {
       ...
    }
}
OnClickListener ocl = new MyOnClickListener()

我假设 OnClickListener 是一个抽象类。如果它是一个接口,您只需将单词extends 更改为implements。其余的保持不变。

d。如果将其分配给变量,则可以这样引用。如果内联实现,则无法引用实现。

e. 在参数中分配变量无效。

于 2012-04-10T00:30:14.383 回答