Зачем и где именно писать @Override?
Это аннотация пишется над методами, которые переопределяются из супер класса.
Это что-то вроде страховки, гарантирующая что 100% переопределен метод.class A {
public void superMethod() {}
}

class B extends A {
@Override
public void superMethod() {}
}
Компилятор, когда встретит данную аннотацию, проверит, чтоб сигнатуры методов в супер классе и в под классе совпадали, т.е. вы переопределили метод, и в полиморфизме будит вызываться переопределенный метод. 
Если вдруг вы ошиблись в сигнатуре метода (например пропустили букву в название), то компилятор выдаст ошибку
Писать желательно на всех переопределенных методах, во-первых, чтобы человек, читающий код, видел, что это переопределенный метод, во-вторых, чтобы компилятор и IDE проверяли его сигнатуру (параметры, модификаторы доступа, возвращаемое значение) и не давали скомпилировать при наличии ошибки, ведь если сигнатура неверная, то метод не будет вызываться.