Para conseguirmos criar um bom programa em uma linguagem orientada a objetos, temos que ter uma base sólida de fundamentos sobre como criar os nossos objetos. No caso da linguagem Java, como sabemos, o trabalho de instanciar estes objetos cabe às classes. Ao entendermos os bons princípios de desenhos de classes em Java, estaremos aptos a escrever unidades de código independentes o suficiente para serem reutilizadas de várias formas e mantendo um código robusto.
Para compreendermos a importância de um bom desenho de classes, vamos considerar um fabricante de automóveis. Uma grande empresa construtora de automóveis não fabrica todas as partes para cada um dos seus modelos. Várias peças, como rodas, bancos, pneus, sistema de freios, velas, etc., já vêm prontas, de diferentes fabricantes, e depois são montadas nos seus respectivos carros. Este modelo de fabricação especializado por peças ajuda a manter um custo baixo, ao mesmo tempo em que traz uma alta qualidade, criando uma resposta rápida e eficiente às necessidades do mercado. Assim, a principal responsabilidade do fabricante de automóveis é a de desenhar seus carros e montá-los a partir de peças já existentes.
A Programação Orientada a Objetos (POO) nasceu desta mesma ideia de se utilizar módulos pré-existentes na construção de aplicações. Este modelo de programação fornece aos desenvolvedores uma maneira natural e elegante de dividir aplicações em peças pequenas e reutilizáveis, chamadas de objetos, o que viabiliza a construção de aplicações de forma mais eficiente, através da reutilização das coleções de componentes disponíveis.
Assim como as construtoras de automóveis, temos disponível na linguagem Java várias peças, ou objetos, prontos para serem utilizados, quer sejam objetos do próprio framework, quer sejam objetos de terceiros (como da Apache, da SpringSource, etc.), que nos disponibilizam tais recursos através de arquivos JAR (Java ARchive).
Sendo assim, a nossa responsabilidade é a de estruturar nossas aplicações de forma concisa, criando, a partir das peças que temos disponíveis, programas robustos de maneira eficaz. Para isso, vamos ver o que temos disponível na linguagem de programação Java que nos permite desenhar nossas classes de modo a melhor aproveitarmos esses recursos.
Herança
O que é herança em Java? A herança pode ser definida como o processo em que um objeto adquire as propriedades de outro. É um mecanismo para criar uma subclasse que irá herdar atributos e métodos de uma classe já existente. Com o uso de herança, a informação se torna gerenciável por uma ordem hierárquica, como veremos nos exemplos mais à frente. Mas, como a linguagem Java suporta a herança entre objetos?
Sabemos que diferentes tipos de objetos têm, frequentemente, uma certa quantidade de características ou comportamentos em comum. Em Java, estas características e comportamentos são ser herdados de objetos mais genéricos para outros mais específicos, através da utilização de subclasses, o que é definido com a palavra extends. No entanto, a linguagem possui uma restrição que determina que uma classe possa estender apenas uma classe. Esta restrição é chamada de herança única, que evita vários problemas da herança múltipla (como acontece na linguagem C++) onde, por exemplo, um objeto pode herdar dois métodos com o mesmo nome de classes distintas, podendo assim entrar em conflito. Mas ao mesmo tempo que a linguagem Java coloca esta restrição por motivos de segurança, ela também fornece a simulação de herança múltipla através da implementação de interfaces (este assunto será tratado mais à frente), permitindo-nos usufruir dos seus maiores benefícios, sem sofrer dos seus inconvenientes.
Os aspectos mais importantes da herança que devemos ter em conta são: a reutilização de código, o polimorfismo e a invocação de métodos virtuais. Vejamos um exemplo prático para entendermos estes aspectos.
Herança na prática
Para entender melhor como funciona a herança em Java, vamos criar um programa que guarde as informações de empregados de uma empresa. Sabemos que existem diversos tipos de empregados, como gestores, engenheiros, programadores, secretárias, estagiários, etc. Cada um tem um tipo específico de trabalho e suas particularidades, mas todos eles são, para a empresa, um empregado. E para a empresa, todos os empregados devem ter, ao menos, um identificador único, um nome e um salário (para simplificar o exemplo). A Listagem 1 mostra o código que representa o empregado.
Listagem 1. Classe que representa um empregado - Employee.
public class Employee {
private String _id;
private String _name;
private double _salary;
public Employee(String id, String name, double salary) {
_id = id;
_name = name;
_salary = salary;
}
public String getId() {
return _id;
}
public String getName() {
return _name;
}
public double getSalary() {
System.out.println("Salário do empregado.");
return _salary;
}
}
Para deixarmos o exemplo um pouco mais simples, vamos representar apenas quatro tipos de empregados da empresa, a saber: gestores, engenheiros, estagiários e diretores. Por definição da empresa, o estagiário é um empregado sem qualquer regra específica sobre ele, ou seja, o que ele recebe de salário é o valor que fica guardado na variável salary, sem qualquer alteração, não tendo bônus ou qualquer outro benefício (na ...
Confira outros conteúdos:
Perguntas frequentes
Nossos casos de sucesso
Eu sabia pouquíssimas coisas de programação antes de começar a estudar com vocês, fui me especializando em várias áreas e ferramentas que tinham na plataforma, e com essa bagagem consegui um estágio logo no início do meu primeiro período na faculdade.
Estudo aqui na Dev desde o meio do ano passado!
Nesse período a Dev me ajudou a crescer muito aqui no trampo.
Fui o primeiro desenvolvedor contratado pela minha
empresa. Hoje eu lidero um time de desenvolvimento!
Minha meta é continuar estudando e praticando para ser um
Full-Stack Dev!
Economizei 3 meses para assinar a plataforma e sendo sincero valeu muito a pena, pois a plataforma é bem intuitiva e muuuuito didática a metodologia de ensino. Sinto que estou EVOLUINDO a cada dia. Muito obrigado!
Nossa! Plataforma maravilhosa. To amando o curso de desenvolvimento front-end, tinha coisas que eu ainda não tinha visto. A didática é do jeito que qualquer pessoa consegue aprender. Sério, to apaixonado, adorando demais.
Adquiri o curso de vocês e logo percebi que são os melhores do Brasil. É um passo a passo incrível. Só não aprende quem não quer. Foi o melhor investimento da minha vida!
Foi um dos melhores investimentos que já fiz na vida e tenho aprendido bastante com a plataforma. Vocês estão fazendo parte da minha jornada nesse mundo da programação, irei assinar meu contrato como programador graças a plataforma.
Wanderson Oliveira
Comprei a assinatura tem uma semana, aprendi mais do que 4 meses estudando outros cursos. Exercícios práticos que não tem como não aprender, estão de parabéns!
Obrigado DevMedia, nunca presenciei uma plataforma de ensino tão presente na vida acadêmica de seus alunos, parabéns!
Eduardo Dorneles
Aprendi React na plataforma da DevMedia há cerca de 1 ano e meio... Hoje estou há 1 ano empregado trabalhando 100% com React!
Adauto Junior
Já fiz alguns cursos na área e nenhum é tão bom quanto o de vocês. Estou aprendendo muito, muito obrigado por existirem. Estão de parabéns... Espero um dia conseguir um emprego na área.