Você está na página 1de 28

EM FASE DE ELABORAÇÃO!!!!

1 INTRODUÇÃO

A “Engenharia de software” surgiu no final da década de 60 para tentar solucionar os


problemas gerados pela “Crise do software”, no entanto, várias técnicas que foram
desenvolvidas nos anos 70 e 80 não conseguiram resolver os problemas de
produtividade e qualidade em softwares.

Nos anos 90, um grande número de empresas, de diversos portes, já estava com
boa parte de seus sistemas com um considerável nível de informatização, além
disso, o uso da internet como meio de comunicação e busca maciça de informação
foi amplamente divulgado e finalmente o computador passou a ser uma ferramenta
de trabalho para muitas pessoas.

Com tudo isso, surge a necessidade de se produzir softwares mais atraentes,


dinâmicos e com alto poder de troca de informação, além disso, passou-se a exigir
dos softwares uma maior produtividade e melhor qualidade.

Os softwares atuais se caracterizam por ter grande interação com o usuário, pelo
uso de interfaces gráficas, pela necessidade permanente de alteração e expansão
(dada a velocidade de mudanças de hardware) e apresentam interação com outros
sistemas possibilitando a troca de dados entres eles, portabilidade para diversas
plataforma e sistemas operacionais.

Ao longo de várias pesquisas e testes, verificou-se que a reutilização era a peça


chave para o aumento da produtividade e melhoria da qualidade dos softwares. A
reutilização significa usar novamente algo que foi feito. Seu objetivo é permitir uma
ampla utilização de todos os tipos de informação encontradas na situação de
desenvolvimento. Podemos citar como benefício da reutilização uma redução das
etapas de desenvolvimentos de software.

As técnicas oferecidas pela programação estruturada não eram suficientes para


atender, com satisfação desejada, a elaboração destes tipos de aplicações. Seria
necessário partir para uma nova técnica de programação. A técnica que começou a
ser adotada por parte dos programadores foi a Programação Orientada a Objetos.

1.1 O PROPÓSITO DA ORIENTAÇÃO A OBJETOS

A construção de uma solução computadorizada consiste no mapeamento do


problema a ser resolvido no mundo real (o Espaço do Problema) em um modelo de
solução no Espaço de Soluções, isto é, o meio computacional. A modelagem
envolve, então, a identificação de objetos e operações relevantes no mundo real e o
mapeamento desses em representações abstratas no mundo computacional.

À distância existente entre o problema no mundo real e o modelo abstrato


construído, convencionou-se chamar gap semântico e, obviamente, quanto menor
ele for mais direto será o mapeamento e, portanto, mais rapidamente serão
construídas soluções para o problema. Sob essa ótica, é fácil perceber que o gap
semântico representa a área de atuação da Engenharia de Software. Diversas
técnicas e métodos têm sido propostos para as diferentes fases do processo de
desenvolvimento, buscando minimizá-lo. A Orientação a Objetos é um dos
paradigmas existentes para apoiar o desenvolvimento de sistemas, que busca
fornecer meios para se diminuir o gap semântico.

Figura 1 - Exposição de gap semântico.

A computação atualmente é parte do dia-a-dia da Sociedade. Em termos de


hardware e software a evolução é constante e tem atingido altos níveis. Pode-se
dizer que para boa parte dos problemas do mundo real que precisam ser mapeados
em sistemas computacionais, mais precisamente em softwares, já possuem as
tecnologias de hardware e software necessários.

Assim o problema neste caso deixa de ser onde o sistema executar e passa a ser
como resolver o problema de maneira mais eficiente, ou seja, como representar o
problema do mundo real para o mundo computacional capturando todas as
características necessárias e que execute a melhor solução possível. E é quando
começa-se a falar em metodologias, tecnologias e técnicas de desenvolvimento de
software. O que está dominando atualmente o mercado é justamente a Orientação a
Objetos (OO).

A técnica da orientação a objeto está entre as melhores maneiras conhecidas para


se desenvolver Sistemas de Informação Automatizados grandes ou complexos.

Aprender a racionar orientado a objetos, bem como a utilizar corretamente as suas


técnicas não é fácil, mas pode-se afirmar que é essencial para qualquer profissional
da área atualmente.

A Orientação a Objeto é um paradigma de análise, projeto e programação de


sistemas de informação automatizados baseado na composição e interação entre
diversas unidades de software chamadas objetos.

