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!
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!
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!
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.
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.
}
}