构造函数中的动态方法定义

时间:2014-04-13 20:14:33

标签: java android

在进行android开发时,我经常遇到类似的代码:

timer = new CountDownTimer(counter, 1000) {
                public void onTick(long remainingTimeMillis) {
                    counter = remainingTimeMillis;
                    displayCount(counter);
                }
                public void onFinish() {
                    displayCount(0);
                    counter = 0;
                    timer = null;
                    beep.start();
                }
            };

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String s = (String) v.getTag();
                int duration = Toast.LENGTH_SHORT;
                Toast toast = Toast.makeText(context, s, duration);
                toast.show();

            }
        });

我从来没有在其他领域看到Java的这种用法,有人可以解释一下它在调用构造函数时的含义,然后在其中定义一些其他方法,就像为我定义一个类。通常我们需要使用这种结构的情况是什么?非常感谢。

3 个答案:

答案 0 :(得分:3)

这称为匿名类。在构造函数之后的括号中,您创建一个扩展所提到的类或实现所提到的接口的类,覆盖它的方法和/或定义新的方法和字段,然后创建这个新类的实例。

这个新类没有名称,对象无法引用。当您需要实现某些类/接口的抽象方法,创建单个对象并将此对象作为参数传递时,通常会使用它。

例如,OnClickListener接口有一个抽象方法onClick(),在触发click事件时用作回调。如果没有匿名类,首先需要声明实现给​​定接口的类,然后创建它的对象,然后只使用显式转换将其作为参数传递给setOnClickListener方法。使用匿名类,您可以使用更少的代码和更高的可读性来编写它。

答案 1 :(得分:2)

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            String s = (String) v.getTag();
            int duration = Toast.LENGTH_SHORT;
            Toast toast = Toast.makeText(context, s, duration);
            toast.show();

        }
    });

这里有一个匿名的内部类。该类实现接口OnClickListener,并实现方法onClick

您可以拥有自己的活动课程implement OnClickListener

 button.setOnClickListener(this); // this refers to the Activity class

然后在Activity

中覆盖onClick
 @Override
 public void onClick(View v) {
 switch(v.getId)
 {
     case R.id.button1 :
     break; 
 }

 }

如果您有更多按钮,我更喜欢上述方法。

How are Anonymous (inner) classes used in Java?

http://docs.oracle.com/javase/tutorial/java/javaOO/whentouse.html

和这个

http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

答案 2 :(得分:1)

在您引用的示例中,正在创建所提及类的匿名对象,并将其作为预期参数传递给方法。 这里要注意的是,该类的一些方法被覆盖。 这不是android独有的。这通常用于创建接口和/或抽象类的匿名对象,以作为参数传递给方法。 此语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建此类的新对象并将其传递给所需的方法。因此,引用的例子可以被称为一种简洁而简洁的方法来解决这种情况。