在进行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的这种用法,有人可以解释一下它在调用构造函数时的含义,然后在其中定义一些其他方法,就像为我定义一个类。通常我们需要使用这种结构的情况是什么?非常感谢。
答案 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独有的。这通常用于创建接口和/或抽象类的匿名对象,以作为参数传递给方法。 此语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建此类的新对象并将其传递给所需的方法。因此,引用的例子可以被称为一种简洁而简洁的方法来解决这种情况。