2012-04-10 85 views
0

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

在参照本实施例的第7行, “this.button2.setOnClickListener(新OnClickListener(){...});”

a)OnClickListener是一个对象吗? (我觉得是,因为使用了“新”的关键字)

B)可以(也应该)它被命名为?

c)它将如何命名?

d)将来如何提及它?可能吗?如果需要,可以在运行期间修改它吗?

E)将这项工作?: “this.button2.setOnClickListener(OnClickListener namedObject =新OnClickListener(){//方法写在这里});”

@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

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

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

C)你可以这样做:

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

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

E)这句法无效。请参阅(c)提供此通话的正确方法。

+0

感谢您的回答! – 2012-04-10 00:30:01

+0

这里有一些困惑。对象没有名字。类有名字,或者,在这种情况下,不是。有问题的是匿名类的对象。你的(c)给这个对象的*引用*一个名字。 – EJP 2012-04-10 01:19:46

+0

@EJP,你当然是对的,尽管我认为是“命名它”,但他的意思是提供一个参考。 – 2012-04-10 04:18:43

0

OnClickListener是,因为你怀疑,一个对象,并作为一个匿名类/对象被参考。它不需要被命名,因为它被用作对象button2的“回调”。这意味着你将button2交给一个对象,button2将委托一些工作。在这种情况下,这项工作就是单击按钮时发生的所有事情。

因此,单击按钮时,它将调用您在此处设置的对象。为了起作用,必须定义“onClick”方法,您在代码示例中执行该方法。由于该方法存在,button2可以调用它,并执行您提供的代码 - 在这种情况下,创建一个Intent对象并启动一个活动。

因为它在函数调用内声明的年代,只要该函数调用完成后,超出范围,你不能引用它。没有特别的理由为此命名它(button2将有一个内部名称,您无权访问或关心)。如果您在函数调用之外声明该类,则可以将其命名并稍后参考它,但通常不需要。

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

+0

谢谢,澄清了什么是匿名对象。 – 2012-04-10 00:29:54

+0

有什么办法可以引用在引用调用中创建的匿名对象吗? – 2012-04-10 00:35:00

+0

不是直接。如果您传递匿名对象的对象有一种方法供您参考,那么可能。这取决于需要回调的对象的实现。 – 2012-04-10 00:46:18

0

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

+0

当你说“这个匿名类是从onClickListener派生的”时,你是否确实是指“这个匿名OBJECT派生自onClickListener”? – 2012-04-10 00:31:36

+0

是的,实际上匿名类就是这样使用的。因为该方法必须知道匿名类具有什么方法。 – cloudygoose 2012-04-10 00:34:35

+1

@blackscholes:它实际上是一个类。你在大括号之间定义的是提供一个立即实例化的类(用'new'关键字,就像你说的),然后扔掉。 – 2012-04-10 00:35:36

0

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

℃。要么通过内联执行如:

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

OR 

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

我假设OnClickListener是一个抽象类在这里。如果它是一个接口,只需将extend扩展为implements。其余的依然如此。 d)。如果你将它分配给一个变量,你可以这样引用。如果您以内联方式实施它,则不能引用该实现。

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