O modificador override é necessário para estender ou modificar a implementação abstrata ou virtual de um método, propriedade, indexador ou evento herdado.
“@Override” é uma “annotation” que pode ser acrescentada a um método que foi sobreposto (“overridden”). Ela deve ser usada para métodos sobrepostos, não necessariamente aqueles que devem ser implementados devido ao uso de uma interface (veja a sutileza).
Para ter um objeto de uma classe abstrata é necessário criar uma classe mais especializada herdando dela e então instanciar essa nova classe. Os métodos da classe abstrata devem então serem sobrescritos nas classes filhas.
O super() serve para chamar o construtor da superclasse. Ele sempre é chamado, mesmo quando não está explícito no código, quando for explicitado deve ser o primeiro item dentro do construtor. Apesar da classe Teste estar instanciando um objeto da classe Sub, tanto os construtores de Sub e de Super são chamados.
' antes de uma variável, fica implícito ao Java que estamos nos referindo aos atributos daquela Classe. Podemos usar, inclusive, em um print, caso esteja dentro da classe. Em um método, por exemplo, como veremos a seguir. Outra utilidade do 'this' é passar o objeto atual como parâmetro.