Você está na página 1de 113

Introdução a Programação Orientada a Objetos

Conteudista: Prof. Esp. Alexander Gobbato P. Albuquerque


Revisão Textual: Prof.ª M.ª Rosemary To oli

Objetivos da Unidade:

Estudar os conceitos básicos para a criação e entendimento dos conceitos da orientação;

Mostrar a diferença entre programação estruturada e a programação orientada a objetos.

ʪ Contextualização

ʪ Material Teórico

ʪ Material Complementar

ʪ Referências
1 /4

ʪ Contextualização

Um paradigma de programação fornece (e determina) a visão que o programador possui sobre a estruturação e execução do
programa. Assim como ao resolver um problema podemos adotar uma entre variadas metodologias, ao criar um programa
podemos adotar um determinado paradigma de programação para desenvolvê-lo.

Os sistemas projetados atualmente são maiores, mais complexos e sujeitos a constantes alterações e adaptações aos diversos
ambientes computacionais. Através do encapsulamento de informações, a reutilização de esforços empregados em projetos
anteriores e a modificação do sistema se tornaram mais fáceis.
2/4

ʪ Material Teórico

Introdução
A metodologia Orientação a Objetos é baseada em “objetos do mundo real”, e por este motivo é mais intuitiva ao ser humano, tais
como: objetos e atributos, classes e membros, estruturas e componentes, ação e reação. Os métodos de desenvolvimento de
software anteriores ao surgimento desse paradigma organizam a especificação de um sistema de acordo com suas funções ou com
os dados manipulados. Geralmente, esses métodos apresentam dificuldades na transição da representação do sistema em uma fase
para outra do processo de desenvolvimento (da Análise para o Projeto e, do Projeto para a Implementação).

Em um sistema orientado a objetos, os dados e todas as operações, que manipulam esses dados, são agrupados em uma única
estrutura: “as classes”. Desde o início do desenvolvimento desses sistemas e, em todas as suas fases, o analista trabalha com o
mesmo elemento de abstração, os objetos.

Estudo das técnicas de programação utilizando o paradigma da orientação a objetos, bem como ferramentas em laboratório para o
desenvolvimento de aplicações científicas e comerciais.

Importância do Software
Dependência generalizada da vida moderna em sistemas de computação.

O software é parte cada vez maior dos custos e do sucesso desses sistemas.

Produzir software é uma atividade inerentemente complexa:

Independe de leis físicas, restrições de materiais e processos de manufatura;

Requer métodos disciplinados de desenvolvimento.

Histórico
A orientação a objetos (OO) foi utilizada primeiramente na década de 70.

A Origem na linguagem SIMULA-67 (década de 60 – Noruega), que já implementava alguns conceitos da Orientação a Objetos.
SIMULA-68 foi a primeira linguagem a suportar os conceitos da Orientação a Objetos.

Smaltalk, criada pela Xerox, popularizou e incentivou a Orientação a Objetos.

Outras linguagens de Orientação a Ojbjetos: C++, Object Pascal (Delphi), C#, Java.

Java, de fato, popularizou a Orientação a Objetos.

Programa Estruturada versus Programa Orientado a Objetos

Estruturado: Ênfase nos procedimentos, implementados em blocos estruturados, com


comunicação entre procedimentos por passagem de dados;

Orientado a objetos: Dados e procedimentos fazem parte de um só elemento básico (objeto). Os elementos básicos
comunicam-se entre si, caracterizando a execução do programa à Dados e procedimentos agrupados em um só
elemento.

Figura 1

Por que a Tecnologia de Objetos?


Os principais problemas do software hoje são:

Diminuir o custo e o tempo da mudança;

Aumentar a capacidade e facilidade de adaptação.


Objetos são especialmente bons para:

Reduzir o tempo necessário para adaptar um sistema existente (reação mais rápida à
mudanças no seu ambiente de negócio);

Reduzir o esforço, a complexidade e os custos associados à mudança.

Orientação a Objetos – Fase e Responsabilidade

Análise:

Entender o domínio do problema;

Definir a estrutura estática da aplicação;

Criar vocabulário comum de conceitos.

Projeto:

Apresentar a melhor solução para problema;

Definir a estrutura dinâmica da aplicação;

Fazer especificação.

Implementação:

Construir a aplicação em conformidade com a especificação;

Fazer testes e validações;

Fazer implantação.
Figura 2

Conceito da Análise e Projeto Orientado a Objetos


A metodologia de Análise e Projeto Orientado a Objetos é um processo que contém suporte a notação para definição de
software baseado no conceito de objetos que combinam estrutura e comportamento na mesma entidade.

Este processo geralmente não é linear, mas é previsível, cíclico, e passível de teste e rastreamento.

A notação OOA&D (Object-oriented Analysis and Design) é definição visual comum que permite as pessoas compartilharem
conhecimento sobre sistema – OOA&D consiste em três partes:

Processo (São as atividades);

Notação (demonstra a interação dos objetos);

Regras (descreve como o sistema deve trabalhar).

Principais Conceitos
As duas principais características da Orientação a objetos são Classes e Objetos.

O que é uma classe?


Saiba Mais
Classe – [Do lat. classe.] S. f. 1.: Numa série ou num conjunto, grupo ou divisão que apresenta
características semelhantes;

21. Inform. Em programação ou modelagem orientada a objetos (v. orientação a objetos),


categoria descritiva geral, que abrange o conjunto de objetos que compartilham uma ou mais
características quanto a seus itens de dados e procedimentos associados. 22. Lóg. Agrupamento
de objetos que têm uma ou mais características em comum.

“Uma classe é uma entidade descreve um conjunto de objetos com propriedades e


comportamentos semelhantes e com relacionamentos comuns com outros objetos”.

As classes são as partes mais importantes de qualquer sistema orientado a objetos.

Usamos as classes para capturar o vocabulário do sistema que está em desenvolvimento. Essas
classes podem incluir abstrações que são parte do domínio do problema, assim como as classes
que fazem uma implementação. Podemos usar ainda as classes para representar itens de
software, de hardware e até itens que sejam somente conceituais.

Contexto: Venda de flores.


Chris precisa enviar flores para o amigo Robin que mora em outra cidade.
Figura 3 – Venda de Flores
Fonte: Adaptada de BUDD, 2002

Agentes e Comunidades

Chris passa uma mensagem para o florista contendo uma requisição (entregar flores para Robin em outra cidade);

É responsabilidade do florista satisfazer esta requisição;

Chris não sabe o método que o florista irá utilizar para entregar flores em outra cidade e também desconhece os
detalhes desta operação.

POO é estruturada como uma comunidade de agentes que interagem chamados de


objetos;

Cada objeto tem um papel a ser executado;

Cada objeto fornece serviços ou executam ações que podem ser utilizadas por
outros membros da comunidade.
Figura 4
Fonte: Adaptada de BUDD, 2002

Mensagens e Métodos

Uma ação é a transmissão de uma mensagem para um agente (objeto) responsável pela ação;

Quando um objeto aceita a mensagem ele é responsável por tratar a ação;

Em resposta a esta mensagem o receptor executará algum método para atender a solicitação.

Responsabilidades

Descreve o comportamento em termos de responsabilidades;

O conjunto de responsabilidades de um objeto é descrito através e protocolos

Classes e Instâncias

O Florista é um exemplo de classe, pois representa todos os floristas. O Florista Pitoco, e o Bodjo são instâncias
desta classe;

Um outro exemplo de classes e instâncias é forma de gelatina e as gelatinas.


Figura 5

Notação UML para Classe e Objetos


A identificação para as classes em UML é um retângulo divido em três partes. Caso não queira exibir os detalhes da classe você pode
suprimir alguns detalhes como atributo e os métodos, conforme mostram as Figuras a seguir:
Figura 6

A seção superior é reservada para a identificação da classe. Essa seção é obrigatório o preenchimento. O nome da classe deve conter
somente letras e palavras concatenadas e a primeira letra deve ser escrita em maiúsculo.

Exemplo de nomes:

Aluno;

Empregado;

Curso.

Na segunda seção são exibidos os atributos da classe, esses atributos são variáveis membro da classe que podem ser usadas pelos
métodos tanto para acesso ou escrita.

O atributo pode ser criado com as seguintes notações:

+ Acesso público, tanto funções membros da classe e funções externas podem ter acesso ao atributo público;

– Acesso privado, somente funções membros da classe tem acesso a esses atributos;
# Acesso protegido, o atributo também é privado, mas as funções membros das classes derivadas também tem
acesso aos atributos.

Na última seção são exibidos os métodos da classe, ou seja, as funções que a classe possui.

Os métodos também seguem a mesma notação que os atributos.

+ Acesso público, tanto funções membros da classe e funções externas podem ter acesso ao atributo público;

– Acesso privado, somente funções membros da classe tem acesso a esses atributos;

# Acesso protegido, o atributo também é privado mas as funções membros das classes derivadas também tem
acesso aos atributos.
3/4

ʪ Material Complementar

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Aprenda Programação Orientada a Objetos em 21 Dias


SINTES, A. Aprenda Programação Orientada a Objetos em 21 Dias. Editora: Pearson. 1. ed.

Java: Como Programar


DEITEL, P. J.; DEITEL, H. M. Java: Como Programar. Editora: Pearson. 8. ed.

Core Java – Volume 1


HORSTMAN, C. S.; CORNELL, G. Core Java: Volume 1. Editora: Pearson.

Leitura

Orientação a Objetos – Simples Assim!

Clique no botão para conferir o conteúdo.

ACESSE
4/4

ʪ Referências

DEITEL, H. M. Java: Como Programar. 6. ed. Porto Alegre: Bookman, 2007.

GAMMA, E. et al. Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos. Porto Alegre: Bookman, 2007.
Classes x Objetos

Conteudista: Prof. Esp. Alexander Gobbato Albuquerque


Revisão Textual: Prof.ª M.ª Rosemary To oli

Objetivos da Unidade:

Aprender o que é classe e o que é objeto;

Entender como trazer o problema do mundo real para o mundo da orientação a


objetos;

Compreender o conceito de atributos, “métodos de acesso”, “parâmetros” e


outros.

ʪ Contextualização

ʪ Material Teórico

ʪ Material Complementar

ʪ Referências
1 /4

ʪ Contextualização

Vimos na unidade anterior como é a estrutura de um programa orientado a objetos e de um


programa estruturado. Agora vamos apresentar como criar os métodos, usar encapsulamento e
chamar os métodos criados através de objetos.
2/4

ʪ Material Teórico

Classes x Objetos

Mecanismo de Trabalho
A JVM interpreta os bytecodes gerados pelo compilador.

Figura 1
O objetivo da JVM é permitir que qualquer sistema operacional possa executar uma aplicação
Java

Classe Java
public class BemVindo {
public static void main(String args[]) {
System.out.println(“Bem vindo a Java.”);
}
}

Importante!
Lembre-se o Java é case sensitive (há diferença entre maiúsculas e
minúsculas).

Programa = Classe
public class BemVindo {
public static void main(String args[]){
System.out.println(”Bem vindo”); /* esta linha impirme uma mensagem na tela*/
}
}
Importante!
Os arquivos Java têm que ter o nome da classe principal.

No exemplo acima, o nome do arquivo seria Bemvindo.java e depois de compilado ficaria


Benvindo.class

Nome da classe = Nome dos Arquivos


public class BemVindo {
public static void main(String[ ] args){
System.out.println(”Benvindo”);
}
}

Método main
public class BemVindo {
public static void main(String[ ] args){
System.out.println(”Bemvindo”);
}
}
Figura 2

Principais Conceitos

O que são Objetos?


São quaisquer coisas na natureza que possuam propriedades (características) e
comportamentos (operações).

Exemplos de Objetos: um bolo, um cachorro, um livro, etc.

Orientação a Objetos
O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que
incorporam estrutura de dados e um conjunto de operações que manipulam estes dados, como
exemplo podemos montar os seguintes objetos pessoas e pássaros.

Tabela 1 – Classe: Pessoa

Propriedades Comportamento

Nome Andar

Profissão Correr

Data de Nascimento Trabalhar

Altura Chorar

Peso Dançar

Espécie Andar

Cor das penas Correr

Tamanho Voar

Peso Pousar

Estrutura de um Objeto
Um objeto tem identificação, dados e comportamento, atributos e métodos.

Podemos dizer que objeto é espécie da classe, ou seja, uma instância da classe.
Figura 3
Fonte: Adaptada de Freepik

Para finalizarmos as comparações entre Classe e Objetos temos os seguintes exemplos:

Tabela 2

Classes Objetos

Os funcionarios Pitoco Aguiar e


Funcionário
José da Silva

Carro de passeio O astra, vinho, placa CIL 8445


Classes Objetos

A nota fiscal #29470 referente a


Nota Fiscal
um computador notebook

Em resumo, o objeto é definido pelo conjunto de valores dos seus atributos em determinado
instante. O comportamento é definido pelo conjunto de métodos. Ao criar uma classe, ela passa
a ser um tipo abstrato de dados que pode instanciar objetos. Para instanciar objetos usamos o
operador new.

Figura 4
Fonte: Adaptado de Freepik

Uma coleção de carros pode ser representada por uma classe chamada Carro. Cada carro desta
coleção é a “instância” (objeto) da classe Carro.
Atributos
Os atributos são as características dos objetos, o estado do objeto equivale aos valores de todos
os atributos. No caso do exemplo acima os atributos são representado pelo motor, cor e marca.

Construindo a Classe em Java


Um arquivo em Java precisa de uma classe pública com o mesmo nome do arquivo, abaixo um
exemplo de como criar o arquivo.

public class <nome_da_classe> {


<lista de atributos>
<lista de métodos>
}

Importante!
Por padrão as classes e atributo em java devem seguir algumas regras:

Somente letras, números e underline;

Não pode começar por números;

Não pode ter espaços em branco;

Não pode ser palavra reservada;

Classes: Possuem as iniciais maiúsculas e sem espaços ou caracteres especiais;


Atributos: São sempre em letras minúsculas.

Tipos de Dados em Java


Java possui 8 tipos primitivos que podem ser usados como tipos de atributos e que são eles:

Byte: 8 bits;

Short: 16 bits;

Int: 32 bits;

Long: 64 bits;

Float: ponto flutuante de 32 bits;

Double: ponto flutuante de 64 bits;

Char: Unicode de 16 bits;

Boolean: true/false;

String: classe.

Vejamos um exemplo de criação da classe carro e a instância da classe.


Figura 5
Fonte: Reprodução

Classes: Atributos (Propriedades) + Métodos (Comportamento)


Método é a implementação de uma operação. Os métodos expressam os comportamentos que
todos os objetos dessa classe possuem.

tipo nome (parâmetros) {


instruções;
<return resposta>;
}

Set e Get
Servem como métodos de leitura/escrita aos atributos de classes.

Um método de leitura para um atributo deve ser chamado de getXxx (onde Xxx é o nome do
atributo). Este método não recebe nada como parâmetro, e retorna o mesmo tipo do atributo.

Já um método de gravação deve ser chamado setXxx, não retorna nada (geralmente), e recebe
como parâmetro o valor que deve ser armazenado no atributo.

Na programação orientada a objetos, os atributos da classe quase nunca estão visíveis para os
usuários, é necessário criar um método público para que a aplicação possa acessá-lo. Temos
basicamente 3 modificadores de acesso:

Private ( - ): é o mais restritivo de todos, atributos e métodos com esse modificador


são visíveis somente dentro da definição da própria classe, acessando-o
diretamente ou através de uma instância da mesma classe;