“Orientação a Objetos consiste em considerar os


sistemas computacionais como uma coleção de
objetos que interagem de maneira organizada.”

1.2 OS BENEFÍCIOS DA ORIENTAÇÃO A OBJETOS

A técnica de análise e programação orientada a objetos está se tornando cada vez


mais popular entre os desenvolvedores de sistema. Essa popularidade não é fruto
do acaso, ou da moda, e sim das vantagens que os desenvolvedores passam a
usufruir quando adotam essa metodologia.

A principal vantagem da orientação a objetos consiste em reunir em uma mesma


estrutura os dados e os processos que são executados sobre esses dados,
permitindo assim um maior grau de organização e simplicidade do programa.

A partir do momento em que um desenvolvedor cria um objeto para realizar uma


tarefa complexa, os outros desenvolvedores só precisam acessar esse objeto para
realizar essa mesma tarefa, sem precisar saber como elas são realizadas. Se
alguém muda a maneira como esse objeto realiza internamente essa tarefa, os
outros desenvolvedores não precisam alterar os seus programas para continuar
acessando o novo comportamento, e isso representa um ganho real de
produtividade.

O procedimento de manutenção restrito ao objeto reduz custo, tempo e assegura a


certeza de uma manutenção eficaz, visto que as variáveis controladas estavam
restritas aos objetos modificados, e mais em nenhuma outra parte do sistema.

Uma estrutura eficaz de objetos, uma vez criada, permitirá incluir módulos adicionais
no sistema que reutilizem as funcionalidades já desenvolvidas sem necessidade de
reprogramação.

Reutilizar não é duplicar código e alterar. Significa que o mesmo código pode ser
usado por sistemas diferentes, reduzindo o custo de desenvolvimento e o risco de
cometer erros de programação, ao mesmo tempo que não será necessário alterar
trechos, o que poderia introduzir novos erros no código.

Por exemplo, uma empresa desenvolve um sistema educacional que tenha sua
funcionalidade de cobrança baseada em objetos. A mesma empresa pode
desenvolver um sistema imobiliário e reutilizar objetos de cobrança , incluindo-os no
novo sistema. Se o autor do sistema educacional fizer aperfeiçoamentos ou
correções nos objetos de cobrança, essas alterações terão sido realizadas de uma
vez em todos os sistemas da empresa.

Dentro de uma visão orientada a objetos, quando precisamos criar um sistema de


informações, precisamos, antes de tudo, identificar quais são os objetos necessários
para operacionalizar esse sistema. Uma vez definidos os objetos necessários, e
antes mesmo de partir para a criação destes, podemos partir para a reutilização de
objetos já existentes, ou seja, verificar em outros sistemas se já não existem objetos
que realizam as tarefas desejadas. Se existirem objetos que podem ser reutilizados ,
estes podem ser incluídos no novo sistema sem a necessidade e o custo de criação.
Outra opção também pode ser a transformação de objetos semelhantes, ou seja,
objetos cujas características são bastante semelhantes podem, com pequenas
modificações, serem úteis ao novo sistema.

Para a mudança de um sistema, é válida a mesma proposta de flexibilidade,


podendo-se adaptar, excluir, ou mesmo incluir novos objetos rapidamente, com a
mesma garantia de ter atingido todo o universo necessário dentro do sistema para
assegurar a eficácia da modificação.
O desenvolvimento orientado a objetos é um método de desenvolvimento cujo
objetivo é proporcionar o máximo possível de reutilização. É também um método
que simplifica a montagem de novos sistemas, uma vez que esse método trata do
manuseio de objetos pré-prontos.

1.3 PROGRAMAÇÃO ESTRUTURADA X PROGRAMAÇÃO ORIENTADA A


OBJETOS

Na tabela abaixo está apresentada uma comparação de algumas características que


diferenciam as programações algorítmicas (procedimental ou estruturada) e a
orientada a objeto.

Programação Algorítmica
Programação OO
(Procedimental)

 Metodologia desenvolvida
 Ênfase: construção de algoritmos;
objetivando suprir deficiências
 Utiliza abordagem de
encontradas em programação
refinamentos sucessivos;
algorítmica;
 Subproblemas são codificados
 Encapsulamento: combinação de
como unidades denominadas
dados (atributos) e funções
procedimentos, subrotinas ou
(métodos) numa única entidade
funções;
de programa;
 Unidades de programa podem ser
 Objeto: entidade de
agrupadas em módulos;
encapsulamento;
 Programa resultante consiste de
 Um programa no paradigma OO
uma coleção de unidades que se
consiste de vários objetos que se
comunicam entre si;
comunicam (isto é, trocam
 Visão Top-down;
mensagens) utilizando seus
 Forte uso de Decomposição
métodos constituintes;
Funcional;
 Visão de Objetos cooperativos;
 O sistema é composto por dados
 As características de
e funções, tratados
comportamento e informações
separadamente, mas que podem
são modeladas de maneira
interagir.
fortemente relacionadas;

Problemas:  O sistema é composto por


objetos, que contém dados e
 Programas muito grandes tornam-
funções (isto é, estão reunidos em
se muito complexos e difíceis de
um só elemento).
entender e manter;
 Dificuldade em modelar muitos
problemas da vida real com Ocultação de Informação:
enfoque em algoritmos;
 Métodos que fazem parte de um
 É mais fácil simular o
objeto provêm (usualmente) a
funcionamento de sistemas
única forma de acesso aos seus
complexos com enfoque em suas
dados;
partes constituintes do que em
 Campos de um objeto não podem
termos dos algoritmos utilizados
ser acessados diretamente,
pelo sistema.
apenas indiretamente por meio de
Exemplo: um automóvel é melhor
seus métodos constituintes;
entendido em termos de direção,
 Previne alterações acidentais de
freios, etc. do que em termos dos
dados e facilita a manutenção e
algoritmos que o fazem funcionar;
depuração dos programas.
 Linguagens procedimentais não
oferecem facilidades para criação
de novos tipos de dados que
funcionem como os tipos de
dados primitivos.
2 PRINCIPAIS CONCEITOS DE POO

2.1 OBJETO

Usamos o termo objeto para representar um determinado elemento do mundo real.


Mas somente analisaremos os objetos que tem relevância para a solução de um
determinado problema. Portanto, o objeto é uma entidade do mundo real que
merece representação para o ambiente estudado.

Objetos são instâncias de classes, que determinam qual informação um objeto


contém e como ele pode manipulá-la. É uma entidade capaz de reter um estado
(informação) e que oferece uma série de operações (comportamento) ou para
examinar ou para afetar este estado. É através deles que praticamente todo o
processamento ocorre em sistemas implementados com linguagens de programação
orientadas a objetos.

Como exemplos de objetos, podemos citar os objetos físicos (um livro, uma
mercadoria), funções de pessoas para os sistemas (cliente, vendedor), eventos
(uma compra, um telefonema), interações entre outros objetos (um item de uma nota
fiscal é uma interação entre uma compra e um produto do estoque) e lugares (loja
matriz, revenda norte).

Por exemplo, vamos considerar um cachorro como nosso “objeto” de estudo:

Figura 2 - Cachorro.

Analisando este objeto, o cachorro, podemos deduzir que o mesmo possui algumas
características que pertencem apenas a ele próprio. Por exemplo, um cachorro
possui:

 Um nome,
 Uma idade,
 Um comprimento de pelos,
 Uma cor dos pelos,
 Uma cor dos olhos,
 Um peso,
 ...

“As características que descrevem um objeto são


chamadas de atributos”.

Além do conjunto de características que descrevem o cachorro, podemos também


identificar um conjunto de ações que ele é capaz de executar:

 Latir;
 Babar;
 Correr em círculos,
 Pegar a bola,
 Sentar,
 Comer,
 Dormir,
 ...

“As ações que um objeto pode executar são


chamadas de métodos ou serviços”.

A única maneira de interagir com os objetos é através dos métodos que ele
disponibiliza. Para interagir com o cachorro, utilizamos os métodos que
relacionamos acima: para alimentá-lo, utilizamos o método “comer”, para brincar
com ele, utilizamos o método “pegar a bola”, etc.

“Chamamos de interface ao conjunto de métodos


disponíveis em um objeto.”

2.1.1 ATRIBUTO

Os objetos do mundo real possuem propriedades que possuem valores. Estes


valores definem o estado do objeto. As propriedades recebem o nome de atributos
em OO.
Podemos dizer que os atributos dos objetos são “variáveis” ou “campos” que
armazenam os diferentes valores que as características dos objetos podem conter.

O estado de um objeto é o conjunto de valores de seus atributos em um


