在Android上学习TTS时,我遇到了以下代码段:
speakBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
}});
我对Java很陌生,所以我对识别各种结构的信心水平并不高。我认为我上面看到的是Anonymous Inner Class,但是“新的OnClickListener()”让我感到困惑。因此,请确认和/或更正以下任何理解:
最后,有没有办法以更容易破译像我这样的n00b的方式编写上述代码段?
答案 0 :(得分:4)
@Override
是一个方法级注释,工作正常。答案 1 :(得分:3)
好吧,基本上这段代码创建了一个类,编译器为了你的方便而破坏了这个名称,这样你就不必在乎自己命名了。该类将实现接口OnClickListener,并包含onClick(View)方法的实现,如接口所需。
因此,您的代码段可能是这样写的:
class OnClickListenerThingy01 implements OnClickListener { // name is invented from the top of my head and corresponds actual name manging in no way
@Override
public void onClick(View view) {
mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
}
}
speakBtn.setOnClickListener(new OnClickListenerThingy01());
@Override注释没有放在类本身上 - 在代码中没有声明可以添加注释,编译生成 - 但是在方法上。
@Override注释用于标记覆盖(多么令人惊讶)和方法实现。它的主要用途是,如果被覆盖方法的签名发生更改,则会生成编译器错误,但是您无法相应地更新覆盖声明,这样当覆盖失败时,您不会感到非常惊讶,因为,例如,什么是重写被重命名。
如果在接口实现上,如果您忘记完全实现接口,编译器将始终生成错误,因此@Override可能看起来有点多余,但事实并非如此。事实上,如果不必要的方法(例如,从接口中删除方法声明)将不会保留在您的代码中,这是一件相当不错的事情。
虽然必须注意像Eclipse这样的IDE很可能会使这些问题无效,因为提供的重构工具足以避免这种情况。无论如何,@ Override在使用它时可以很方便。
答案 2 :(得分:2)
这是一种重写你的代码片段的方法,使其更加清晰“对菜鸟”:)
class MyOuterClass {
private class MyOnClickListener implements OnClickListener {
@Override
public void onClick(View view) {
mTts.speak(words.getText().toString(), TextToSpeech.QUEUE_ADD, null);
}
}
// later (inside some method)...
speakBtn.setOnClickListener(new MyOnClickListener());
}
答案 3 :(得分:1)
将代码视为描述OnClickListener()的未命名子类。正如您所想的那样,类定义在括号内。
是
确实如此,但事实并非如此。它可以有更多的成员函数。
@Override用于对方法进行编译时错误检查。您可以在匿名内部类上使用方法级注释。
答案 4 :(得分:0)
OnClickListener是一个超类 内部类派生的
不是真的:OnClickListener不是一个类。 此语法用于创建实现OnClickListener接口的新(匿名)类的实例。所以你只有一种方法可以实现:onClick()。