Dúvida sobre substituição de métodos

3 respostas
N

Olá pessoal,

Gostaria de saber porque o modificador de acesso de um método substituído deve ser menos restritivo que o método da superclasse?

Aguardo respostas,

Vlw!

3 Respostas

gilmaslima

nilo_sj:
Olá pessoal,

Gostaria de saber porque o modificador de acesso de um método substituído deve ser menos restritivo que o método da superclasse?

Aguardo respostas,

Vlw!

Ele não deve ser menos restritivo, ele pode ser menos restritivo.

Vê se esse exemplo lhe ajuda.

package dogs;
public class Dog{
    public void latir(){ //acesso publico
        System.out.println("Latido cachorro genérico");
    }

}

// outra classe em outro arquivo
package dogs;
public class Poodle extends Dog{
    // o correto seria um modificador public
    void latir(){ // Se esse código compilace poderia haver problemas numa cjamada polimófica
        System.out.println("Latido de poodle");
    }

}

package outher;
public class TesDogs{
    public static void main(String... a){
        Dog d = new Dog();
        d.latir(); // usa a versão latir de Dog
        Dog e = new Poodle();
        e.latir(); // supondo que a classe Poodle tivesse compilado, aqui o compilador não conseguiria encontrar o método latir por causa do modificador de acesso
                     // resumindo a classe Poodle deve fazer no mínimo tudo que um Dog faz
    }
}

Espero ter ajudado!

flw!

LeandroMedeiros

Olá,

Ele deve ter o modificador igual ou menos restritivo que o método da superclasse. A ordem dos modificadores que acesso do menos restritivo para o mais restritivo é a seguinte:

public 
protected 
default //(sem modificador)
private

Quando declar um método com o modificador default, por exemplo, protected e public serão válidos no método sobreposto.

T

nilo_sj:
Olá pessoal,

Gostaria de saber porque o modificador de acesso de um método substituído deve ser menos restritivo que o método da superclasse?

Aguardo respostas,

Vlw!

Como foi dito, você pode (não obrigatoriamente deve) deixar menos restrito que o método da superclasse.
O que você não pode fazer é restringir o acesso na sua subclasse (eu chamaria isso de “privatizar um recurso público indevidamente”, ou seja, “roubar do povo”.) Entretanto, você pode conservar o acesso, ou aumentar o acesso.
Vou dar um exemplo (aquele famoso exemplo dos animais).

class Animal {
    public void comer();
}
class Cachorro extends Animal {
    private void comer(); // não é permitido. Digamos que fosse - vamos ver o que ocorreria.
}
class Teste {
    public static void main(String[] args) {
        Animal a = new Cachorro();
        a.comer(); // Você não poderia acessar o método "comer" embora ele fosse público na classe Animal, 
        c.comer(); // porque ele tem de ser equivalente a esta chamada, que seria proibida porque a classe Cachorro
        // "privatizou" o método comer.
    }
}
Criado 8 de fevereiro de 2009
Ultima resposta 9 de fev. de 2009
Respostas 3
Participantes 4