Como posso entender Extends?

5 respostas
M

Eu já li em uma apostila uma frase que guardei:

TODA CLASSE EM JAVA ESTENDE OUTRA CLASSE

Isso eu entendo, mas não entendo como usar isso na prática. Vamos supor que eu tivesse duas classes:

class PrimeiraClasse
class SegundaClasse

Vamos supor que eu criei um objeto para a SegundaClasse, e chamei de obj, fiz assim:

SegundaClasse obj = new SegundaClasse();

Por tudo o que eu tenho lido em apostilas, etc, eu entendi que a PrimeiraClasse é chamada de superclasse , e a Segunda classe é subclasse, como se essa fosse classe-filha e a outra classe-mãe. Até aí eu entendo.

Esse objeto criado (obj) é da SegundaClasse, então ele também é um objeto da PrimeiraClasse, e terá acesso aos métodos que a classe-mãe oferece. O que eu não sei ainda, é se a classe mãe herda os métodos da classe-filha, se eu ao usar a PrimeiraClasse posso utilizar algum método criado na SegundaClasse.

Nessa confusão que eu ainda faço, eu fico sem saber, pra que lado é a herança? Em outras palavras , herdar de uma classe dá direito a essa classe de cima usar a de baixo? No testamento o pai já deixou as coisas pro filho, o filho herda, mas isso dá direito ao pai de usar as coisas do filho?

Desculpem , mas é muita coisa nova, não dá pra entender tudo de vez. Se alguém puder, dá uma luz aí, agradeço demais.

Marco

5 Respostas

J

Uma classe tem acesso a tudo o que está acima dela na hierarquia, nunca abaixo...

ex.:

public class Animal{
   public void correr(){
      System.out.println("correndo...");
   }
}

public Cao extends Animal{
   public void latir(){
       System.out.println("Latindo...");
   }
}

public Gato extends Animal{
   public void miar(){
      System.out.println("Miando...");
   }
}


Cao c = new Cao();
c.correr();
c.latir();
c.hashCode();

Gato g = new Gato();
g.correr();
g.miar();
g.hashCode();

Animal a = new Animal();
a.correr();
a.hashCode();
a.latir(); //ilegal
a.miar(); //ilegal

obs.: hashCode() é um metodo da classe java.lang.Object, herdada por Animal

Dê uma olhada em algum livro ou artigo sobre orientação a objetos, lá tem isso mais bem explicado...

BrunoBastosPJ

Olha só

public class Pessoa {
  public void nome(){
    System.out.println("Meu nome");
  }
  public void quemSou(){
    System.out.println("Sou uma Pessoa");
  }
  private void mostrarPessoa(){
    System.out.println("Sou so da classe pessoa");
  }
}

public class Aluno extends Pessoa{
  public void quemSou(){ //esse metodo sobreescreve o metodo quemSou() da classe Pessoa
    System.,out.println("Sou um aluno");
 }
}

criandos objetos

Pessoa pessoa = new Aluno();
Aluno aluno = new Aluno();
Pessoa pessoa2 = new Pessoa();

teste a chamada de métodos e você vai entender. Chame todos os metodos para cada objeto criado e você vai ver qual metodo pode ser chamado e qual nao pode.

Posta aqui qualquer duvida

M

Entendi legal com sua explicação, Jair.

Entendi assim, como a class Cao extends da class Animal, o objeto c da classe Cao, usou o metodo correr() herdado da class Animal, usou o método latir() criado na própria classe Cao, e pode usar o método hashCode() da classe geral Object. Mas, no último exemplo, o objeto a da class Animal não pode usar o método latir() da class Cao, nem miar() da class Gato, porque não herdam desses dois. Não sei se é exatamente isso, mas foi assim que eu entendi.

Mas ainda ficou uma dúvida. Você diz que a class Animal não pode usar um método da class Cao, mas eu pergunto, e se eu faço Animal estender a class Cao, mesmo assim não poderia? Assim:

public Animal extends Cao{

Animal b = new Animal();
b.correr();
b.latir();                // ainda assim isto é ilegal?
b.hashCode();

}

Se você me explicar essa última questão, acho que fica mais entendido para mim. Abraço.

Marco

J

Se Animal estender Cao, aí sim Animal terá acesso ao metodo latir(), porem Cao não terá acesso ao metodo correr() pois você terá que tirar a herança da classe Cao, se não você vai criar uma referencia circular, e sua classe não será compilada...

ex.:

public class Cao{
   public void latir(){
      System.out.println("Latindo...");
   }
}

public class Animal extends Cao{
   public void correr(){
      System.out.println("Correndo...");
   }
}

Animal a = new Animal();
a.correr();
a.latir();


Cao c = new Cao();
c.latir();
c.correr(); //ilegal

O codigo a seguir não será compilado pois há uma referencia circular:

public class Animal extends Cao{
   public void correr(){
      System.out.pritnln("Correndo...");
   }
}

public class Cao extends Animal{
   public void latir(){
      System.out.println("Latindo...");
   }
}
M

Ao Jair,

Agora fechou o entendimento dessa questão, Jair, entendi que qualquer classe pode extender a qualquer outra, então entendi assim , que a herança pode ser pra qualquer lado, é uma questão de escolha, mas se uma class A extends a class B, essa que é a superclasse ( a mãe), não tem como ser mãe da B e filha da B ao mesmo tempo, ou seja, duas classes não podem extender a si mesmas, por causa da referencia circular. Entendi perfeitamente. Muito obrigado Jair, você sempre me salvando! Valeu, cara. Abraço.

Marco

Criado 8 de junho de 2006
Ultima resposta 8 de jun. de 2006
Respostas 5
Participantes 3