Você está na página 1de 14

Orientao a objetos

Parte II
Facebook Twitter
(14) (0)

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


Encapsulamento e Polimorfismo)

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 geralmente atravs 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.

Você também pode gostar