具体的なメソッドをオーバーライドするのはコードの匂いだというのは本当ですか?なぜなら、具体的なメソッドをオーバーライドする必要があると思うからです:
public class A{
    public void a(){
    }
}
public class B extends A{
    @Override
    public void a(){
    }
}
次のように書き換えることができます
public interface A{
    public void a();
}
public class ConcreteA implements A{
    public void a();
}
public class B implements A{
    public void a(){
    }
}
BがAでa()を再利用したい場合、次のように書き換えることができます。
public class B implements A{
    public ConcreteA concreteA;
    public void a(){
        concreteA.a();
    }
}
メソッドをオーバーライドするために継承を必要としないのは本当ですか?
virtualキーワードを使用してオーバーライドをサポートする必要があります。そのため、問題は言語の詳細によってより曖昧になります。
                final状況では、修飾子が正確に存在するように感じます。メソッドの動作がオーバーライドされるように設計されていない場合、としてマークしますfinal。それ以外の場合、開発者がそれをオーバーライドすることを選択できることを期待してください。