Você está na página 1de 14

PROGRAMAÇÃO

ORIENTADA
A OBJETOS

Raiza Artemam de Oliveira


Herança na orientação
a objetos
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:

 Definir o que é herança em orientação a objetos.


 Utilizar sobrecarga de construtor na herança.
 Construir uma aplicação com estrutura de herança fazendo uso de
construtores para criar objetos.

Introdução
As linguagens de programação que possuem paradigma orientado
a objetos são amplamente utilizadas, tanto na indústria quanto na
academia. A primeira linguagem de programação totalmente orien-
tada a objetos teve origem na década de 1970, chamada de Smalltalk
(GOLDBERG, 1984). Na década seguinte, começaram a surgir outras
linguagens com o mesmo paradigma, como Delphi, Pascal e Java.
A linguagem Java ganhou destaque e se popularizou, pois fornece,
entre outras coisas, portabilidade.
Nesse contexto de orientação a objetos, alguns conceitos são funda-
mentais, sendo um deles o de herança. O relacionamento de herança é
algo inovador na orientação a objetos e forneceu um meio de abstrair
informações de formas mais precisas.
Neste capítulo, você estudará sobre o princípio de herança em Java
na orientação a objetos. Além disso, verá como utilizar a sobrecarga de
construtores. Por fim, verá como construir uma aplicação com estrutura
de herança utilizando construtores para criar objetos.
2 Herança na orientação a objetos

1 Herança no paradigma orientado a objetos


O paradigma de programação orientado a objetos possui princípios e conceitos
que são comuns a todas as linguagens que seguem esse paradigma, como C++,
PHP e Java. Por isso, compreender os conceitos do paradigma orientado a
objetos é fundamental para que se possa desenvolver em qualquer linguagem
que o siga.
De acordo com Rumbaugh et al. (1991), o paradigma de programação
orientado a objetos é uma maneira de se pensar os problemas da programação
utilizando conceitos do mundo real. Nessa abordagem, o componente funda-
mental é o objeto, que combina estrutura (classe) e comportamento em uma
única entidade. Os principais conceitos da programação orientada a objetos
são: classes, objetos, associação, encapsulamento, polimorfismo e herança.
Juntos, esses princípios compõem a base da lógica e a estrutura de programas
orientados a objetos.
A classe representa uma abstração de quaisquer objetos no mundo real.
Por abstração, entende-se a capacidade de descrever somente as principais
características, sem se ater a detalhes. Por exemplo, pode-se definir uma
classe Sofa para descrever um sofá. Os atributos dessa classe correspondem
às características dos objetos que pertencem a ela. No caso da classe Sofa,
os atributos podem ser número de lugares, cor e material. Observe, a seguir,
o código em Java.

public class Sofa{


private int numeroLugares;
private String cor;
private String material;
}

Agora, imagine um sistema que gerencia o estoque de uma loja de móveis.


Nesse cenário, o sistema deverá manipular informações sobre diferentes tipos
de móveis. Por exemplo, poderíamos criar uma classe para sofá, outra classe
para mesa, mais uma para armário. No entanto, todos esses objetos possuem
algo em comum, são todos móveis. Dessa forma, é possível criar uma classe
Movel para manipular essas informações. Observe, a seguir, o código para
a classe Movel.
Herança na orientação a objetos 3

public class Movel{


private int numeroLugares; //atributo de sofá e mesa
private String cor;//atributo de todos os móveis
private String material;// atributo de todos os móveis
private numeroPortas; //atributo de guarda-roupas e armários
}

Como pode ser visto na Figura 1, nesse caso, tem-se, em uma mesma
classe, muitos atributos que não pertencem ao mesmo objeto. Por exemplo, ao
instanciar um objeto sofa da classe Movel, esse objeto não possui informa-
ções sobre o número de portas. É importante ressaltar que manter atributos e
responsabilidades em um objeto que não pertencem a ele não é uma prática
correta de programação.
Para lidar com esse cenário, pode-se manter na classe Movel o que é
comum a todos os móveis e criar classes específicas para cada um dos móveis
que possuem características diferentes. A Figura 2 apresenta o diagrama de
classes com a estrutura de como se pode modelar para que as classes não
repitam atributos.

Figura 1. Diagrama de classes com relacionamento de herança.


4 Herança na orientação a objetos

Figura 2. Implementação da classe Movel em Java.

Essa relação, em que uma classe possui elementos comuns e as demais


classes derivem dela, é chamada de herança. No diagrama de classes, a di-
reção da seta indica a herança. Nesse caso, as classes Sofa, Armario e
Mesa herdam da classe Movel, ou pode-se dizer que elas são classes-filhas
da classe Movel.
Em uma relação de herança, as classes-filhas possuem acesso aos atributos
e métodos da classe-pai, com exceção dos métodos e atributos indicados como
protected. Para compreender como esse conceito se aplica na programação,
observe a Figura 3, que apresenta o código da implementação das classes
Movel, Sofa, Armario e Mesa.
Herança na orientação a objetos 5