determinado instante. O comportamento de um objeto é como ele age e reage em
termos de suas mudanças de estado e troca de mensagens com outros objetos.

O cachorro do nosso exemplo poderia ser representado pelos seguintes atributos:

Figura 3 - Atributos do Cachorro.

Outro objeto “cachorro” apresentaria valores diferentes para os mesmos atributos,


por exemplo:

Figura 4 - Atributos de outro cachorro.

Os atributos de um objeto somente mudam de valor através de estímulos externos


ou internos. A única forma de modificar os atributos dos objetos é disparando
eventos que provocam a transição desses estados no objeto.

2.1.2 MÉTODO

Os métodos são procedimentos ou funções que realizam as ações próprias do


objeto. Assim, os métodos são as ações que o objeto pode realizar. Tudo que o
objeto faz é realizado através de seus métodos, pois é através dos seus métodos
que um objeto se manifesta, e através deles que o objeto interage com os outros
objetos.

Um objeto exibe algum comportamento (executa uma operação) quando recebe um


estímulo de outro objeto. Um objeto requisita a ação de algum outro objeto, enviando
uma mensagem para ele. Esta mensagem é uma solicitação a um objeto para que
sejam executadas as rotinas que chamamos de Método da classe.

Os métodos são responsáveis por acessar ou alterar os atributos de um objeto.

Imaginando os métodos do nosso objeto de estudo, o cachorro, enumeramos


métodos (ações) como Latir, babar, comer sentar, etc.

2.1.3 TIPOS DE ATRIBUTOS E MÉTODOS

O modificador de visibilidade pode estar presente tanto para atributos como para
métodos. Em princípio, três categorias de visibilidade podem ser definidas:

 público, denotado em UML pelo símbolo +: nesse caso, o atributo ou método


de um objeto dessa classe pode ser acessado por qualquer outro objeto
(visibilidade externa total);
 privativo, denotado em UML pelo símbolo -: nesse caso, o atributo ou
método de um objeto dessa classe não pode ser acessado por nenhum outro
objeto (nenhuma visibilidade externa);
 protegido, denotado em UML pelo símbolo #: nesse caso, o atributo ou
método de um objeto dessa classe poderá ser acessado apenas por objetos
de classes que sejam derivadas dessa através do mecanismo de herança.

2.1.4 TIPOS DE MÉTODOS

Os métodos definem as funcionalidades da classe, ou seja, o que será possível


fazer com objetos dessa classe. Cada método é especificado por uma assinatura,
composta por um identificador para o método (o nome do método), o tipo para o
valor de retorno e sua lista de argumentos, sendo cada argumento identificado por
seu tipo e nome.

Através do mecanismo de sobrecarga (overloading), dois métodos de uma classe


podem ter o mesmo nome, desde que suas assinaturas sejam diferentes. Tal
situação não gera conflito, pois o compilador é capaz de detectar qual método deve
ser escolhido a partir da análise dos tipos dos argumentos do método.

2.1.4.1 ESPECÍFICOS

Em vez de criar um método que constrói uma casa, crie um método que cria um
quarto, outro método que cria a sala, outro que cria o banheiro, um método pra
organizar a casa etc.

Assim, quando tiver que criar um banheiro, já terá o método específico para aquilo.

Veja os métodos como peças de um quebra-cabeça. Porém, são peças 'coringa',


que se encaixam com muitas outras peças.

Reusabilidade é tempo. E tempo é dinheiro.

2.1.4.2 CONSTRUTORES

O (pseudo-) método construtor determina que ações devem ser executadas quando
da criação de um objeto. Em Java, o construtor é definido como um método cujo
nome deve ser o mesmo nome da classe e sem indicação do tipo de retorno -- nem
mesmo void. O construtor é unicamente invocado no momento da criação do objeto
através do operador new.

O retorno do operador new é uma referência para o objeto recém-criado. O


construtor pode receber argumentos, como qualquer método. Usando o mecanismo
de sobrecarga, mais de um construtor pode ser definido para uma classe.

Toda classe tem pelo menos um construtor sempre definido. Se nenhum construtor
for explicitamente definido pelo programador da classe, um construtor padrão, que
não recebe argumentos, é incluído para a classe pelo compilador Java. No entanto,
se o programador da classe criar pelo menos um método construtor, o construtor
padrão não será criado automaticamente -- se o programador desejar mantê-lo,
deverá criar um construtor sem argumentos explicitamente.

 No momento em que um construtor é invocado, a seguinte sequência de


