Java 构造函数中的动态方法定义
在进行android开发时,我经常遇到如下代码:Java 构造函数中的动态方法定义,java,android,Java,Android,在进行android开发时,我经常遇到如下代码: timer = new CountDownTimer(counter, 1000) { public void onTick(long remainingTimeMillis) { counter = remainingTimeMillis; displayCount(counter); }
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();
}
};
或
我从未见过Java在其他领域有这样的用途,有人能解释一下调用构造函数时的含义,然后在其中定义一些其他方法,就像为我定义一个类一样。通常在什么情况下我们需要使用这种结构?非常感谢。这叫做匿名类。在构造函数后面的括号中,您创建一个类来扩展所提到的类或实现所提到的接口,重写它的方法和/或定义新的方法和字段,然后创建这个新类的实例 此新类没有名称,无法引用对象。当您需要实现某些类/接口的抽象方法、创建单个对象并将此对象作为参数传递时,通常会使用它
例如,
OnClickListener
接口有一个抽象方法onClick()
,它在触发click事件时用作回调。若并没有匿名类,那个么首先需要声明实现给定接口的类,然后创建该接口的对象,然后将其作为参数传递给具有显式强制转换的setOnClickListener
方法。使用匿名类,您可以用更少的代码和更高的可读性编写它。这称为匿名类。在构造函数后面的括号中,您创建一个类来扩展所提到的类或实现所提到的接口,重写它的方法和/或定义新的方法和字段,然后创建这个新类的实例
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()
,它在触发click事件时用作回调。若并没有匿名类,那个么首先需要声明实现给定接口的类,然后创建该接口的对象,然后将其作为参数传递给具有显式强制转换的setOnClickListener
方法。使用匿名类,您可以用更少的代码和更高的可读性编写它
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
您可以让活动类实现OnClickListener
和
button.setOnClickListener(this); // this refers to the Activity class
然后重写onClick-in活动
@Override
public void onClick(View v) {
switch(v.getId)
{
case R.id.button1 :
break;
}
}
如果你有更多的按钮,我更喜欢上面的方法
还有这个
这里有一个注释性的内部类。该类实现接口OnClickListener
,您实现方法onClick
您可以让活动类实现OnClickListener
和
button.setOnClickListener(this); // this refers to the Activity class
然后重写onClick-in活动
@Override
public void onClick(View v) {
switch(v.getId)
{
case R.id.button1 :
break;
}
}
如果你有更多的按钮,我更喜欢上面的方法
还有这个
在您引用的示例中,正在创建上述类的匿名对象,并将其作为预期参数传递给方法。 这里需要注意的是,该类的一些方法被重写。 但这并不是android独有的。这通常用于创建接口和/或抽象类的匿名对象以作为参数传递给方法。
这种语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建该类的新对象并将其传递给所需的方法。因此,引用的示例可以称为一个简短而简洁的方法来处理这种情况。在您引用的示例中,正在创建所述类的匿名对象,并将其作为预期参数传递给该方法。 这里需要注意的是,该类的一些方法被重写。 但这并不是android独有的。这通常用于创建接口和/或抽象类的匿名对象以作为参数传递给方法。
这种语法的替代方法是创建一个实现或扩展接口或抽象类的新类,然后创建该类的新对象并将其传递给所需的方法。因此,引用的示例可以称为一个简短而简洁的方法来处理这种情况。公平地说,匿名类的对象可以使用
this
关键字在内部引用。另一个目的是创建对象并立即运行其方法之一,如(new Thread(){…})。start()
公平地说,匿名类的对象可以使用this
关键字在内部引用。另一个目的是创建对象并立即运行其方法之一,如(new Thread(){…})。start()
感谢您的回答。但是在这里,我仍然对接口的内容感到困惑,你能用new创建一个新的接口并将接口作为参数传递吗?我想我们只能传入对象。@JFreebird您可以实现接口<代码>新建视图。OnClickListener(){您有一个实现接口OnClickListener
的annonymous内部类。我想您被语法弄糊涂了。请检查这个,谢谢您的回答。但是在这里,我仍然对接口的内容很困惑,您能不能使用new创建一个新接口并将接口作为参数传递?我想我们只能传递In对象。@JFreebird您实现了接口。new View.OnClickListener(){
您有一个实现接口的annonymous内部类OnClickListener
。我想您被语法弄糊涂了。检查这个