Figura 3. Implementação de classes-filhas da classe Movel


em Java.

A marcação extends na declaração da classe indica a relação de herança.


É possível ler public class Sofa extends Movel(){} da seguinte
forma: a classe Sofa estende a classe Movel. Os objetos da classe-filha
possuem todos os atributos e métodos da classe-pai. Por exemplo, se um objeto
da classe Sofa for criado, ele terá os atributos cor, valor, material e assentos.
6 Herança na orientação a objetos

Ao trabalhar com relacionamentos entre as classes no Java, fique atento ao conceito


de encapsulamento. Existem dois níveis de encapsulamento:
1. Nível de classe: quando o acesso de uma classe inteira é determinado, o qual
pode ser public.
2. Nível de membro (atributo ou método): quando o acesso de atributos ou mé-
todos de uma classe são determinados, os quais podem ser public, private,
protected.
Os modificadores de acesso em Java são os seguintes:
 public: pode ser acessado de qualquer lugar e por qualquer entidade que possa
visualizar a classe a que ele pertence.
 private: não pode ser acessado ou utilizado por nenhuma outra classe. Não se
aplica às classes, somente para seus métodos e atributos. Os atributos e métodos de
uma classe-pai definidos como private não podem ser vistos pelas classes-filhas.
 protected: torna o membro acessível às classes do mesmo pacote ou por meio
de herança.

2 Sobrecarga de construtor
As classes possuem métodos responsáveis por inicializar o objeto, os quais são
chamados de construtores. Em Java, o construtor é definido como um método
cujo nome deve ser o mesmo da classe e sem indicação do tipo de retorno.
O construtor é unicamente invocado no momento da criação do objeto, por
meio do operador new (DEITEL; DEITEL, 2017). O retorno desse operador
é uma referência para o objeto recém-criado.
Em Java, o construtor pode receber argumentos, como em qualquer mé-
todo. Uma classe pode possuir mais de um construtor, o que é chamado de
sobrecarga (DEITEL; DEITEL, 2017). Observe, por exemplo, os construtores
definidos para a classe Point do pacote java.awt. A classe java.awt.
Point tem dois campos, x e y, do tipo int. Essa classe oferece um construtor
que permite criar um ponto representando as suas coordenadas, passadas
como argumentos para o construtor:

public Point(int x, int y)


Herança na orientação a objetos 7

Esse construtor constrói e inicializa um ponto no local especificado (x, y)


no espaço de coordenadas. Além disso, existe também outro construtor que
recebe como argumento um outro objeto da classe Point:

public Point(Point p)

O construtor que recebe um argumento constrói e inicializa um ponto


no mesmo local onde o objeto point foi especificado. Por fim, a classe Point
possui também um construtor-padrão, que não recebe nenhum parâmetro:

public Point()

O construtor-padrão constrói e inicializa um ponto na origem (0, 0) do


espaço de coordenadas. Por padrão, toda classe no Java possui, pelo menos,
um construtor definido. Se nenhum construtor for explicitamente definido
na classe, um construtor-padrão, que não recebe argumentos, é incluído para
a classe pelo compilador Java. No entanto, se algum método construtor for
definido, o construtor-padrão não será criado automaticamente, de modo
que, para utilizá-lo, seria preciso declarar um construtor sem argumentos
explicitamente.
Segundo Deitel e Deitel (2017), no momento em que um construtor é invo-
cado, a seguinte sequência de ações é executada para a criação de um objeto:

 O espaço para o objeto é alocado em memória e seu conteúdo é inicia-


lizado com zeros.
 O construtor da classe-pai é invocado. Se a classe não possui um re-
lacionamento de herança, por padrão, o Java chama o construtor da
classe Object.
 Os membros da classe são inicializados para o objeto, seguindo a ordem
em que foram declarados na classe.
 O restante do corpo do construtor é executado.

Seguir essa sequência é uma necessidade, a fim de garantir que, quando o


corpo de um construtor esteja sendo executado, o objeto já terá à disposição as
funcionalidades mínimas necessárias, quais sejam aquelas definidas por seus
ancestrais. O primeiro passo garante que nenhum campo do objeto terá um
valor arbitrário que possa tornar erros de não inicialização difíceis de detectar.
8 Herança na orientação a objetos

3 Construindo uma aplicação Java com herança


Para melhor compreensão dos conceitos apresentados sobre herança entre
classes, analisaremos um exemplo de como implementar uma aplicação em Java
para gerenciar os funcionários em uma universidade. Essa aplicação deve ser
capaz de realizar o cadastro de alunos, professores e técnicos administrativos.
Nesse contexto, a primeira abstração que se pode fazer é que professores e
técnicos são pessoas e possuem características em comum, como nome, data
de nascimento, CPF e e-mail. Dessa forma, crie uma classe Pessoa para
agrupar os atributos comuns, conforme a seguir:

