我已经学习编码 2 个月了。我在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);
}
});
}
a) 是的,它是一个对象。
b) 是的,它可以被命名,但它不一定需要(如果你将来不需要引用它,或者有其他方式来引用它)。
c) 您可以执行以下操作:
OnClickListener myOnClickListener = new OnClickListener() {
// Contents of the OnClickListener go here...
}
this.button2.setOnClickListener(myOnClickListener);
d) 如果您已命名(如上所示),则可以按名称来引用它。 如果通过调用对象上的任何 mutator 方法引用它,则可以在运行时引用它。
e) 该语法无效。 有关进行此调用的正确方法,请参阅 (c)。
您所怀疑的那样,OnClickListener是一个对象,被称为匿名类/对象。它不需要命名,因为它被用作对象 button2 的"回调"。这意味着您正在向 button2 传递一个对象,该对象 button2 将委派一些工作 2。在这种情况下,该工作是单击按钮时发生的一切。
因此,单击按钮时,它将调用您在此处设置的对象。为了正常工作,必须定义"onClick"方法,您可以在代码示例中执行此操作。由于该方法存在,因此 button2 能够调用它,并执行您提供的代码 - 在本例中为创建 Intent 对象并启动活动。
因为它是在函数调用中声明的,所以一旦该函数调用完成,它就会超出范围,并且您无法引用它。由于这个原因,没有特别的理由来命名它(button2 将有一个您无权访问或关心的内部名称)。如果在函数调用之外声明该类,则可以命名它并在以后引用它...但通常不需要这样做。
我认为它可以在运行时修改,但除非必要,否则您应该避免这种复杂性。
java的匿名类。
你不需要命名它,当然你可以命名它,但如果类只使用一次,你可以使用匿名类来方便。
新的 onclicklistener() 意味着这个匿名类是从 onclicklistener 派生的。
您可能还希望在匿名类中实现某些接口。
a. OnClickListener 是一种类型(抽象类/接口),它恰好有一个需要实现的方法。在这种情况下,您只是实现了缺少的方法"内联"b.它可以被命名。但是没有它应该这样的事情。这是一个选择问题。如果打算多次重用同一对象,可以为其命名。
c. 通过内联实现,如下所示:
OnClickListener ocl = new OnClickListener() {
public void onClick() {
...
}
}
OR
public class MyOnClickListener extends OnClickListener {
public void onClick() {
...
}
}
OnClickListener ocl = new MyOnClickListener()
我假设OnClickListener在这里是一个抽象类。如果它是一个接口,您只需将单词 extend 更改为实现。其余的保持不变。
d.如果将其分配给变量,则可以这样引用。如果以内联方式实现,则无法引用该实现。
e. 在参数中赋值变量无效。