domingo, 11 de maio de 2014

Herança no Java

Herança 

A herança em Java é o processo de criar uma ou mais classes filhas que derivam os atributos e métodos da classe mãe. A Classe mãe é denominada superclasse e as novas classes, suas herdeiras, são chamadas de subclasses. A necessidade de aplicação desse conceito surge quando temos que trabalhar com várias classes no Java e essas classes possuem características comuns. Então ao invés de criar várias classes com características iguais, criamos uma classe com as características comum que supra as necessidades das demais, e criamos as outras classes com suas características pessoais.
As subclasses herdam todos os atributos e métodos da superclasse, somando-se aos atributos e métodos específicos que estas possuem. Um problema é que as subclasses podem herdar métodos que não serão utilizados. Há ainda, a situação em que a função (método) herdada não atenda ao comportamento específico da subclasse, precisando ser reescrita, a fim de sobrescrever o método primário (polimorfismo).
A herança deve ser usada quando existir entre as superclasses e as subclasses a relação “é um”. Por exemplo: Vamos supor que tivéssemos uma classe chamada “Jogo” e desejássemos especializá-la com a criação das classes “JogoDeCarta”, “JogoDeTabuleiro” e “VideoGame”, seria necessária a pergunta: "JogoDeCarta" é um "Jogo"? "JogoDeTabuleiro" é um "Jogo"? Se a resposta for sim, o conceito de herança pode ser aplicado. Mas se tivéssemos ainda a intenção de criar a classe “CartaDeBaralho” para especializar “Jogo”, a mesma pergunta deveria ser feita. Como “CartaDeBaralho” não é um “Jogo”, e sim o compõe, o conceito não pode ser utilizado.
 No diagrama de classes, a herança é representada pela seta conforme exemplo abaixo:




Jogo é a superclasse, enquanto JogoDeCarta, JogoDeTabuleiro e VideoGame são as subclasses.
No BEANS, a herança é representada pelo uso da palavra reservada “Extends” utilizada após a declaração da subclasse. Sua utilização faz com que se estendam, ou seja, herdem as características da classe escrita após “Extends”. Veja o exemplo a seguir:


package br.com.fiap.modelo;

public class Jogo {

      
             private String nomeJogo;
             private String Categoria;
             private String fornecedor;
             private char genero;
             private float preco;
             public Jogo() {
                    super();
                    // TODO Auto-generated constructor stub
             }
             public Jogo(String nomeJogo, String categoria, String fornecedor,
                           char genero, float preco) {
                    super();
                    this.nomeJogo = nomeJogo;
                    Categoria = categoria;
                    this.fornecedor = fornecedor;
                    this.genero = genero;
                    this.preco = preco;
            
             }

package br.com.fiap.modelo;

public class JogoDeCarta extends Jogo {
       private int qtdeCartas;

       public JogoDeCarta() {
             super();
             // TODO Auto-generated constructor stub
       }

       public JogoDeCarta(int qtdeCartas) {
             super();
             this.qtdeCartas = qtdeCartas;
       }



package br.com.fiap.modelo;

public class JogoTabuleiro extends Jogo {
       private int qtdePecas;

       public JogoTabuleiro() {
             super();
             // TODO Auto-generated constructor stub
       }

       public JogoTabuleiro(int qtdePecas) {
             super();
             this.qtdePecas = qtdePecas;
       }


package br.com.fiap.modelo;

public class VideoGame extends Jogo {
       private String VideoGame;

       public VideoGame() {
             super();
             // TODO Auto-generated constructor stub
       }

       public VideoGame(String videoGame) {
             super();
             VideoGame = videoGame;
       }
  
Como podemos analisa no exemplo anterior, a classe “jogo” não contem o “extends” por ser a superclasse, porém as subclasses são obrigatórias senão o Java não compila. O que podemos perceber também, é que todas as classes devem conter o “super” para chamar o construtor da superclasse que é a classe “Jogo”.

Na saída, na hora de compilar o programa, o “super” é descrito como no exemplo abaixo;

System.out.println(“Informe o nome do jogo: ” +  super.getNomeJogo());
System.out.println(“Informe a quantidade de cartas: ” +  super.getQtdeCartas());
System.out.println(“Informe a quantidade de peças: ” +  super.getQtdePecas());
System.out.println(“Informe o país de origem ” +  super.getPaisDeOrigem());

Para se aprofundar mais sobre o assunto


Segundo o autor Deitel, do livro Java Como programar, “Herança é uma forma de reutilização de software na qual uma nova classe é criada, absorvendo membros de uma classe existente e aprimorada com capacidades novas ou modificadas. Com a Herança, os programadores economizam tempo durante o desenvolvimento de programa reutilizando software de alta qualidade testado e depurado. Isso também aumenta a probabilidade de um sistema ser implementado efetivamente”.
O autor aponta também que “Ao criar uma classe, em vez de declarar membros completamente novos, o programador pode designar que a nova classe deverá herdar membros de uma classe existente. Esta classe existente é chamada de superclasse, e a nova classe, de subclasse. Cada subclasse pode tornar-se a superclasse para futuras subclasses”.
E ainda, “Os relacionamentos de herança, forma estruturas hierárquicas do tipo árvore. Uma superclasse existe em um relacionamento hierárquico com suas subclasses. Quando as classes participam de relacionamentos de herança, elas se tornam ‘afiliadas’ com outras classes. Em alguns casos, uma classe é tanto uma superclasse como subclasse”.
“Um problema com herança é que uma subclasse pode herdar métodos que ela não necessita, ou que não deveria ter.” Mesmo quando um método de superclasse é adequado, a uma subclasse, essa subclasse precisa frequentemente de uma versão personalizada do método. “Nesses casos, a subclasse pode sobrescrever (redefinir) o método da superclasse com uma implementação adequada.”

Construtores em subclasses:

Sobre construtores em subclasses, um ponto interessante que o livro aborda é que “Instanciar um objeto de subclasse, inicia uma cadeia de chamadas de construtor em que o construtor de subclasse, antes de realizar suas próprias tarefas, invoca o construtor de sua superclasse direta explicita ou implicitamente. De maneira semelhante, se a superclasse é derivada de outra classe, o construtor de superclasse é derivada de outra hierarquia. E assim por diante. O corpo do construtor de subclasse original termina a execução por último. O último construtor de cada superclasse manipula as variáveis de instancia de superclasse que o objeto de subclasse herda.”

Clique no vídeo abaixo para visualizar uma breve explicação do conteúdo:





Aplicando o que você aprendeu sobre Herança no Java


01) Implemente os  diagrama de classes a seguir em Java utilizando o conceito de herança quando possível.




02) Por que no momento de criar construtores em uma classe herdada é necessária a implementação do super()?










********************************************************************************

Bibliografia de estudo:


Livros de pesquisa:

Como Programar em Java – Deitel
Use a Cabeça! Java – Kathy Sierra e Bert Bates


Alunos:

Ana Paula Mantovani           RM 72356
Gabriela Cristina da Silva   RM 71681
Letícia Macellone                 RM 69418
Priscilla Marinho Cordeiro  RM 72140

Um comentário: