Ну, в основном этот фрагмент кода создает класс, имя которого искажено компилятором для вашего удобства, так что вам не нужно заботиться о присвоении ему имени самостоятельно. Этот класс будет реализовывать интерфейс 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 может показаться немного избыточным, но это не так. На самом деле, это довольно приятно иметь, чтобы ненужные методы (например, когда объявление метода удалено из интерфейса) не оставались в вашем коде.
Хотя следует отметить, что IDE, такая как Eclipse, скорее всего, сделает эти проблемы недействительными, поскольку предоставленных инструментов рефакторинга более чем достаточно, чтобы избежать такой ситуации. В любом случае, @Override очень приятно иметь при себе методы, когда его можно использовать.