Você está na página 1de 15

Orientao a objetos Parte II

Introduo da linguagem Java, Classes, Interfaces, Objetos(Herana,


Encapsulamento e Polimorfismo)
1

Introduo da linguagem Java, Classes, Interfaces, Objetos(Herana,


Encapsulamento e Polimorfismo)

Objetos
Objetos so instncias de classes. atravs deles que (praticamente) todo o
processamento ocorre em sistemas implementados com linguagens de
programao orientadas a objetos. O uso racional de objetos, obedecendo aos
princpios associados sua definio conforme estabelecido no paradigma de
desenvolvimento orientado a objetos, chave para o desenvolvimento de
sistemas complexos e eficientes.

Um objeto um elemento que representa, no domnio da soluo, alguma


entidade (abstrata ou concreta) do domnio de interesse do problema sob
anlise. Objetos similares so agrupados em classes.

No paradigma de orientao a objetos, tudo pode ser potencialmente


representado como um objeto. Sob o ponto de vista da programao orientada
a objetos, um objeto no muito diferente de uma varivel normal.

Um programa orientado a objetos composto por um conjunto de objetos que


interagem atravs de trocas de mensagens. Na prtica, essa troca de
mensagem traduz-se na aplicao de mtodos a objetos.

As tcnicas de programao orientada a objetos recomendam que a estrutura


de um objeto e a implementao de seus mtodos devem ser to privativos
como possvel. Normalmente, os atributos de um objeto no devem ser visveis
externamente. Da mesma forma, de um mtodo deve ser suficiente conhecer

apenas sua especificao, sem necessidade de saber detalhes de como a


funcionalidade que ele executa implementada.

Encapsulao o princpio de projeto pelo qual cada componente de um


programa deve agregar toda a informao relevante para sua manipulao
como uma unidade (uma cpsula). Aliado ao conceito de ocultamento de
informao, um poderoso mecanismo da programao orientada a objetos.

Ocultamento da informao o princpio pelo qual cada componente deve


manter oculta sob sua guarda uma deciso de projeto nica. Para a utilizao
desse componente, apenas o mnimo necessrio para sua operao deve ser
revelado (tornado pblico).

Na orientao a objetos, o uso da encapsulao e ocultamento da informao


recomenda que a representao do estado de um objeto deve ser mantida
oculta. Cada objeto deve ser manipulado exclusivamente atravs dos mtodos
pblicos do objeto, dos quais apenas a assinatura deve ser revelada.

O conjunto de assinaturas dos mtodos pblicos da classe constitui sua


interface operacional.

Dessa forma, detalhes internos sobre a operao do objeto no so


conhecidos, permitindo que o usurio do objeto trabalhe em um nvel mais alto
de abstrao, sem preocupao com os detalhes internos da classe. Essa
facilidade permite simplificar a construo de programas com funcionalidades
complexas, tais como interfaces grficas ou aplicaes distribudas.

Exemplo:
public class Consulta {
public static void main(String[]args){
Pessoa pess = new Pessoa();

pess.nome = "Joao";
pess.apelido = "Joca";
pess.altura = 170.0f;
pess.idade = 34.0f;
pess.peso = 65.0f;
}
}

