Java未命名的对象

时间:2012-04-10 00:17:52

标签: java android object new-operator anonymous-class

我一直在学习编码2个月。我在Android平台上使用Java。我想更好地理解未命名的对象。

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

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

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

c)如何命名?

d)未来如何引用它?可能吗?如果需要,可以在运行时修改它吗?

这是否有效?:“this.button2.setOnClickListener(OnClickListener namedObject = new OnClickListener(){// methods to 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 个答案:

答案 0 :(得分:4)

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

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

c)您可以这样做:

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

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

e)该语法无效。有关拨打此电话的正确方法,请参阅(c)。

答案 1 :(得分:0)

正如您所怀疑的,OnClickListener是一个对象,被称为匿名类/对象。它不需要命名,因为它被用作对象button2的“回调”。这意味着你正在处理button2一个对象,button2将委托一些工作二。在这种情况下,该工作是单击按钮时发生的所有事情。

因此,单击该按钮时,它将调用您在此处设置的对象。为了运行,必须定义'onClick'方法,您可以在代码示例中进行定义。因为那个方法在那里,button2能够调用它,并执行你提供的代码 - 在这种情况下创建一个Intent对象并启动一个活动。

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

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

答案 2 :(得分:0)

这是java的匿名类 您无需为其命名,当然您可以为其命名,但如果该类仅使用一次,则可以使用匿名类以方便使用。
新的onclicklistener()意味着这个匿名类派生自onclicklistener 您可能还想在匿名类中实现一些接口。

答案 3 :(得分:0)

一个。 OnClickListener是一个类型(抽象类/接口),碰巧有一个需要实现的方法。在这种情况下,您只需实现缺少的方法" inline" 湾它可以命名。但是没有应该这样的事情。这是一个选择问题。如果您打算多次重复使用同一个对象,可以为其命名。

℃。通过内联实现:

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

OR

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

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

d。如果将其分配给变量,则可以这样引用。如果您以内联方式实现它,则无法参考该实现。

即在参数中分配变量无效。