ações é executada para a criação de um objeto:
 O espaço para o objeto é alocado e seu conteúdo é inicializado (bitwise) com
zeros.
 O construtor da classe base é invocado. Se a classe não tem uma
superclasse definida explicitamente, a classe Object é a classe base.
 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 de forma a 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.

2.1.4.3 ACESSO E MODIFICADORES

Toda vez que um membro tem modificador de acesso public, ele é considerado uma
interface, pois interage com o meio externo ao objeto. Toda vez que um membro tem
modificador de acesso private ele é considerado encapsulado pois não existe
interação externa.

Uma vez que os atributos são privados, precisamos de mecanismos para modificar
(set) e acessar seu conteúdo (get).

 Um método set é um método sem retorno (void) e com parâmetros que


modifica o valor de um ou mais atributos;
 Um método get é um método sem parâmetros e com tipo de retorno definido
que acessa o valor de determinado atributo.

2.1.4.4 MÉTODO MAIN (Java)

Permite que uma classe seja executada (normalmente pelo menos uma das classes
da aplicação precisa ser executada). Quando uma aplicação Java é iniciada, a JVM
localiza e chama o método main() que recebe por parâmetro um vetor de objetos
String representando os parâmetros de linha de comando.

Exemplo de aplicação:
public class Aplicacao {

public static void main(String[] args) {

Hora horaDoAlmoco;

horaDoAlmoco = new Hora();

horaDoAlmoco.setHorario(12,30,00);

Hora horaAtual = new Hora();

horaAtual.setHoraAtual();

2.2 CLASSE

É bastante comum encontrarmos no mundo real, diferentes objetos desempenhando


um mesmo papel. Consideremos, por exemplo, duas cadeiras. Apesar de serem
objetos diferentes, eles compartilham uma mesma estrutura e um mesmo
comportamento. Entretanto, não há necessidade de se despender tempo modelando
as duas cadeiras, ou várias delas. Basta definir, em um único lugar, um modelo
descrevendo a estrutura e o comportamento desses objetos. A esse modelo damos
o nome de classe.

Uma classe descreve um conjunto de objetos com as mesmas propriedades


(atributos), o mesmo comportamento (operações), os mesmos relacionamentos com
outros objetos e a mesma semântica. Objetos que se comportam da maneira
especificada pela classe são ditos instâncias dessa classe.

Todo objeto pertence a uma classe, ou seja, é instância de uma classe. De fato, a
orientação a objetos norteia o processo de desenvolvimento através da classificação
de objetos, isto é, objetos são agrupados em classes, em função de exibirem facetas
similares, sem, no entanto, perda de sua individualidade. Assim, a modelagem
orientada a objetos consiste, basicamente, na definição de classes. O
comportamento e a estrutura de informação de uma instância são definidos pela sua
classe.

Objetos com propriedades e comportamento idênticos são descritos como instâncias


de uma mesma classe, de modo que a descrição de suas propriedades possa ser
feita uma única vez, de forma concisa, independentemente do número de objetos
que tenham tais propriedades em comum. Deste modo, uma classe captura a
semântica das características comuns a todas as suas instâncias.

Enquanto um objeto individual é uma entidade real, que executa algum papel no
sistema como um todo, uma classe captura a estrutura e comportamento comum a
todos os objetos que ela descreve. Assim, uma classe serve como uma espécie de
contrato que deve ser estabelecido entre uma abstração e todos os seus clientes.

Resumindo: Classe é um conjunto de elementos com as mesmas características


(atributos, operações, relacionamentos). Objeto é um elemento desse conjunto.
Quando se considera diferentes objetos de uma mesma classe podem ocorrer de
encontrarmos diferentes: valores, identificação, o resultado de um comportamento.

A identificação de classes e objetos envolve:

 Descoberta. Através da descoberta, é possível reconhecer as abstrações-


chave e os mecanismos que formam o vocabulário do domínio do problema.
A descoberta ocorre à medida que se compreende o problema;
 Invenção. Através da invenção, imaginam-se as abstrações generalizadas,
bem como os novos mecanismos que especificam como os objetos
colaboram entre si. A invenção ocorre à medida que se soluciona o problema.

O problema da classificação é um problema relacionado com encontrar


semelhanças. A classificação ajuda a identificar generalizações, especializações e
hierarquia de agregações entre as classes.

Classificação é um processo interativo e incremental, difícil de ser executado porque


um determinado conjunto de objetos pode ser classificado igualmente, de várias
maneiras.

Olhando os dois cães do exemplo anterior, vemos que os dois possuem exatamente
o mesmo conjunto de atributos. Isso acontece porque se trata de dois objetos da
mesma classe, ou categoria. Isso significa que os dois possuem exatamente o
mesmo conjunto de atributos e métodos, embora cada objeto possa ter valores
diferentes para os seus atributos.
Figura 5 - Classe Cães.

Objetos de mesma classe possuem a mesma definição tanto para métodos quanto
para atributos.

Tomemos uma classe gatos formada de objetos “gato”. Estes objetos possuem as
seguintes características: nome, idade, peso, cor de pelos, cor de olhos e
comprimento de pelos. Além disso, o objeto possui as seguintes ações: miar, comer,
dormir, subir na árvore.

Figura 6 - Classe Gatos.

Muitos objetos do mundo real possuem características comuns e podem ser


agrupados de acordo com elas. Uma classe representa um gabarito para muitos
objetos e descreve como estes objetos estão estruturados internamente.
2.3 ALGUMAS PECULARIEDADES EM JAVA

2.3.1 OBJETOS EM JAVA

Precisa ser identificado enquanto entidade do código (uma variável, um elemento


em uma lista, uma posição de um vetor, etc.).

O operador new:

 Aloca memória para o novo objeto (a quantidade necessária é obtida a partir


da definição da classe);
 Chama o construtor da classe para inicializar o estado do novo objeto;
 Retorna uma referência (um endereço de memória para o objeto recém
criado);

Os métodos são acessados através do operador “.” (ponto), precedido pelo nome do
objeto (variável) e seguido do nome do método. Exemplo:

public class Aplicacao {

public static void main(String[] args) {

Hora horaDoAlmoco;

horaDoAlmoco = new Hora();

horaDoAlmoco.setHorario(12,30,00);

Hora horaAtual = new Hora();

horaAtual.setHoraAtual();

2.3.2 REFERÊNCIA null EM JAVA

Valor default para inicialização de atributos de tipos não primitivo, indicando que
determinado atributo/variável de referência não se refere a nenhum objeto.

2.3.3 REFERÊNCIA this EM JAVA

Todos os métodos de instância recebem um parâmetro implícito chamado this que


pode ser utilizado dentro do método de instância para se referir ao objeto corrente
(cujo método foi invocado).

É normalmente utilizado em duas situações:

 Quando o nome de uma variável de instância é igual ao nome de um


parâmetro do método;
 Quando o método precisa chamar outro método passando por parâmetro uma
referência ao objeto atual.

Exemplo:

public class Hora {

private int hora;

private int minuto;

private int segundo;

public Hora(int h, int m, int s) {

setHorario(h, m, s);

public Hora(int h) {

setHorario(h, 0, 0);

public void setHorario(int hora, int minuto, int segundo) {

this.hora = hora;

this.minuto = minuto;

this.segundo = segundo;

/* Neste caso this resolve a

ambiguidade de nomes

(parâmetros x atributos) */

2.3.4 VARIÁVEIS DE CLASSE EM JAVA

É também conhecida por variável estática (static), sendo uma variável comum a
todas as instâncias da classe.

Há somente uma instância de uma variável de classe, não importa quantas


instâncias da classe existam, não sendo recomendado que seus valores sejam
alimentados por métodos construtores e sim através de inicializadores com valores
default. Exemplo:

public class Hora {

private int hora;

private int minuto;

private int segundo;

static int fusoHorario;

public Hora(int h, int m, int s) {

setHorario(h, m, s);

public Hora(int h) {

setHorario(h, 0, 0);

static {

fusoHorario = - 3;

/*

É possível definir um bloco inicializador

estático que não possui nome nem valor

de retorno e começa com a palavra static.

Ele funciona de maneira similar a um

construtor porém é executado apenas

uma vez, quando o primeiro objeto

daquela classe for instanciado.

*/

2.3.5 MÉTODOS DE CLASSE EM JAVA

Não necessitam de uma instância da classe para que sejam invocados, sendo
definidos com o uso da palavra reservada static.

Alguns exemplos (classe Math):

 Math.sqrt(double a) retorna a raiz quadrada de “a”.


 Math.abs(int a) retorna o valor absoluto de “a”.
 Math.random() retorna um valor randômico entre zero e um.

public class Hora {

private int hora;

private int minuto;

private int segundo;

static int fusoHorario;

/*

Método de classe

(Pode ser invocado diretamente

pela classe, sem a necessidade

de uma instância – objeto)

*/

public static int diferencaEmMinutos(Hora a, Hora b) {

int diferenca;

...

return diferenca;

2.3.6 SOBRECARGA DE MÉTODOS EM JAVA

São métodos de mesmo nome com assinaturas diferentes (tipos de


argumentos/parâmetros diferentes), onde:

 Valor de retorno não é considerado parte da assinatura;


 Métodos sobrecarregados são resolvidos em tempo de compilação;
Exemplo:

public class Hora {

private int hora;

private int minuto;

private int segundo;

public void ajustarHorario(int hora, int minuto, int segundo);

public void ajustarHorario(int hora, int minuto);

public void ajustarHorario(int minuto, int segundo);

/* Os dois métodos acima não tem assinaturas diferentes isso

não é permitido */

public void ajustarHorario(int hora);

2.3.7 ATRIBUTOS final EM JAVA

O modificador final indica que o atributo não poderá sofrer alteração em seu valor,
sendo que este atributo:

 Possui o mesmo comportamento de uma constante que deve ser inicializada;


 Em geral possui um escopo púbico permitindo seu acesso externo;
 O atributo PI da classe Math é um exemplo de atributo final (que retorna a
constante π);
3 ABSTRAÇÃO

Uma das principais formas do ser humano lidar com a complexidade é através do
uso de abstrações. As pessoas tipicamente tentam compreender o mundo,
construindo modelos mentais de partes dele. Tais modelos são uma visão
simplificada de algo, onde apenas elementos relevantes são considerados. Modelos
mentais, portanto, são mais simples do que os complexos sistemas que eles
modelam.

Consideremos, por exemplo, um mapa como um modelo do território que ele


representa. Um mapa é útil porque abstrai apenas aquelas características do
território que se deseja modelar. Se um mapa incluísse todos os detalhes do
território, provavelmente teria o mesmo tamanho do território e, portanto, não serviria
a seu propósito.

Da mesma forma que um mapa precisa ser significativamente menor que o território
que mapeia, incluindo apenas informações cuidadosamente selecionadas, um
modelo mental abstrai apenas as características relevantes de um sistema para seu
entendimento. Assim, podemos definir abstração como sendo o princípio de ignorar
aspectos não relevantes de um assunto, segundo a perspectiva de um observador,
tornando possível uma concentração maior nos aspectos principais do mesmo. De
fato, a abstração consiste na seleção que um observador faz de alguns aspectos de
um assunto, em detrimento de outros que não demonstram ser relevantes para o
propósito em questão, isto é, a abstração é aplicada de acordo com o interesse do
observador, e por isso de um mesmo objeto pode-se ter diferentes visões, como
demonstra a figura 7 abaixo.

Só devem ser mapeados os objetos que são relevantes ao problema, bem como as
características (propriedades e comportamento) desses objetos que forem
necessários.
Figura 7 - A abstração enfoca as características essenciais de um objeto.

No que tange ao desenvolvimento de software, duas formas adicionais de abstração


têm grande importância: a abstração de dados e a abstração de procedimentos.

3.1 O PODER DAS ABSTRAÇÕES

Em um cenário orientado a objetos, a abstração representa uma entidade do mundo


real. Mais sua importância não para por ai, a abstração é uma peça chave não só
para o cenário OO, como também, pare ter um cenário desacoplado; saber utilizar
abstrações é saber colocá-las em lugares estratégicos que venham viabilizar um
baixo acoplamento. Quando são utilizadas classes concretas ao invés de
abstrações, você cria o que é chamado de forte acoplamento, e que em caso de
mudança, causa um grande impacto e esforço para esta mudança acontecer. Veja o
diagrama abaixo:
Figura 8 - Diagrama de Classes.

Note que a classe abstrata Produto, circulada em vermelho, é a base para toda
classe que for um produto, ou seja, não importa se o produto concreto é um livro,
mochila, caderno, enfim a questão é que todas as classes serão herdeiras da classe
Produto. Dentro de sua arquitetura, a classe que for servir de base para representar
um item do mundo real, tem que conter os principais conceitos do que se deseja
abstrair. Em nosso exemplo, estamos querendo abstrair, um Produto qualquer do
mundo real, e note no diagrama mostrado anteriormente, que tenho as principais
informações na classe Produto, e toda e qualquer particularidade, passa a ser da
responsabilidade da classe concreta implementar estes detalhes; vemos no exemplo
a classe livro tendo atributos como ISBN e autor, e a classe mochila tendo os
atributos cor e marca. Mais o conceito principal e comum, a todo e qualquer Produto,
seja ele um Livro ou uma mochila, estão centralizados na abstração, ou seja, na
classe Produto.

Note que a classe ItemPedido não faz referência a classe concreta Livro ou Mochila,
ela faz referência a classe abstrata Produto; isto faz com que, qualquer alteração
nas classes concretas não irão afetar em nada a classe ItemPedido. Esta forma de
design faz com que tenhamos um baixo acoplamento e tenhamos dependências
mais leves, o que torna a manutenção mais fácil e a evolução também.
4 ENCAPSULAMENTO

No mundo real, um objeto pode interagir com outro sem conhecer seu
funcionamento interno. Uma pessoa, por exemplo, geralmente utiliza uma televisão
sem saber efetivamente qual a sua estrutura interna ou como seus mecanismos
internos são ativados. Para utilizá-la, basta saber realizar algumas operações
básicas, tais como ligar/desligar a TV, mudar de um canal para outro, regular
volume, cor, etc. Como estas operações produzem seus resultados, mostrando um
programa na tela, não interessa ao telespectador.

O encapsulamento consiste na separação dos aspectos externos de um objeto,


acessíveis por outros objetos, de seus detalhes internos de implementação, que
ficam ocultos dos demais objetos. A interface de comunicação de um objeto deve
ser definida de forma a revelar o menos possível sobre o seu funcionamento interno.

Os usuários tem conhecimento apenas das operações que podem ser realizadas e
precisam estar cientes apenas do QUE as operações fazem, e não COMO elas
estão implementadas.

Figura 9 - O encapsulamento oculta os detalhes de implementação de um objeto.

4.1 ABSTRAÇÃO X ENCAPSULAMENTO

Abstração e Encapsulamento são conceitos complementares: enquanto a abstração


enfoca o comportamento observável de um objeto (o que se deve mapear), o
encapsulamento enfoca a implementação que origina esse comportamento (como
realizar a abstração). Encapsulamento é frequentemente conseguido através do
ocultamento de informação, isto é, escondendo detalhes que não contribuem para
suas características essenciais. Tipicamente, em um sistema orientado a objetos, a
estrutura de um objeto, e a implementação de seus métodos, são encapsuladas.

Por exemplo, para usar um carro, uma pessoa não precisa conhecer sua estrutura
interna (motor, caixa de marcha, etc...), nem tampouco como se dá a implementação
de seus métodos. Sabe-se que é necessário ligar o carro, mas não é preciso saber
como esta operação é implementada.

Assim, sobre carros, um motorista precisa conhecer apenas as operações que


permitem utilizá-lo, a que chamamos de interface do objeto, o que inclui a ativação
de operações, tais como ligar, mudar as marchas, acelerar, frear, etc..., e não como
essas operações são de fato implementadas.

Encapsulamento serve para separar a interface contratual de uma abstração e sua


implementação. Os usuários têm conhecimento apenas das operações que podem
ser requisitadas e precisam estar cientes apenas do que as operações realizam e
não como elas estão implementadas.

A principal motivação para o encapsulamento é facilitar a reutilização de objetos e


garantir estabilidade aos sistemas. Um encapsulamento bem feito pode servir de
base para a localização de decisões de projeto que necessitam ser alteradas. Uma
operação pode ter sido implementada de maneira ineficiente e, portanto, pode ser
necessário escolher um novo algoritmo. Se a operação está encapsulada, apenas o
objeto que a define precisa ser modificado, garantindo estabilidade ao sistema.

4.2 COMO GARANTIR O ENCAPSULAMENTO

O conceito de encapsulamento se aplica utilizando modificadores de acesso nos


membros da classe. Os atributos de instância devem ser declarados com
modificador private. O acesso ao estado do objeto somente deve ser feito por
métodos public (que constituem a interface do objeto).

Você também pode gostar