public class Pessoa {


public String nome, apelido;
public Float idade, peso, altura;

Observe como seria o acesso a estes atributos em um pseudocdigo. Veja que


a palavra pess utilizada para referenciar um objeto da classe Pessoa criada.

Princpios da Orientao a Objetos


Em Orientao a Objetos temos trs conceitos bsicos:

Herana: A capacidade de uma Classe herdar mtodos e propriedades de uma


classe ancestral. Ela pode acrescentar ou modificar o comportamento de sua
ancestral.

Encapsulamento: A capacidade que uma Classe tem de ocultar a sua prpria


implementao, apresentando ao cliente que a utiliza apenas uma interface
simplificada.

Polimorfismo: A habilidade de mtodos com mesmo nome apresentarem


comportamento diferente em classes diferentes (porm derivadas de um
mesmo ancestral). Para uma linguagem de programao ser considerada
Orientada a Objetos necessrio implementar mecanismos que permitam
utilizar estes trs conceitos bsicos.

Herana
A herana a principal caracterstica de distino entre um sistema de
programao orientado a objeto e outros sistemas de programao. As classes
so inseridas em uma hierarquia de especializaes de tal forma que uma
classe mais especializada herda todas as propriedades da classe mais geral a
qual subordinada na hierarquia. A classe mais geral
denominada superclasse e a classe mais especializada subclasse.

O principal benefcio da herana a reutilizao de cdigo. A herana permite


ao programador criar uma nova classe programando somente as diferenas
existentes na subclasse em relao superclasse. Isto se adequa bem a forma
como compreendemos o mundo real, no qual conseguimos identificar
naturalmente estas relaes.

A fim de exemplificarmos este conceito, vamos considerar que queiramos


modelar os seres vivos pluricelulares existentes no planeta. Podemos ento
comear com a classe SerVivo abaixo:

Ela modela as caractersticas que todo ser vivo deve possuir, como a
capacidade de reproduzir-se ou a necessidade de alimentar-se. Sendo assim, a
classe SerVivo define atributos e mtodos tais como:

Atributos: Alimentos, Idade


Mtodos: Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer

Os seres vivos por sua vez classificam-se em Animais e Vegetais, os quais


possuem caractersticas prprias que os distingue:

Analisando o problema em questo (o de modelar os seres vivos), ns


naturalmente identificamos classes que so especializaes de classes mais
genricas e o conceito de herana da orientao a objeto nos permite
implementar tal situao.

Os animais e vegetais antes de tudo so seres vivos e cada subclasse herda


automaticamente os atributos e mtodos (respeitando as regras dos
modificadores de acesso) da superclasse, neste caso, a classe SerVivo. Alm
disso, as subclasses podem prover atributos e mtodos adicionais para
representar suas prprias caractersticas. Por exemplo, a classe Animal
poderia definir os seguintes mtodos e atributos:

Atributos: Forma de Locomoo, Habitat, Tempo Mdio de Vida


Mtodos: Locomover

A herana na programao obtida especificando-se qual superclasse a


subclasse
estende. Em Java isto feito utilizando-se a palavra chave extends:

public class SerVivo {


//Definio da classe SerVivo
}
public class Animal extends SerVivo {
//Atributos e mtodos adicionais que distinguem um Animal de um SerVivo
//qualquer
}

Em Java, todas as classes, tanto as existentes nas APIs como as definidas


pelos programadores, automaticamente derivam de uma superclasse padro, a
classe Object.

Se uma classe no especifica explicitamente uma superclasse, como o caso da


classe SerVivo, ento podemos considerar que esta deriva diretamente de
Object, como se ela tivesse sido definida como:

public class SerVivo extends Object { ... }

Alm disso, Java permite apenas herana simples, isto , uma classe pode
estender apenas de uma nica outra classe.

Resumindo, a classe SerVivo define os atributos e mtodos que so comuns a


qualquer tipo de ser vivo. A subclasse Animal herda estes mtodos e atributos,
j que Animal um SerVivo , e tem que especificar apenas seus atributos e
mtodos especficos.

Encapsulamento
Diferente da abordagem estruturada, onde dados e procedimentos so
definidos de forma separada no cdigo, na programao orientada a objeto os
dados e procedimentos que manipulam estes dados so definidos numa
unidade nica, o objeto. Isso possibilita uma melhor modularidade do cdigo,
porm, a idia principal poder utilizar os objetos sem ter que se conhecer sua
implementao interna, que deve ficar escondida do usurio do objeto que ir
interagir com este apenas atravs de sua interface.

propriedade de se implementar dados e procedimentos correlacionados em


uma mesma entidade e de se proteger sua estrutura interna escondendo-a de
observadores externos d-se o nome de encapsulamento.

O objetivo do encapsulamento separar o usurio do objeto do programador


do objeto e seus principais benefcios so:

possibilidade de alterar a implementao de um mtodo ou a estrutura de


dados escondidos de um objeto sem afetar as aplicaes que dele se utilizam;

criao de programas mais modulares e organizados, o que possibilita um


melhor reaproveitamento do cdigo e melhor mantenabilidade da aplicao.

Via de regra, as variveis de instncia declaradas em uma definio de classe,


bem como os mtodos que executam operaes internas sobre estas variveis,
se houverem, devem ser escondidos na definio da classe. Isso feito
geralmenteatravs de construes nas linguagens de programao conhecidas
como modificadores de acesso, como por exemplo,
o public, protected e private do Java. Quando definimos uma classe,
recomendado (para alguns uma regra sagrada) que declaremos
pblicos apenas os mtodos da sua interface. na interface (ou protocolo) da
classe que definimos quais mensagens podemos enviar s instncias de uma
classe, ou seja, quais so as operaes que podemos solicitar que os objetos
realizem. Por exemplo, na classe Ponto abaixo, deveramos ter feito seus
atributos protegidos e apenas o mtodo pblico:

public class Ponto


{
private double x;
private double y;
public void girar (int grau, Ponto p) {
//Cdigo para girar o ponto em torno de outro ponto p a quantidade definida em
//grau
}
//Os mtodos pblicos consistuem a interface da classe.

public void setX (double k) { x = k; }


public void setY (double k) { y = k; }
public double getX () { return x; }
public double getY () { return y; }

}
comum em programao orientada a objeto definir mtodos gets e sets que
provm acesso aos dados protegidos da classe.

Criando Objetos e Acessando Dados Encapsulados


Criamos objetos em Java de forma muito similar a criao de variveis de tipos
primitivos. Se uma aplicao quisesse usar a classe Crculo, poderia declarar
uma varivel deste tipo da seguinte forma:

Crculo crculo; Como Java case-sensitive pode-se declarar desta forma.


//Esta sentena cria uma varivel crculo do tipo Crculo.

Entretanto, isso no suficiente para acessarmos os mtodos e atributos


pblicos da classe. A sentena acima somente declara uma varivel, mas no
cria um objeto da classe especificada. Em Java, objetos so criados usando o
operador new da seguinte forma:

Crculo crculo;
crculo = new Crculo();

O operador new cria uma instncia da classe e retorna a referncia do novo


objeto.
Como vimos, todos os objetos em Java so tratados atravs da referncia ao
endereo de memria onde o objeto est armazenado. O operador new realiza
trs tarefas:

1. Aloca memria para o novo objeto;


2. Chama um mtodo especial de inicializao da classe chamado construtor;

3. Retorna a referncia para o novo objeto;

importante compreender o que ocorre na declarao da varivel e na


inicializao da varivel. Quando fazemos

reservado uma poro da memria principal do Java (stack) para armazenar


o endereo na memria auxiliar (heap) onde o objeto ser armazenado. Como
apenas com a declarao da varivel o objeto ainda no existe, o contedo
inicial dela ser o valor nulo (null), indicando que ela ainda no se refere a
nenhum objeto. Apenas aps a inicializao

que uma varivel de um tipo no primitivo estar valendo algo e atravs dela
ser possvel acessar os dados e operaes do objeto em questo.

Uma vez um objeto tendo sido criado, seus mtodos e atributos pblicos
podem ser acessados utilizando o identificador do objeto (varivel que
armazena sua referncia) atravs do operador ponto:

<identificador>.<atributo>
<identificador>.<mtodo>

A aplicao que criou o objeto Crculo acima pode solicitar ao objeto que ele se
desenhe fazendo:

crculo.criaCrculo();

Polimorfismo
O termo Polimorfismo origina-se do grego e quer dizer "o que possui vrias
formas".

Em programao est relacionado possibilidade de se usar o mesmo nome


para mtodos diferentes e capacidade que o programa tem em discernir,
dentre os mtodos homnimos, aquele que deve ser executado. De maneira
geral o polimorfismo permite a criao de programas mais claros, pois elimina a
necessidade de darmos nomes diferentes para mtodos que conceitualmente
fazem a mesma coisa, e tambm programas mais flexveis, pois facilita em
muito a extenso dos mesmos.

O polimorfismo pode ser de duas formas, esttico ou dinmico:

Polimorfismo Esttico: Ocorre quando na definio de uma classe criamos


mtodos com o mesmo nome, porm com argumentos diferentes. Dizemos
neste caso que o mtodo est sobrecarregado (overloading). A deciso de qual
mtodo chamar tomada em tempo de compilao, baseada nos argumentos
que foram passados.

Como exemplo de polimorfismo esttico, podemos relembrar dos vrios


construtores que criamos para a classe Crculo:

Crculo() {}

Crculo(Ponto centro, Ponto extremidade, Cor c) {


raio = new Linha(centro, extremidade, c);
cor = c;
}
Crculo (double x1, double y1, double x2, double y2, Cor c)
{
raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c);
cor = c ;
}

Todos estes mtodos construtores possuem o mesmo nome, mas devem ser
diferidos entre si pelos parmetros que recebem.

Quando num programa fazemos Crculo circulo = new Crculo(linha); o


compilador consegue decidir em tempo de compilao qual mtodo chamar,
neste caso, o mtodo Crculo que recebe uma linha como parmetro.

Polimorfismo Dinmico: Esta associado com o conceito de herana e ocorre


quando uma subclasse redefine um mtodo existente na superclasse. Dizemos
neste caso que o mtodo foi sobreescrito (overriding) na subclasse. A deciso
de qual mtodo executar tomada somente em tempo de execuo, como
veremos mais adiante.

O polimorfismo dinmico ocorre quando uma subclasse redefine um mtodo de


sua superclasse a fim de prover ao mtodo um comportamento mais adequado
s suas caractersticas. Vamos rever a classe animal conforme a definimos
abaixo:

class Animal extends SerVivo{


String formaLocomoo;
String habitat;
int tempoMdioVida;
public void locomover() { ... }
}

Como nem todo ser vivo nasce, cresce, alimenta-se, respira, se reproduz e
morre da mesma maneira, razovel que queiramos redefinir todos estes
mtodos na classe animal:

class Animal extends SerVivo{


String formaLocomoo;
String habitat;
int tempoMdioVida;
public void locomover() { ... }
public void nascer() { ... }
public void crescer() { ... }
public void alimentar() { ... }
public void respirar() { ... }
public Animal reproduzir() { ... }
public morrer() { ... }
}

Os mtodos na subclasse devem ser definidos com a mesma assinatura do


mtodo na superclasse, isto , com o mesmo nome, tipo de retorno e
argumentos.

Bem, mas a vantagem do polimorfismo dinmico no apenas a de permitir


maior flexibilidade na modelagem das classes de objetos. Para entendermos o
que h de mais fantstico nele, temos que nos atentar para o seguinte:

Tendo isto em mente, poderamos definir um mtodo da seguinte forma:

void analisaSerVivo (SerVivo ser) {


//Este mtodo faz a anlise clnica de qualquer SerVivo e para isso precisa
pedir
//ao animal que respire
ser.respirar();
...
}

e num determinado momento cham-lo desta maneira

...
Animal animal = new Animal();
analisaSerVivo(animal);
...

Neste caso fica a questo, se o mtodo tem um argumento declarado como


SerVivo e recebe como parmetro um objeto Animal, quando tiver que executar
o mtodo respirar() qual mtodo ser efetivamente chamado, o mtodo respirar
definido em
SerVivo ou o mtodo respirar definido em Animal?

O mtodo executado ser o mais apropriado, isto , aquele pertencente ao


objeto que foi passado varivel, neste caso, o mtodo respirar existente em
Animal.

Isto , o polimorfismo dinmico, que recebe este nome porque o compilador


no consegue nestes casos decidir em tempo de compilao qual mtodo
chamar, j que uma varivel de um tipo base pode receber qualquer tipo
derivado. Esta deciso feita apenas em tempo de execuo, quando a o
Java poder saber qual objeto a varivel est de fato referenciando.

Se o polimorfismo dinmico no existisse, seria necessrio um mtodo


analisaSerVivo para cada ser vivo existente, e sempre que um ser vivo novo
fosse acrescentado o cdigo teria que ser modificado. Da forma como aqui
est, o mtodo continuar funcionando para qualquer ser vivo existente no
projeto.