Bom pessoal uma duvida rapida.
Após compilar varias classes para fixar os conceitos de Herança com metodos sobrescritos cheguei a uma conclusão, mas queria ter certeza de que está correta, sem enrolar mais, é correto eu dizer que:
Uma SuperClasse tem acesso apenas a metodos sobrescritos de suas SubClasses?
[RESOLVIDO]Herança e metodos sobrescritos
15 Respostas
Acredito que sua abordagem está errada
A classe filha (subclasse) tem acesso a todos os seus metodos, e os metodos do pai que não são privados. (Entenda que por padrão todos atributos consideramos privados)
A herança significa que a classe filha é a classe pai mais alguma coisa.
imagine o cenario
public class Eletronico{
private boolean ligado;
private int consumo;
public boolean getLigado(){
return this.ligado
}
// aqui resto do codigo
}
public class TV extends Eletronico{
private int canal;
private int volume;
public int getCanal() {
return this.canal;
}
// metodos da classe filha
}
por que voce por exemplo iria querer usar o canal na classe eletronico se ela nao é 1 tv
não sei se consegui explicar legal
Sim quanto a essa parte eu compreendi bem, oq vem me deixando confuso é em relação a metodos sobrescritos e sobrecarrregados, por ex.:
class Pai {
void fazAlgo() {
System.out.println("metodo classe Pai");
}
}
class Filho extends Pai {
void fazAlgo() {
System.out.println("metodo classe Filho");
}
}
public class Teste {
public static void main(String[] args) {
Pai var = new Filho();
var.fazAlgo();
}
}
Nesse caso a saida é
metodo classe filho
Mas se eu retirar o metodo sobrescrito a saida obviamente seria:
metodo classe pai
Mas agora que fica um pouco confuso, se eu retirar o metodo da classe pai a classe não compila, por isso minha pergunta
Uma SuperClasse tem acesso apenas a metodos sobrescritos de suas SubClasses?
Queria saber se não a excessões quanto a essa afirmação pq foi o jeito mais facil que achei para decorar!
Voce reescreveu o metodo fazAlgo do pai
isso quer dizer que sua classe filha pode tanto utilizar o fazAlgo do pai como a dela
embora var seja Pai, voce definiu que ela vai receber um new Filho
sendo assim var será um filho, faça o teste abaixo para ver o que vai acontecer
class Pai {
void fazAlgo() {
System.out.println("metodo classe Pai");
}
}
class Filho extends Pai {
void fazAlgo() {
System.out.println("metodo classe Filho");
}
}
public class Teste {
public static void main(String[] args) {
Pai vr = new Filho();
vr.fazAlgo();
if (vr.getClass().isAssignableFrom(Filho.class) ){
System.out.println("vr é do tipo filha");
}
}
}
o retorno será que vr Embora tenha sido declarado como Pai, recebeu um filho, então é um filho.
Então no caso não é que a classe Pai tenha acesso ao metodo da classe Filha e sim que a variavel é do tipo Filha.
Mas sendo assim pq quando retiro o metodo da classe Pai o codigo não compila sendo que a variavel é do tipo Filha e a classe Filha tem o metodo?
Eu sei sua duvida mas nao sei se vou conseguir explicar claramente a resposta hehehe
A confusão foi por causa do:
Pai vr = new Filho();
veja se entenda o erro que dará abaixo, como voce disse que vr é um Pai que recebe um Filho, a classe filha nao vai poder ter metodos que nao temos na classe pai:
class Pai {
public void fazAlgo(){
System.out.println("Hadouken");
}
public void soltarHaduken(){
System.out.println("Hadouken");
}
}
class Filho extends Pai {
public void fazAlgo() {
System.out.println("metodo classe Filho");
}
public void chamarDaileon(){
System.out.println("Gigante Guerreiro, Daileon.");
}
}
public class Teste {
public static void main(String[] args) {
Pai vr = new Filho();
vr.fazAlgo();
vr.soltarHaduken();
vr.chamarDaileon();
if (vr.getClass().isAssignableFrom(Filho.class) ){
System.out.println("vr é do tipo filha");
}
}
}
como voce “sobrescreveu” o Pai, os metodos que
qq coisa posta ai, a gente vai fazendo uns testes
abraço
Isso é mais ou menos a minha afirmação no começo, acho que oq falto é que, ela só se aplica quando um Pai recebe um Filho, então neste caso Pai tem acesso aos metodos sobrescritos do Filho, mais os do Pai certo?
Como no seu exemplo eu só poderia usar chamarDaileon() se ele fosse sobrescrito.
exatamente, mas o importante é saber que o metodo do filho nunca vai ser acessado na classe pai, o acesso foi na em uma instancia da classe.
Um pequeno resumo, acho que fica mais claro assim, se estiver correto acho que entendi:
objeto Pai tem acesso aos metodos da classe Pai;
objeto Filho tem acesso aos metodos da classe Pai e classe filho;
e no caso de Pai variavel = new filho() tem acesso aos metodos da classe Pai e metodos sobrescritos da classe Filho;
Agora me confundi de novo, hehe!!
É que essa abordagem que voce perguntou é mais conceitual que pratica, o que normalmente cai em certificações hehe,
norlmalmente voce dará um Tv tv = new TV(); e nao como fiz abaixo para ilustrar melhor:
vamos tentar com o exemplo abaixo
class Eletronico{
private boolean ligado;
private int consumo;
public boolean getLigado(){
return this.ligado;
}
}
class TV extends Eletronico{
private int canal;
private int volume;
public int getCanal() {
return this.canal;
}
}
public class Teste{
public static void main(String[] args) {
Eletronico tv = new TV();
tv.getLigado();
tv.getCanal(); // tv é uma instancia de Eletronico que recebeu uma TV, vai dar erro por não achar o método getCanal() na classe pai.
}
}
melhorou?
entenda que a tv é um eletronico e mais alguma coisa, por isso essa abordagem de Eletronico tv = new TV(); fica estranha.
Achei uma resposta em 1 site perfeita:
Eletronico tv = new TV(); // VOCE ESTÁ CRIANDO UMA INSTANCIA DA TELEVISÃO UTILIZANDO ELETRONICO COMO REFERENCIA
de uma olhada aqui:
http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter04/overriding.html
Realmente estou estudando para um dia tirar a certificação, mas então,
Entendi seu exemplo, uma solução seria usar o cast, ai então eu poderia usar o metodo, é isso?ou então sobrescrever o metodo na classe tv!
Mas oq me confundi são os metodos sobrescritos e sobrecarregados!
Legal o link que vc passou, da pra entender o pq de fazer essa confusão de instanciar um objeto de uma classe superior.
Acho que o importante é saber apenas que ao fazer esse tipo de inicialização eu chamarei sempre os metodos mais especificos possiveis certo!
Valew mesmo fabiozanardi, pela paciencia ai comigo!
Joia, estamos ai para ajudar
adiciona no final do topico [RESOLVIDO]
abraço