[OCPJP6] 013 – Orientação a objetos

Sobrescrita

Dando continuidade ao assunto herança (generalização e especialização), a sobrescrita é uma forma de especializar um método, alterando o comportamento da classe base (geral). Algumas regras:

  • O tipo de retorno deve ser o mesmo ou um subtipo.
  • O nível de acesso NÃO pode ser mais restritivo. (public > protected)
  • O nível de acesso pode ser menos restritivo. (protected > public)
  • Pode sobrescrever pra uma exceção de subtipo.
  • A declaração pode ser exatamente igual.

Vamos ver em exemplo:

package certificacao;
public abstract class SerVivo {
    public abstract String locomover();
}
package certificacao;
public abstract class Humano extends SerVivo {
    public String locomover() { return "caminhando"; }
    public String dormir() { return "Dorme 8h dia"; }
    // Controle de acesso default
    abstract String tirarCartaMotorista();
}

Aumentando o nível de acesso de default para protected.

package certificacao;
public class Homem extends Humano {
    // AUMENTAR o controle de acesso para protected.
    // private não compilaria
    protected String tirarCartaMotorista() {
        return "Depois dos 18 anos."; }
    protected String seAlistarTiroDeGuerra()
        throws AlistamentoException { return "Alistado!"; }

    class AlistamentoException extends Exception { }
    class ForaDeIdadeException extends AlistamentoException { }
}

Diminui o subtipo de exceção para uma classe especializada de AlistamentoException

package certificacao;
public class Menino extends Homem {
    // SIMPLES: Altera o comportamento do método
    public String dormir() {
        if (idadeEntreSeisQuinzeAnos()) {
            return "Dorme 12h dia";
        }
        return super.dormir();
    }
    // DIMINUI o Subtipo da exceção
    // Se fosse ao contrario não compilaria
    protected String seAlistarTiroDeGuerra()
        throws ForaDeIdadeException {
        throw new ForaDeIdadeException(); }
}

Comentem, estendam o assunto… Compartilhem =)