Protected ( # ): define que atributos e métodos somente podem ser acessados por
subclasses da classe onde está sendo definido;

Public ( + ): é o mais abrangente de todos os tipos de acesso, declara que elementos


que o utilizam são acessíveis de qualquer classe Java.

Vejamos a implementação do código:


Figura 6
Fonte: Reprodução

Agora os atributos da classe Carro são privados, não é mais possível atribuir informações
diretamente:
Figura 7
Fonte: Reprodução

Os métodos também possuem padrão de nomenclatura. Os métodos possuem sempre a primeira


inicial minúscula e as outras iniciais maiúsculas.
pegarInformacao(), executarComandoInicial()

Os métodos geralmente são ações que podem ser efetuadas entre os atributos do objeto.

Métodos que não retornam valores, apenas executam ações, são do tipo void.

Por exemplo, na classe Carro, podemos criar um método que imprima seus atributos na tela, ou
como vimos anteriormente, mostre o estado do objeto.

Figura 8
Fonte: Reprodução
Métodos – Procedimentos
Os métodos podem ou não assumir tipos de dados, caso não assumam, são chamados de
procedimentos, pois executam um conjunto de instruções sem devolverem valor algum a quem
os chamou. Um método sem tipo recebe em sua definição a palavra-chave void no lugar do tipo.

Figura 9
Fonte: Reprodução

Métodos – Funções
Quando os métodos assumem algum tipo, eles são chamados de funções e precisam do
comando return para devolver o valor resultante da execução de suas instruções internas.

Figura 10
Fonte: Reprodução

Métodos – Parâmetros
Os métodos podem receber dados para serem utilizados internamente, os quais são chamados
de parâmetros ou de argumentos.

Quando os parâmetros são passados para os métodos, é criada uma cópia dos valores.

Podemos passar vários parâmetros para os métodos, inclusive de tipos diferentes.

Figura 11
Fonte: Reprodução
3/4

ʪ Material Complementar

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Aprenda Programação Orientada a Objetos em 21 dias


SINTES A. Aprenda programação orientada a objetos em 21 dias. Ed. Pearson; 1. ed. 2002.

Java como Programar


DEITEL P.; DEITEL H. Java como Programar. Ed: Pearson Universidades; 8. ed. 2009.

Core Java
HORSTMAN C.; CORNELL H. Core Java. Ed: Pearson Universidades; 8. ed. 2009.

Leitura
Lesson: Object-Oriented Programming Concepts

Clique no botão para conferir o conteúdo.

ACESSE
4/4

ʪ Referências

SINTES, T. (2002) Aprenda Programação Orientada a Objetos em 21 dias. 1 ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

DEITEL, P.; DEITEL, H. (2010) Java Como Programar, 8 ed. São Paulo: Pearson Education do
Brasil, 2010.

HORSTMANN, C.S.; CORNELL, G. (2010) Core Java. 8 ed. São Paulo: Pearson Education do Brasil,
2010, v. 1.
Métodos + Estruturas de Decisão e Repetição

Conteudista: Prof. Esp. Alexander Gobbato Albuquerque


Revisão Textual: Prof.ª M.ª Rosemary To oli

Objetivos da Unidade:

Aprender como inserir uma decisão e deixar que o programa tenha algumas
possibilidades de execução;

Entender como inserir uma estrutura de repetição nos métodos das classes
criadas.

ʪ Contextualização

ʪ Material Teórico

ʪ Material Complementar

ʪ Referências
1 /4

ʪ Contextualização

Vimos na unidade anterior como encapsular as informações, vimos também como criar os
métodos e funções e executá-los. Agora que já sabemos tudo sobre encapsular, métodos e
funções, vamos aprender a utilizar estruturas de decisão e estruturas de repetidos nos métodos
do objeto.
2/4

ʪ Material Teórico

Expressões
O conceito de expressões está associado a fórmulas matemáticas onde um conjunto de variáveis
e constantes numéricas se relacionam através de operadores matemáticos formando uma
expressão e resultando em um valor.

Figura 1

Por exemplo, a fórmula da área do retângulo é A = a × b, está fórmula utiliza duas variáveis: A, a e
b, em que é o lado, b a altura e A que resultará na operação de multiplicação. Em informática uma
expressão é a combinação de variáveis, constantes e operadores e que quando verificadas
resultam um valor.

Operadores
Os operadores são utilizados nas expressões, por exemplo, 3 + 2, os números 3 e 2 são
relacionados por um operador representado pelo sinal + que significa adição.
Os operadores se classificam em aritméticos, lógicos e literais, essa divisão depende do tipo de
expressão que os mesmos serão inseridos, existe, ainda, um tipo de operador que é o relacional,
por meio do qual se compara informações e o resultado é um valor lógico.

Tipos de Expressões
Expressões aritméticas resultam um tipo de dado numérico inteiro ou real, somente é permitido
operador aritmético e variáveis numéricas nessas expressões, vejam na Tabela a seguir as
operações aritméticas:

Tabela 1 – Operadores Aritméticos

Operador Operação

+ Adição

- Substração

* Multiplicação

/ Divisão

% Mod (Resto Divisão)

Como na matemática, em computação existe uma ordem de execução dos operadores, por
exemplo, primeiro são resolvidos as expressões com os símbolos * e /, em seguida + e –.

Expressões Lógicas
Expressões lógicas são aquelas que retornam ou resulta um valor lógico e só existem dois tipos
de dados: verdadeiros ou falsos. Na expressão lógica utilizamos um operador lógico. A Tabela a
seguir ilustra a utilização e resultado da expressão.

Tabela 2 – Tabela Verdade

A .OU. B ( A .E. B (
A B !A !B
|| ) && )

F F V V F F

F V V F V F

V F F V V F

V V F F V V

O operador lógico .NÃO.(!) sempre inverterá o valor do seu operando. O operador .OU. resultará
verdadeiro quando um dos seus operando for Verdadeiro, já o operando .E. só resultará verdade
quando todos os seus operando forem Verdadeiros.

Operadores Relacionais
Ainda existe outro tipo de operadores que é o relacional, esses operadores relacionais poder ser
utilizados entre as operações lógicas.

Tabela 3 – Operador Relacional


Operador Operação

== Igual

!= Diferente

< Menor

<= Menor ou Igual

> Maior

>= Maior ou Igual

Desvio Condicional Simples


Uma decisão simples é composta pela instrução se... então... fim, se a condição estabelecida for
verdadeira, serão executas todas as instruções definidas entre o se... então e depois serão
executadas todas as instruções que existirem após o fim.
Figura 2

Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado
uma classe de nome Conta com o atributo saldo, os métodos de acesso setSaldo() e getSaldo(). O
método de nome sacar, recebe um parâmetro de entrada, dentro do método é realizada a
seguinte operação:

Se o valor de entrada for maior do que o saldo, exibe uma


mensagem de saldo insuficiente, caso contrário realiza a
operação de saldo, retirando o valor informado da variável
saldo.
Figura 3
Fonte: Reprodução

Desvio Condicional Composta


A estrutura condicional composta é similar com a estrutura condicional simples. Sempre um
comando será executado independente da condição, ou seja, caso a condição seja verdadeira os
comandos da condição serão executados ou os comandos da condição falsa serão executados.
Figura 4

Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado
uma classe de nome Boletim com os atributos media, n1 e n2, os métodos de acesso setN1(),
getN1(), setN2() e getN2(). O método de nome calcularMedia(), dentro do método é realizada a
seguinte operação:

Calcula-se a média das notas;

Se a média for menor do que 4, exibir “Conceito D”;

Se a média for maior ou igual a 4 e menor do que 6, exibir “Conceito C”;

Se a média for maior ou igual a 6 e menor do que 8, exibir “Conceito B”;


Se a média for maior ou igual a 8 e menor ou igual a 10, exibir “Conceito A”.

Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código:

Figura 5
Fonte: Reprodução
Estrutura de Decisão Switch Case
O comando switch case pode ser útil quando precisamos fazer diversas verificações e executar
diferentes comandos de acordo com o valor de alguma variável.

Figura 6
Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado
uma classe de nome Cambio com o atributo valorRS e os métodos de acesso setValor() e
getValor(). O método de nome converterMoeda(), dentro do método é realizada a seguinte
operação:

Calcula-se a média das notas;

Se a opção for igual a 1, exibir a conversão para dólar;

Se a média for maior ou igual a 4 e menor do que 6, exibir “Conceito C”;

Se a média for maior ou igual a 6 e menor do que 8, exibir “Conceito B”;

Se a média for maior ou igual a 8 e menor ou igual a 10, exibir “Conceito A”.

Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código:
Figura 7
Fonte: Reprodução

Estrutura de Repetição While


While é uma estrutura de repetição que compara uma variável, quando o resultado da
comparação é verdadeiro, ele executa o bloco de instruções. O problema com estruturas de
repetição, principalmente com while, é o que chamamos de looping infinito, esse nome é dado
por a linha de comando é executada repetitivamente sem nunca chegar ao resultado final, por
isso é imprescindível que uma determinada variável seja modificada de acordo com cada loop.

Veja o exemplo:
Figura 8

Para representarmos o fluxograma acima, iremos escrever um trecho de código. Será criado
uma classe de nome QtdeNumPar com o atributo numero, os métodos de acesso
setQtdeNumero() e getQtdeNumero(). O método de nome retQtdeNumPar(), que recebe um
parâmetro de entrada, dentro do método é realizada a seguinte operação:

Realiza uma repetição e com cada item verifica se o número é


par, executando o MOD de 2;

Cada vez que o resto da operação for 0, contabilizamos 1 para o método retornar o
valor.
Em Java podemos representar a estrutura condicional por meio do seguinte trecho de código:

Figura 9
Fonte: Reprodução

Estrutura de Repetição Do While


DO WHILE é uma estrutura de repetição, tal como o próprio while. A principal diferença entre os
dois é que DO WHILE irá fazer a comparação apenas no final do bloco de código, sendo
representado da seguinte forma:
Figura 10

Em Java podemos representar a estrutura condicional de repetição while por meio do seguinte
trecho de código:
Figura 11
Fonte: Reprodução

Estrutura de Repetição For


É um loop mais “fixo”, permite executar o conjunto de sentenças com um número determinado
de vezes. Sua expressão geral seria como a que segue:
Figura 12
Fonte: Reprodução

Em Java podemos representar a estrutura condicional de repetição while por meio do seguinte
trecho de código:
Figura 13
Fonte: Reprodução
3/4

ʪ Material Complementar

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Aprenda Programação Orientada a Objetos em 21 Dias


SINTES, T. Aprenda programação orientada a objetos em 21 dias. 1. ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

Java como Programar


DEITEL, P.; DEITEL, H. Java como programar. 8. ed. São Paulo: Pearson Education do Brasil, 2010.

Core Java
HORSTMANN, C.S.; CORNELL, G. (2010) Core Java. 8. ed. São Paulo: Pearson Education do Brasil,
2010, v. 1.
Leitura

Orientação a Objetos – Simples Assim!

Clique no botão para conferir o conteúdo.

ACESSE
4/4

ʪ Referências

SINTES, T. Aprenda programação orientada a objetos em 21 dias. 1. ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

DEITEL, P.; DEITEL, H. Java como Programar. 8. ed. São Paulo: Pearson Education do Brasil, 2010.

HORSTMANN, C. S.; CORNELL, G. Core Java. 8. ed. São Paulo: Pearson Education do Brasil, 2010, v.
1.
Introdução a Vetores

Conteudista: Prof. Esp. Alexander Gobbato Albuquerque


Revisão Textual: Prof.ª M.ª Magnólia Gonçalves Mangolini

Objetivos da Unidade:

Enriquecer o conhecimento do aluno com novos conceitos;

Aprender o conceito de vetores e como utilizá-los juntamente com os objetos e


também passagem de parâmetros.

📄 Contextualização
📄 Material Teórico
📄 Material Complementar
📄 Referências
📄 Contextualização
Página 1 de 4

Já estudamos, nos capítulos anteriores, o encapsulamento de informações e a reutilização de


códigos. Vimos também como criar os métodos, usar encapsulamento e chamar os métodos
criados através de objetos.

Nessa Unidade veremos os conceitos de vetores, e com o conceito aprendido poderemos criar
estruturas complexas para atender a demanda de desenvolvimento.

Vamos aprender mais sobre vetores!


📄 Material Teórico
Página 2 de 4

Introdução a Vetores
Antes de começar a falar de arrays, devemos lembrar o que é uma variável e para que ela serve.

Nas Unidades anteriores, vimos que variável é a representação simbólica dos elementos, e que
ficam armazenadas em memória. Cada variável corresponde a uma posição, cujo conteúdo pode
se alterado ao longo do tempo durante a execução de um programa. No entanto, a variável só
pode ser armazena por um único tipo.

Também vimos que as variáveis podem ser de três tipos: numéricas, alfanuméricas e lógicas, e
que para declarar uma variável precisamos definir o seu nome e que tipo de dados será
armazenado nela.

Antes de definir vetor, imaginemos a seguinte situação:

Precisamos criar um programa que armazene as seguintes notas de um aluno: 8.0, 10.0, 9.0, 10.0,
8.5, 10.0 e que calcule a média final.
A solução é bem simples. Definiremos uma variável, alocamos um espaço na memória do
computador para armazenar uma e somente uma constante por vez, seja ela literal, numérica ou
lógica. Quando atribuímos um valor à variável sobrescrevemos seu conteúdo.

Em algumas rotinas é necessário a manipulação de várias variáveis ao mesmo tempo, por


exemplo, imagine que o programa deverá controlar o nome de 100 pessoas, ao invés de criar 100
variáveis é possível à criação de apenas uma, que é definida como array.

Mas como criar um array? É muito simples: especificamos o nome do array e o número de

posições da memória que queremos alocar. Cada posição de memória pode armazenar um valor.

Os arrays são criados para que possam armazenar várias informações do mesmo tipo ou da
mesma classe; com um vetor também é possível o armazenamento de vários objetos. Essas
diversas informações que foram armazenadas em array são de fácil manipulação. As

informações ficam disponíveis em forma de tabelas e podem ser acessadas por meio do índices.

Nas Unidades anteriores vimos que para se chamar um programa em Java, devemos criar um
programa principal com o método main, e como parâmetro do método devemos criar um
string args[], isso nada mais é do que um array de Strings.

Os arrays estão presentes em todas as linguagens de programação, em Java, os arrays são


objetos que permitem armazenar uma lista de itens relacionados.

Arrays Unidimensionais
Os arrays de uma dimensão são aqueles que possuem um único índice para acessar os
elementos. Eles podem ser declarados da seguinte forma:

TIPO-DE-DADO NOME-DO-ARRAY[] = NEW TIPO-DO-DADO[QTDE].

Em que:
Tipo-de-dado: Qualquer tipo de variável ou de classe;
Nome-do-array: Qualquer nome válido vale o mesmo conceito para a criação dos nomes de
variáveis.

Exemplos:

Criar um array de nome Cidades contendo 50 elementos do tipo String e seu índice varia de 0 a
49.

String Cidades[] new String[50]

Criar um array de nome mes contendo 12 elementos do tipo int e seu índice varia de 0 a 11.

int mes [] new int [12]

Para se atribuir valores a um vetor (array), devemos colocar o índice desejado entre os
colchetes, como demonstrado abaixo:

Ciedades[0] = "São Paulo";


Ciedades[10] = "Rio de Janeiro";
mes[] = 1;
mes[11] = 12;

O exemplo que será demonstrado a seguir utiliza um array para armazenar um conjunto de
argumentos do tipo inteiro, informado pelo usuário na linha de execução:

class Exemplo {
public static void main (String args[]) {
int i, total = 0;
int N[] = new int [10];

if (args.length > 0) {
try {
for (i = 0; i < args.length; i++) {
N[i] = Integer.parseInt(args [i]) :
total = total + N[i];
}

System.out.printIn ("0 Total de números digitados na ordem inverse é:"

for (i = args.length; i <= 0; i--) {


System.out.printIn (N[i] + " ");
}
} catch (NumberFormatException E){
System. out . printin ("Os argumentos devem ser numeros inteiros")
}
} else {
System . out . printIn ("Digite pelo menos um número");
}
}
}
Os vetores (arrays) podem ser criados e inicializados ao mesmo tempo, para isso, deve-se
utilizar o operador new para instanciar um novo objeto. Os arrays criados entre chaves e
separados por vírgula devem ter o mesmo tipo que a variável. Veja a sintaxe abaixo:

TIPO-DE-DADO NOME-DO-ARRAY[] = {valores separados por vírgula}

O exemplo abaixo mostra como usar, e explica também a função String.valueOf() para
manipulação do conteúdo de um array de caracteres.

Figura 1
Fonte: Reprodução

#ParaTodosVerem: a imagem é composta por um fundo branco, que contem


descrição de um trecho de código, pode haver partes em que é necessário
utilizar a tecla "TAB" para realizar a indentação correta. A tecla "TAB" será
representada como [TAB] na descrição do código a seguir:
linha 1: public class Exemplo {
linha 2: [TAB]public static void main(String args[]){
linha 3: [TAB][TAB]String nomes="";
linha 4: Esta linha não contém código
linha 5: [TAB][TAB]char CaracterArray[] = {'a','b','c','d','e','f','g'};
linha 6: Esta linha não contém código
linha 7: [TAB][TAB]System.out.println("Mostrando o array "+
String.valueOf(CaracterArray));
linha 8: Esta linha não contém código
linha 9: [TAB][TAB]System.out.println("Quant. de elementos: "+
CaracterArray.length);
linha 10: Esta linha não contém código
linha 11: [TAB][TAB]System.out.println("1º ao 3º caracter " +
String.valueOf(CaracterArray,0,3));
linha 12: Esta linha não contém código
linha 13: [TAB][TAB]String StringArray[] =
{"Aprendendo","a","utilizar","array"};
linha 14: Esta linha não contém código
linha 15: [TAB][TAB]for(int =0;i<StringArray.length;i++){
linha 16: [TAB][TAB][TAB]nomes = nomes + StringArray[i] + " ";
linha 17: [TAB][TAB]}
linha 18: Esta linha não contém código
linha 19: [TAB][TAB]System.out.println("Mostrando array de " + nomes);
linha 20: Esta linha não contém código
linha 21: [TAB][TAB]System.out.println("Quant. de elementos do array: " +
StringArray.length);
linha 22: Esta linha não contém código
linha 23: [TAB][TAB]System.out.println("Mostrando o 1º elemento: " +
StringArray[0]);
linha 24: Esta linha não contém código
linha 25: [TAB][TAB]System.out.println("Mostrando o último elemento do
array: " + StringArray[StringArry.lengtg - 1]);
linha 26: [TAB]}
linha 27: }
Fim do código.
Fim da descrição.

Linha 5: criando array de caracteres;

Linha 9: mostrando a quantidade de elementos do array;

Linha 15: armazenando informações no array.


Importante!
Alguns pontos devem ser levados em consideração quando se trabalhar

com vetores (arrays) de caracteres e strings: nos array de caracteres são


utilizados ‘ (apóstrofos) e já nos arrays de string são utilizados “
(aspas).

A função String.valueOf() pode ser usada para apresentar os elementos


do array de caracteres ou um trecho dele. A função String.valueOf() não
funciona para um conjunto de arrays do tipo string, apenas do tipo

char(conjunto de caracteres).

Arrays Bidimensionais
Os arrays bidimensionais ou arrays multidimensionais permite a criação de vetores com mais de

um índice. Essa característica possibilita que os valores sejam armazenados na forma de


matrizes de qualquer dimensão.

TIPO-DO-DADO NOME-DO-ARRAY[][] = NEW TIPO-DO-DADO[<índice>][<índice>].

O exemplo abaixo demonstra o uso de arrays bidimensionais para armazenar 2 (duas) notas de 3

(três) alunos (total de 6 notas). Uma vez armazenadas, o programa solicita ao usuário o número
do aluno para exibir suas notas e também a média.
Figura 2
Fonte: Reprodução

#ParaTodosVerem: a imagem é composta por um fundo branco, que contem


descrição de um trecho de código, pode haver partes em que é necessário
utilizar a tecla "TAB" para realizar a indentação correta. A tecla "TAB" será
representada como [TAB] na descrição do código a seguir:
linha 1: import javas.swing.*;
linha 2: public class Exemplo {
linha 3: [TAB]public static void main(String args[]) {
linha 4: [TAB][TAB]float notas[][]=new float[3][2];
linha 5: [TAB][TAB]int aluno = 0, nota;
linha 6: Esta linha não contém código
linha 7: [TAB][TAB]while(aluno<3){
linha 8: [TAB][TAB][TAB]nota=0;
linha 9: [TAB][TAB][TAB]while(nota<2){
linha 10: [TAB][TAB][TAB][TAB]System.out.println("Aluno " + (aluno +1) + ",
digite a " + (nota+1) + "ª nota:");
linha 11: [TAB][TAB][TAB][TAB]notas[aluno][nota] =
Float.parseFloat(JOptionPane.showInputDialog("Informe a nota do aluno"));
linha 12: [TAB][TAB][TAB][TAB]nota++;
linha 13: [TAB][TAB][TAB]}
linha 14: [TAB][TAB][TAB]aluno++;
linha 15: [TAB][TAB]}
linha 16: Esta linha não contém código
linha 17: [TAB][TAB]System.out.println("Digite o número do aluno de 1-3");
linha 18: [TAB][TAB]aluno =
Interger.parseInt(JOptionPane.showInputDialog("Digite o nr. do aluno:"))
linha 19: [TAB][TAB]System.out.println("Aluno: " + aluno);
linha 20: [TAB][TAB]System.out.println("Nota1: " + notas[aluno-1][0] + "
Nota2: " + notas[aluno-1][1]);
linha 21: [TAB][TAB]System.out.println("Média: " + (((notas[aluno-1][0]) +
notas[aluno-1][1])/2 );
linha 22: [TAB]}
linha 23: }
Fim do código.
Fim da descrição.

Arrays de Objetos
Do mesmo jeito que criamos array de dados primitivos (int, float, Double, string e char), é
possível criar um array para armazenamento de objetos. Isso é muito útil, pois permite as
mesmas operações com diversos objetos do mesmo tipo.

O exemplo abaixo utiliza um array de objetos, aproveitando das funcionalidades da classe


Veículo.

public class Veiculo{


private int velocidade;

public void setVelocidade (int vVelocidade) {


velocidade = vVelocidade;
}

public int getVelocidade(){


return velocidade;
}
}

public class Exemplo {


public static void main (String args[]){
Veiculo veic[] = new Veiculco[300] ;

for (int indice = 0; indice < 300; indice++) {


veic [indice] = new Veiculo () ;
}

veic[0].setVelocidade(10);
vein[10].set.Velocidade(200):
veic[250].setVelocidade(150);

for (int i = 0; i < 300; i++){


veic[i].setVelocidade(0) ;
}
}
}

Passagem de Arrays em Métodos


Os métodos já foram vistos nos capítulos anteriores. Vimos que é possível a criação de métodos
que recebem valores, manipulam esses valores e retornam um resultado.

A passagem de arrays em métodos é basicamente o mesmo das variáveis. Quando um método é

invocado, um vetor qualquer é informado; esse vetor pode ser manipulado internamente pelo
método e também retornar o resultado.

Public static TIPO_DE-ARRAY[] nome-do-método (tipo-do-array nome-do-array[])

O exemplo a seguir mostra o método que recebe um array do tipo inteiro, organiza seus

elementos e retorna o array.


Figura 3
Fonte: Reprodução

#ParaTodosVerem: A imagem é composta por um fundo branco, que contem


descrição de um trecho de código, pode haver partes em que é necessário
utilizar a tecla "TAB" para realizar a indentação correta. A tecla "TAB" será
representada como [TAB] na descrição do código a seguir:
linha 1: import javas.swing.*;
linha 2: public class Exemplo {
linha 3: [TAB]public static void main(String args[]) {
linha 4: [TAB][TAB]int numeros[] = new int [10];
linha 5: [TAB][TAB]for(int i=0; i< 10; i++){
linha 6: [TAB][TAB][TAB]JOptionPane.showMessageDialog(null,);
linha 7: [TAB][TAB][TAB]numeros[i] =
Interger.parseInt(JOptionPane.showInputDialog("Digite o numero " + (i+1)));
linha 8: [TAB][TAB]}
linha 9: Esta linha não contém código
linha 10: [TAB][TAB]numeros = ordenaArray(numeros);
linha 11: [TAB][TAB]mostraArray(numeros);
linha 12: [TAB]}
linha 13: Esta linha não contém código
linha 14: [TAB]public static int[] ordenaArray(int arr[]){
linha 15: [TAB][TAB]int x,y,aux;
linha 16: [TAB][TAB]for(x=0; x<arr.length; x++){
linha 17: [TAB][TAB][TAB]for(y=0;y<arr.length;y++){
linha 18: [TAB][TAB][TAB][TAB]if(arr[x] <arr[y]){
linha 19: [TAB][TAB][TAB][TAB][TAB]aux=arr[y];
linha 20: [TAB][TAB][TAB][TAB][TAB]arr[y]=arr[x];
linha 21: [TAB][TAB][TAB][TAB][TAB]arr[x]=aux;
linha 22: [TAB][TAB][TAB][TAB]}
linha 23: Esta linha não contém código
linha 24: [TAB][TAB][TAB]}
linha 25: [TAB][TAB]}
linha 26: [TAB][TAB]return arr;
linha 27: [TAB]}
linha 28: Esta linha não contém código
linha 29: [TAB]public static void mostraArray(int arra[]){
linha 30: [TAB][TAB]for(int i=0; i<arr.length; i++){
linha 31: [TAB][TAB][TAB]System.out.println(arr[i] + " ");
linha 32: [TAB][TAB]}
linha 33: [TAB]}
linha 34: }
Fim do código.
Fim da descrição.
📄 Material Complementar
Página 3 de 4

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Aprenda Programação Orientada a Objetos em 21 Dias


SINTES, T. Aprenda Programação Orientada a Objetos em 21 dias. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

Java: como Programar


DEITEL, P.; DEITEL, H. Java: Como Programar. 8. ed. São Paulo: Pearson Education do Brasil, 2010.

Core Java
HORSTMANN, C. S.; CORNELL, G. Core Java. 8. ed. São Paulo: Pearson Education do Brasil,
2010, v. 1.
Leitura

Orientação a Objetos – Simples Assim!

Clique no botão para conferir o conteúdo.

ACESSE
📄 Referências
Página 4 de 4

DEITEL, P.; DEITEL, H. Java como Programar. 8. ed. São Paulo: Pearson Education do Brasil, 2010.

FURGERI, S. JAVA 2: Ensino Didático; Desenvolvendo e Implementando Aplicações. Érica, 2002.

HORSTMANN, C. S.; CORNELL, G. Core Java. 8. ed. São Paulo: Pearson Education do Brasil, 2010, v.
1.

SINTES, T. Aprenda Programação Orientada a Objetos em 21 Dias. São Paulo: Pearson Education

do Brasil, 2002, v. 1.
Construtores, Sobrecarga e Herança

Conteudista: Prof. Esp. Alexander Gobbato Albuquerque


Revisão Textual: Prof.ª Dra. Patrícia S. Leite Di Iório

Objetivos da Unidade:

Abordar a importância dos construtores, sobrecarga e herança e como isso é de


fácil implementação e adaptação.

ʪ Contextualização

ʪ Material Teórico

ʪ Material Complementar

ʪ Referências
1 /4

ʪ Contextualização

Já estudamos, nos capítulos anteriores, o encapsulamento de informações, a reutilização de


códigos. Vimos, também, como criar os métodos, usar encapsulamento e chamar os métodos
criados através de objetos. Com os conhecimentos adquiridos, podemos utilizar as técnicas de
criação de construtores, que são os métodos invocados na criação dos objetos. Veremos a
sobrecarga de métodos, passando por novas assinaturas e também por herança, em que as
características são passadas para as classes que desejam utilizar a codificação já desenvolvida.
2/4

ʪ Material Teórico

Construtores
Construtores são métodos invocados automaticamente quando um objeto é instanciado. São
métodos que nunca retornam nada e não possuem tipo. Em todas as instanciações foram
utilizadas a palavra reservada, conforme o exemplo abaixo:

Carro c1 = new Carro();

Conforme comentado nas unidades anteriores, a palavra new é a responsável por inicializar o
objeto. O método construtor é o método que é chamado toda vez que o objeto é criado, ou seja,
quando se utiliza o operador new, o primeiro método que é chamado é o construtor do objeto. Ele
é responsável por disponibilizar ou alocar o espaço em memória para a utilização do novo objeto.

Obrigatoriamente, o método construtor deve possuir o mesmo nome da classe, se ele não for
declarado, por default é criado automaticamente.

Logo abaixo demonstrado-se a codificação de dois arquivos:


Figura 1 – Arquivo classe
Fonte: Reprodução

Figura 2 – Arquivo para instanciar a classe e invocar o


método construtor
Fonte: Reprodução

O método construtor funciona como qualquer método criado em um programa Java, pode
receber argumentos no momento da criação, veja os exemplos abaixo.

Suponhamos a necessidade de criar dois objetos da classe carro, com diferentes conteúdos para
a variável nome.
Figura 3 – Classe carro com recebimento de argumentos
Fonte: Reprodução

Figura 4 – Classe UsaCarro com passagem de valores


Fonte: Reprodução

Em Java, existe uma referência para a própria classe através da palavra-chave “this”. Assim, no
construtor ao invés de usar “nome = n”, podemos usar “this.nome = nome”, nesse caso as
mesmas variáveis no construtor podem ser usadas nos atributos.
Figura 5
Fonte: Reprodução

Agora, quando instanciamos um objeto da classe Carro, veja como fica:

Figura 6
Fonte: Reprodução

Sobrecarga
Sobrecarregar (do inglês overload) trata-se de um método para criar mais métodos com o
mesmo nome, porém com assinaturas diferentes. Os parâmetros podem se diferenciar em tipo
e/ou em quantidade, assim como o tipo de retorno. Ficará a cargo do compilador escolher de
acordo com a lista de argumentos enviados os métodos a serem executados. Vejamos os
exemplos abaixo:
Figura 7
Fonte: Reprodução

O método recebe dois parâmetros e o retorno é o resultado impresso na tela, veja o método
implementado.

Figura 8
Fonte: Reprodução

Agora, imagine que precisamos fazer um método que multiplique números inteiros e não
números reais. Para o usuário, é transparente, o programador deve realizar uma sobrecarga de
métodos e desenvolveria da seguinte forma:
Figura 9
Fonte: Reprodução

As possibilidades são ilimitadas e a sobrecarga vai depender das necessidades de cada projeto de
classe. Em Java, muitos métodos já são sobrecarregados. Por exemplo, o próprio comando de
imprimir que sempre usamos “System.out.println” possui várias sobrecargas. Você pode passar
como parâmetro um número inteiro, um número real ou mesmo uma String que ele consegue
imprimir na tela o que passou. Isso quer dizer que existe um método println que recebe um int,
outro que recebe um double, outro que recebe uma String, além de outros tipos.

Herança
Como o nome sugere, na orientação a objeto, se refere a algo que será herdado. Em Java ocorre
quando uma classe herda todas as características, métodos e atributos de outra classe, essa
técnica possibilita o compartilhamento e reaproveitamento de recursos definidos
anteriormente. A classe principal que irá disponibilizar todos os recursos recebem o nome de
superclasse e aclasse que herda recebe o nome de subclasse.

Outro recurso da herança, permite que a classe que está herdando, ou subclasse possa aproveitar
toda a característica da superclasse, como também implementar novos atributos e métodos.

Essa técnica de herança é muito utilizada em Java, para melhor entendimento sobre herança,
observe os exemplos abaixo:
Figura 10 – Classe veículo
Fonte: Reprodução

A classe Veículo possui duas variáveis de instância (nome e velocidade) e seis métodos. Existe a
necessidade de outra classe utilizar as mesmas características da classe Veiculo, mas também
implementará métodos que não foram desenvolvidos na superclasse, como, por exemplo, os
métodos de ligar e desligar. Com a técnica da herança, as características da classe serão
herdadas na nova classe e, para realizar a herança, utiliza-se a palavra extends, ou seja, a
subclasse extends superclasse, veja o exemplo abaixo:

Figura 11
Fonte: Reprodução

A classe Veículo1 estende (extends) as funcionalidades da classe Veículo, ou seja, a classe


Veículo1 está herdando os métodos set e get e também os métodos acelera() e freia(). Veja a
implementação do código:
Figura 12
Fonte: Reprodução

Ao instanciar o objeto v, o mesmo receberá as variáveis de instância e todos os métodos


presentes nas classes Veículo e Veículo1, desse modo o objeto v terá acesso às variáveis nome,
velocidade, ligado e os métodos freia, acelera, liga e desliga.

Com base na modelagem UML abaixo, veremos como ficará o desenvolvimento das classes
MembroUniversidade, Aluno, Bolsista, Funcionário e Professor.
Figura 13
Logicamente, começaremos pela classe principal (superclasse).

Figura 14
Fonte: Reprodução

Vamos, agora, implementar a classe Aluno que herda todas as características de


MembroUniversidade. Observe a palavra extends, essa palavra indica que a classe Aluno herda as
características da classe MembroUniversidade. Pode-se observar que a classe aluno tem seus
próprios atributos como RGM e curso. A palavra chave “super” refere-se à superclasse da classe.
O comando “super()” está chamando o construtor da classe pai, nesse exemplo a classe pai é a
MembroUniversidade.
Figura 15
Fonte: Reprodução

Veja, agora, como fica a classe Bolsista que será subclasse de Aluno.
Figura 16
Fonte: Reprodução
3/4

ʪ Material Complementar

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Leitura

Lesson: Object-Oriented Programming Concepts

Clique no botão para conferir o conteúdo.

ACESSE

Livros

Aprenda Programação Orientada a Objetos em 21 Dias


SINTES, T. Aprenda Programação Orientada a Objetos em 21 dias. 1 ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

Java como Programar


DEITEL, P.; DEITEL, H. Java Como Programar. 8 ed. São Paulo: Pearson Education do Brasil, 2010.
Core Java
HORSTMANN, C. S.; CORNELL, G. Core Java. 8 ed. São Paulo: Pearson Education do Brasil, 2010, v.
1.
4/4

ʪ Referências

DEITEL, P.; DEITEL, H. Java Como Programar. 8 ed. São Paulo: Pearson Education do Brasil, 2010.

FURGERI, S. Java 2 – Ensino Didático: Desenvolvendo e Implementando Aplicações. São Paulo:


Érica, 2002.

HORSTMANN, C. S.; CORNELL, G. Core Java. 8 ed. São Paulo: Pearson Education do Brasil, 2010, v.
1.

SINTES, T. Aprenda Programação Orientada a Objetos em 21 dias. 1 ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.
Classes Abstratas, Polimorfismo,
Sobreposição e Interfaces

Conteudista: Prof. Esp. Alexander Gobbato Albuquerque


Revisão Textual: Prof.ª M.ª Rosemary To oli

Objetivos da Unidade:

Apresentar os conceitos de Classes Abstratas, Polimorfismo, Sobreposição e


Interfaces;

Compreender a importância dos conceitos em Orientação a Objetos que


permitem a extensibilidade de componentes e seu reuso.

ʪ Contextualização

ʪ Material Teórico

ʪ Material Complementar

ʪ Referências
1 /4

ʪ Contextualização

Na Unidade anterior estudamos os conceitos de Herança em POO, e o conceito de herança


múltipla. Porém, alguns mecanismos adicionais devem ser implementados para garantir a
estruturação das classes mantendo um certo padrão de nomenclatura.

Classes abstratas servem como molde para subclasses concretas que devem implementar seus
métodos abstratos e herdar os métodos concretos. Além disso, temos interfaces que obrigam as
classes que implementam a ter os métodos da interface. Isso faz com que tenhamos certeza que
todas as subclasses dessa estrutura irão possuir os mesmos métodos (a mesma assinatura)
através de sobreposição de métodos, criando um padrão.

Cada subclasse que implementa os métodos pode ter uma implementação de método diferente,
apesar de ter a mesma assinatura. Isso caracteriza o polimorfismo, pois o nome será o mesmo,
mas a forma diferente.

Projetos de sistemas OO possuem dezenas ou centenas de classes. A inserção de uma nova


classe na hierarquia pode fazer com que o sistema perca o padrão, porém se ele herdar de
classes abstratas e implementar interfaces, isso fará com que ele se “encaixe” no padrão.

Uma subclasse pode herdar apenas de uma superclasse, mas pode implementar várias
interfaces.
2/4

ʪ Material Teórico

Classes Abstratas
À medida que você sobe na hierarquia de herança, as classes tornam-se mais gerais. Em algum
momento, a classe torna-se tão geral que ela seria apenas uma base para as outras classes e não
mais uma classe com instâncias específicas que você queira utilizar.

Uma classe abstrata é desenvolvida para representar entidades e conceitos abstratos. Usamos
uma classe abstrata para criar um padrão de subclasses com comportamentos iguais.

Vamos analisar a Figura 1 a seguir:


Figura 1 – Diagrama de Herança para a classe Veiculo e
suas subclasses

No Diagrama de classes representado na Figura 1 podemos criar classes comuns (classes


concretas) para todas as classes representadas. Isso fará com que possamos instanciar objetos
de qualquer uma das sete classes. Porém, a classe Veículo só serviu de molde para atributos e
métodos comuns às subclasses Carro e Caminhão. Podemos, por exemplo, ter como atributos na
classe Veículo “velocidade” e “passageiros”, e alguns métodos como “acelera”, “freia” e seus
métodos de acesso “set” e “get”.

Desse modo, não há motivos para instanciar objetos da classe Veículo, pois ela serviu apenas
como abstração das subclasses da mesma. Nesse caso, dizemos que Veículo pode ser uma classe
abstrata.

Para a criação de uma classe abstrata usamos a palavra chave “abstract”. Veja na Figura 2 a
implementação da classe Veículo.
Figura 2 – Implementação de classe abstrata Veiculo
Fonte: Reprodução

Uma classe abstrata, além de seus métodos concretos, pode conter também métodos abstratos.
Note na Figura 2 que temos dois métodos abstratos, “acelera” e “freia”. Métodos abstratos não
possuem corpo, apenas a sua assinatura e eles devem ser implementados obrigatoriamente em
suas subclasses, a não ser que suas subclasses também sejam abstratas e nesse caso, devem ser
implementados na primeira classe concreta do diagrama.

Portanto, uma subclasse de uma classe abstrata herda os métodos concretos e se obriga a
implementar os métodos abstratos.
Figura 3 – Implementação da subclasse concreta Carro
Fonte: Reprodução

Na Figura 3 temos a implementação da classe Carro, que é subclasse de Veiculo. Note que, por ser
uma classe concreta, temos obrigatoriamente que implementar os métodos “acelera” e “freia”.

Nesse caso, não podemos instanciar objetos da classe abstrata Veiculo, ou seja, um comando do
tipo “Veiculo v1 = new Veiculo();” estaria incorreto.

Polimorfismo e Sobreposição
O termo polimorfismo é originário do grego e significa “muitas formas” (poli = muitas, morphos
= formas). A propriedade segundo o qual uma operação pode comportar-se diferentemente em
classes diferentes.
O polimorfismo é o responsável pela extensibilidade em programação orientada a objetos,
promovendo o reuso. Em termos de programação, é o princípio pelo qual duas ou mais
subclasses de uma mesma superclasse podem invocar métodos quem tem a mesma
identificação (assinatura), mas com comportamentos distintos, especializados para cada classe
derivada.

Para exemplificar, pense no termo “abrir”. Você pode abrir uma porta, uma caixa, uma janela ou
conta no banco. A palavra abrir pode ser aplicada a muitos objetos diferentes no mundo real e
cada objeto interpreta a ação de “abrir” à sua maneira, entretanto podemos simplesmente dizer
“abrir” para expressar a ação.

Uma linguagem polimórfica é a que suporta polimorfismo (Actionscript, Java), já a linguagem


monomórfica não suporta polimorfismo (Pascal, ASP).

Uma maneira de utilizar o polimorfismo, utilização o mecanismo de Sobreposição de Métodos


(do inglês override), que consiste em reescrever o método herdado da superclasse. Não
confundir Sobrecarga de Métodos (overload), que consiste em escrever métodos com o mesmo
nome, porém com parâmetros diferentes, o que faz com que eles tenham assinaturas diferentes.
Na Sobreposição de Métodos, a assinatura é idêntica ao método herdado, porém o corpo do
método é alterado para o propósito específico da subclasse.

Na Figura 2, a classe abstrata Veiculo possui métodos abstratos “acelera” e “freia”. Isso fez com
que fôssemos obrigados a implementar esses métodos na classe Carro conforme Figura 3. Se
analisarmos novamente a Figura 1, notamos que as classes Uno e Ferrari herdam todos os
atributos e métodos de Carro, incluindo os métodos acelera e freia.

Porém, sabemos que os objetos da classe Uno aceleram e freiam mais lentamente que objetos da
classe Ferrari, portanto, devemos sobrepor esses métodos para que ajam de acordo com a
realidade de cada objeto.
Figura 4 – Implementação das classes Uno e Ferrari
Fonte: Reprodução

Note na Figura 4 que nós reescrevemos os métodos acelera e freia das subclasses Uno e Ferrari,
adaptando para as próprias necessidades. Podemos notar que a assinatura do método é idêntica
à superclasse carro usando então o mecanismo de Sobreposição.
Figura 5 – Exemplo de Polimorfismo e Sobreposição
Fonte: Adaptada de Freepik

Veja mais um exemplo na Figura 5. Temos uma classe abstrata “Telefone” que possui um
método calcularConta. Por herança, as classes “Movel” e “Fixo” recebem o método
calcularConta, porém a maneira de calcular a conta de um Telefone Móvel e de um Telefone Fixo
é diferente.

Nesse caso, através da Sobreposição de Métodos, reescrevemos os métodos calcularConta em


cada subclasse para que se adapte à sua necessidade, criando então o conceito de Polimorfismo.
Figura 6 – Exemplo de Polimorfismo e Sobreposição
Fonte: Reprodução

Veja o exemplo da Figura 6, onde temos uma classe “Animal” que possui um único método
“andar”. Criamos uma subclasse de Animal chamada Cavalo, que por herança recebe o método
andar. Nesse exemplo, estamos sobrescrevendo o método andar para que faça outra coisa.

Tanto a classe Animal como a classe Cavalo são concretas e aceitam instanciar objetos, podemos
ter o seguinte código Java:

Animal a = new Animal();


Cavalo b = new Cavalo();
a.andar();
b.andar();

Para o objeto “a”, aparecerá a mensagem de “pessoa andando” e para o objeto “b” a mensagem
será “Cavalo Andando”. Porém, podemos ter também o seguinte código:

Animal a = new Animal();


Animal b = new Cavalo();
a.andar();
b.andar();

No exemplo anterior, o resultado será o mesmo, para o objeto “a” aparecerá “pessoa andando”
e para o “b” será “Cavalo andando”. Porém temos agora “b” como uma variável polimórfica.
Um objeto do tipo Animal pode referir-se a um objeto do tipo Animal ou a um objeto de qualquer
subclasse da classe Animal.

Interfaces
Muitas linguagens de programação orientada a objetos não possuem o conceito de Herança
Múltipla. Isso ocorre porque alguns mecanismos da POO são incompatíveis com processos de
herança múltipla. Linguagens como C++ e Ei el possuem mecanismos de herança múltipla,
porém são pouco utilizados por serem complexos e por vezes ineficientes. Vamos analisar a
Figura 7 a seguir:
Figura 7 – Cenário de Herança Múltipla

Analisando a Figura 7 podemos notar que a classe ComboDrive herda características das
superclasses GravadorDVD e GravadorCD, caracterizando uma herança múltipla. Porém,
sabemos que por herança as subclasses herdam todos os atributos e métodos da classe pai.

No nosso exemplo, o método “burn” foi sobrescrito nas duas classes GravadorCD e
GravadorDVD. Qual método será chamado quando invocarmos o método “burn” da classe
ComboDrive?

Esse cenário não é possível em Java e em muitas outras linguagens OO. Nesse caso, usamos
outro mecanismo chamado Interfaces.
Uma interface especifica um conjunto de operações públicas de uma classe e/ou um
componente. Uma interface não é uma classe, mas um conjunto de requisitos para classes que
precisam se adequar a ela, ou seja, você nunca poderá utilizar o operador new para instanciar
uma interface.

Figura 8 – Interface

Note na Figura 8 que Cliente não é uma classe e sim uma Interface. Ela define quais os métodos
que deverão ser criados nas classes que a implementam. Uma interface não é herdada e sim
implementada. Quando dizemos que uma classe implementa uma interface, estamos firmando
um contrato de compromisso que essa classe, obrigatoriamente, implementará os métodos da
interface.
Os métodos na interface são métodos “ocos”, ou seja, só possuem as assinaturas, mas não
possuem corpo. Além dos métodos, as interfaces podem conter constantes, cujas classes que
implementam a interface recebem as constantes como um mecanismo de herança.

Uma classe pode herdar apenas de uma superclasse, porém podem implementar diversas
interfaces, podendo assim simular o mecanismo de herança múltipla.

Figura 9 – Interface Imprimível e classe Produto

Na Figura 9 temos uma Interface Imprimivel e uma classe Produto. A implementação da


Interface pode ser algo como:

public interface Imprimivel {


final char nlin = ’\n’;
public String toString();
public void toSystemOut();
}
Podemos notar que, ao invés de usar “public class”, usamos “public interface” para criação de
interfaces e não classes. Nessa interface temos uma constante de nome “nlin”, definida com o
modificador “final” e a assinatura de dois métodos “toString” e “toSystemOut”. Notem que esses
métodos são ocos e não possuem implementação, semelhante aos métodos abstratos vistos
anteriormente, mas sem o “abstract”. Todos os métodos de interface serão obrigatoriamente
públicos.

Todas as classes que implementam a interface “Imprimivel” terão a obrigação de implementar


os métodos “toString” e “toSystemOut”. Isso faz com que tenhamos um padrão de programação,
assim não importa quais os métodos que as subclasses terão, saberemos que pelo menos esses
2 métodos existirão em todas as classes que implementam a interface.

Todos os métodos em uma interface são implicitamente abstratos, porém o modificador


“abstract” não é utilizado com métodos de interface, apesar de poder ser, ele é desnecessário.

Veja a seguir como uma classe implementa uma interface, utilizando o operador “implements”.

public class Produto implements Imprimivel {


private String descricao;
private int quantidade;
public Produto(String d,int q) {
descricao = d;
quantidade = q;
}

public String toString() {


String resp = “Descrição:” + descricao;
resp += nlin + “Qtde:” + quantidade;
return resp;
}

public void toSystemOut() {


String resp = “Descrição:” + descricao;
resp += nlin + “Qtde:” + quantidade;
System.out.print(resp);
}
}
Veja no código da classe Produto que usamos a palavra chave “implements” para dizer que a
classe implementa a interface. Veja que tivemos que criar os métodos “toString” e “toSystemOut”
dentro da classe.

public class TesteProduto {


public static void main(String args[]) {
Produto prod = new Produto(“Macarrão”,10);
prod.toSystemOut();
System.out.println(“\n” + prod.toString());
}
}

Apesar de não podermos instanciar interfaces, podemos criar variáveis de interface e instanciar
objetos de classes que a implementam. O código abaixo teria o mesmo efeito que o anterior:

public class TesteProduto {


public static void main(String args[]) {
Imprimivel prod = new Produto(“Macarrão”,10);
prod.toSystemOut();
System.out.println(“\n” + prod.toString());
}
}

Podemos então perceber que o conceito de classes abstratas é semelhante ao de interfaces.


Quando devemos usar uma ou outra?
Use classes abstratas quando você quer definir um “template” para subclasses e você possui
alguma implementação (métodos concretos) que todas as subclasses podem utilizar. Use
interfaces quando você quer definir uma regra que todas as classes que implementem a
interface devem seguir, independentemente se pertencem a alguma hierarquia de classes ou
não. Claro que podemos também usar ambas no caso de uma simulação de herança múltipla.
3/4

ʪ Material Complementar

Indicações para saber mais sobre os assuntos abordados nesta Unidade:

Livros

Aprenda Programação Orientada a Objetos em 21 dias


SINTES A. Aprenda programação orientada a objetos em 21 dias. Ed. Pearson; 1ª edição 2002.

Java Como Programar


DEITEL P.; DEITEL H. Java Como Programar. Ed: Pearson Universidades; 8ª edição 2009.

Core Java
HORSTMAN C.; CORNELL H. Core Java. Ed: Pearson Universidades; 8ª edição 2009.

Leitura
Lesson: Object-Oriented Programming Concepts

Clique no botão para conferir o conteúdo.

ACESSE
4/4

ʪ Referências

SINTES, T. Aprenda Programação Orientada a Objetos em 21 dias. 1 ed. São Paulo: Pearson
Education do Brasil, 2002, v. 1.

DEITEL, P.; DEITEL, H. Java Como Programar, 8. ed. São Paulo: Pearson Education do Brasil,
2010.

FURGERI, S. Java 2 – Ensino Didático, EDITORA ÉRICA – 3. ed., 2003.

HORSTMANN, C. S.; CORNELL, G. Core Java. 8 ed. São Paulo: Pearson Education do Brasil, 2010, v.
1.

Você também pode gostar