【问题标题】:Java Unnamed ObjectsJava 未命名对象
【发布时间】:2012-04-10 00:17:52
【问题描述】:

我已经学习编码 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);
        }
    });
}

【问题讨论】:

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


    【解决方案1】:

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

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

    c) 你可以这样做:

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

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

    e) 该语法无效。请参阅 (c) 了解进行此调用的正确方法。

    【讨论】:

    • 这里有些混乱。对象没有名称。类有名称,或者在本例中没有。有问题的是匿名类的对象。您的 (c) 为对象的 reference 命名。
    • @EJP,您当然是正确的,虽然我认为“命名”是指提供对它的引用。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢,这说明了什么是匿名对象。
    • 有没有办法引用在引用调用中创建的匿名对象?
    • 不是直接的。如果您将匿名对象传递给的对象有办法让您引用它,那么可能。这取决于需要回调的对象的实现。
    【解决方案3】:

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

    【讨论】:

    • 当你说“这个匿名类是从onClickListener派生的”时,你的意思是“这个匿名OBJECT是从onClickListener派生的”吗?
    • 是的,实际上匿名类就是这样使用的。因为方法必须知道匿名类有哪些方法。
    • @blackscholes:其实是一个类。您在花括号之间定义的是提供一个立即实例化的类(如您所说,使用 new 关键字),然后丢弃。
    【解决方案4】:

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

    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。在参数中分配变量无效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多