Java 未命名对象



我已经学习编码 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. 在参数中赋值变量无效。

最新更新