import java.util.Date;

public class Pessoa {

public String nome;


public String cpf;
public Date data _ nascimento;

//Constructor da classe pessoa


public Pessoa(String _ nome, String _ cpf, Date _ data) {
this.nome = _ nome;
this.cpf = _ cpf;
this.data _ nascimento = _ data;
}

A classe Pessoa possui os atributos nome, cpf e data_nascimento


e um construtor, que inicializa esses valores. Agora, deve-se implementar as
classes para professor e técnico administrativo. Contudo, observe que esses
dois também possuem algo em comum pelo qual podem ser agrupados: ambos
são funcionários. Dessa forma, crie uma classe Funcionario:

import java.util.Date;

//Funcionario é classe herdeira da classe Pessoa


public class Funcionario extends Pessoa{

private double salario;


Herança na orientação a objetos 9

public Funcionario(String _ nome, String _ cpf, Date _ data) {


super( _ nome, _ cpf, _ data); //chamada do constructor pai
}

//calcula salario do funcionário


public double calculaSalario(int horasTrabalhadas) {
return horasTrabalhadas*10;
}

A classe Funcionario estende, ou herda, a classe Pessoa. A classe


Funcionario possui o atributo salario, bem como um método para
calcular esse atributo de acordo com a quantidade de horas trabalhadas por
cada funcionário. Além disso, observe que o construtor da classe Fun-
cionario possui a chamada super, que indica que está sendo cha-
mado o método construtor da classe-pai. Ou seja, quando se instancia
um objeto da classe Funcionario, é feita uma chamada para o cons-
trutor da classe Pessoa. Agora, escreva as classes para Professor e
TecnicoAdministrativo:

import java.util.Date;

public class Professor extends Funcionario {

public Professor(String _ nome, String _ cpf, Date _ data) {


super( _ nome, _ cpf, _ data);
}

public class TecnicoAdministrativo extends Funcionario{

public TecnicoAdministrativo(String _ nome, String _ cpf,


Date _ data) {
super( _ nome, _ cpf, _ data);
}
}
10 Herança na orientação a objetos

Ambas as classes, Professor e TecnicoAdministrativo, herdam


a classe Funcionario, que, por sua vez, também herda a classe Pessoa.
Dessa forma, um objeto professor possui todos os atributos e métodos das
classes Pessoa e Funcionario. Observe, a seguir, como fica a instanciação
de um objeto da classe Professor.

Professor prof = new Professor(“Paulo”, “622.875.720-23”, new


Date());

//Calcula salario da classe Funcionario


System.out.println(prof.calculaSalario(400));

//Atributos Nome e CPF da classe Pessoa


System.out.println(prof.getNome));
System.out.println(prof.getCpf));

Ambas as classes, Professor e TecnicoAdministrativo, pos-


suem o atributo salario, que está na classe Funcionario. No entanto,
o cálculo do salário do professor é diferente do cálculo do salário do técnico.
Para explicitar essa diferença, pode-se sobrescrever na classe Professor
o método calculaSalario, passando, além da quantidade de horas, a
classe de contratação.

public class Professor extends Funcionario {

public Professor(String _ nome, String _ cpf, Date _ data) {


super( _ nome, _ cpf, _ data);
}

//sobrescreve o calculo de salario do funcionário


public double calculaSalario(int horasTrabalhadas, double
bonificação) {
return super.calculaSalario(horasTrabalhadas)*bonificacao;
}

}
Herança na orientação a objetos 11

Agora, quando o método para calcular o salário do objeto professor


for chamado, ele executará o método calculaSalario de acordo com a
quantidade de parâmetros passados a ele. Se ele receber dois parâmetros, será
chamado o método da classe Professor; se receber apenas um parâmetro,
então será chamado o método calculaSalario da classe Funcionario.
Observe como fica a instanciação dos objetos:

Professor prof = new Professor(“Paulo”, “622.875.720-53”, new


Date());
TecnicoAdministrativo tecnico = new TecnicoAdministrativo(“João”,
“457.414.970-12”, new Date());

//Calcula salario da classe Professor


System.out.println(“Salario do professor: “+prof.calculaSala-
rio(60 , 1.5));

//Calcula salario da Classe Funcionario


Syste m.out.println(“Salario do Técnico: “+tecnico.
calculaSalario(60));

DEITEL, P.; DEITEL, H. Java: como programar. 10. ed. São Paulo: Pearson Education do
Brasil, 2017.
GOLDBERG, A. Smalltalk-80: the interactive programming environment. Boston: Addison-
-Wesley, 1984.
RUMBAUGH, J. et al. Object-oriented modeling and design. Englewood Cliffs: Prentice-
-Hall, 1991.

Você também pode gostar