Após o último artigo sobre classes que pode ser consultado aqui, o assunto deste irá focar-se no tema de herança de classes em Java. Tal como o conceito que todos sabemos, por exemplo, um dia vamos herdar tudo aquilo que os nossos pais têm. Não fugindo muito à regra, em Java acontece tal e qual a mesma situação. Para tal, vamos começar por criar um projecto novo com o nome “Heranca” mas antes, dar a resposta ao desafio lançado na semana passada.
Correção do desafio
Bastava na main, utilizar o código fornecido e usar as funções gets e sets. Esperamos que tenha acertado, caso contrário, terá outro desafio hoje para “vingar”!
public static void main(String[] args) { Jogador ronaldo = new Jogador("Ronaldo", 30, 85, 190, 20); Jogador messi = new Jogador("Messi", 29, 10, 100, 20); //Escrever o nome do primeiro jogador System.out.println("Nome: " + ronaldo.getNome()); // Escrever o nome do segundo jogador System.out.println("Nome: " + messi.getNome()); // Mudar o nome do Ronaldo para Quaresma ronaldo.setNome("Quaresma"); // Mudar o nome do Messi para Maradona messi.setNome("Maradona"); //Escrever o nome do primeiro jogador (Sera Quaresma) System.out.println("Nome: " + ronaldo.getNome()); // Escrever o nome do segundo jogador (Sera Maradona) System.out.println("Nome: " + messi.getNome()); }
Herança
Tal como poderá ver na imagem seguinte, as classes “filhos” irão herdar as propriedades da classe “pai”. Quero com isto dizer que todos os atributos e funções que estiverem na classe “animal” serão herdados na classe “cão” e “gato”:
O próximo passo será então aplicar o que observamos na imagem. Para isso, vamos proceder à criação de uma classe “Animal”. Se pensarmos na situação de um animal, todos os animais têm um nome, uma idade e, todos eles nascem (construtor) e morrem. Acontece que cães e gatos têm uma esperança média de vida diferentes, pelo que morrem em alturas diferentes.
[wptab name=’Animal’]
Então repare que na classe animal, o método “morrer” é “abstract”, isto porque a função pertence a todos os animais mas, cada animal tem a sua forma de morrer pelo que o corpo da mesma só será programado dentro de cada um dos filhos:
public abstract class Animal { int idade; String nome; // Construtor e gets public Animal(int idade, String nome){ this.idade = idade; this.nome = nome; } public int getIdade(){ return idade; } public String getNome(){ return nome; } //fim construtor e gets // função de movimento public abstract void morrer(); }
Com a classe animal criada, vamos então proceder à criação da classe “Cão”
[/wptab]
[wptab name=’Cão’]
Com a classe cão criada, o leitor terá de acrescentar uma pequena linha de código que fará toda a diferença, adicionando apenas a linha “extends Animal”:
public class Cao extends Animal{ (...)
O que está a ser passado para código é que o cão é uma extensão da classe animal. Rapidamente vai perceber que o código já está a dar erros pelo que poderá utilizar todas as ferramentas do Netbeans para o ajudar. Com o rato, clique na lampada à esquerda e clique em “Implement all abstract methods”:
E repare que todos os métodos da classe Animal foram implementados. Neste caso, o morrer. Então vamos concluir esta classe da seguinte forma:
public class Cao extends Animal{ boolean morto; public Cao(int idade, String nome) { // Passagem dos argumentos para o construtor Animal que é a classe super (pai) super(idade, nome); // atributo só da classe cão morto = false; } @Override public void morrer() { if(idade==2){ System.out.println("O cao morreu :( "); morto = true; }else{ idade++; ladrar(); } } // Funcao apenas da classe cao public void ladrar(){ System.out.println("aoooooo"); } }
No código acima, repare no construtor. A chamada do “super” é importante pois recorde o leitor, a classe animal tem um construtor com atributos obrigatórios, pelo que aquele super está a passar os argumentos obrigatórios à classe construtor. Temos também uma variável que apenas pertence à classe cão (atributo morto) e ainda estamos a indicar que quando o cão atingir a idade de 2 anos, irá morrer. Sempre que um ano passa, o cão irá ladrar (esta função é uma função que pertence apenas ao cão pelo que é implementada na classe “cao”.
[/wptab]
[wptab name=’Gato’]
À semelhança do que se fez para a classe cão, implementar a classe gato. A diferença é que nesta, o gato morre quando tem 5 anos de idade:
public class Gato extends Animal{ boolean morto; public Gato(int idade, String nome) { // Passagem dos argumentos para o construtor Animal que é a classe super (pai) super(idade, nome); // Atributo só da classe gato morto = false; } @Override public void morrer() { if(idade==5){ System.out.println("O gato morreu :( "); morto = true; }else{ idade++; miar(); } } // Funcao apenas da classe gato public void miar(){ System.out.println("Miauuu"); } }
[/wptab]
[wptab name=’Correr exemplo’]
Para testarmos o exemplo, nada melhor que na função main colocarmos o seguinte código e verificar que recebemos a mensagem de o cão a ladrar e o gato a miar. Logo de seguida, como a idade do cão irá atingir os 2 anos, este irá falecer:
public static void main(String[] args) { Cao cao = new Cao(1, "Bob"); Gato gato = new Gato(3, "Tobias"); // O cao não vai morrer mas a sua idade passa para 2 e vai ladrar cao.morrer(); // O gato não vai morrer mas vai miar gato.morrer(); // O cao vai morrer pois a sua idade é 2 cao.morrer(); }
[/wptab]
[end_wptabset]
Desafio
Como de costume, iremos lançar um desafio ao leitor. Desafiamos que tente implementar agora, um novo animal. Um “Cachorro”.
[wptab name=’Imagem’]
A seguinte imagem poderá ajudar a compreender o objetivo:
[/wptab]
[wptab name=’Função’]
O cachorro deverá ter a seguinte função:
public void asneira(){ System.out.println("fiz asneiras"); }
[/wptab]
[end_wptabset]
Mostre-nos que realmente percebeu o artigo ou deixe as suas dúvidas em comentário ou envie mail para [email protected]