Вы находитесь на странице: 1из 115

Alan Santos

3 FUNDAMENTOS DA ORIENTAO
A OBJETOS

Alan Santos 1
3.1 Introduo
OO uma tecnologia de desenvolvimento
composta por
metodologias e
linguagens
usada
na anlise,
no projeto e
na implementao de programas

(Albuquerque, 1999).

Alan Santos 2
3.1 Introduo
um paradigma para o desenvolvimento de
software que baseia-se na utilizao de
componentes individuais (objetos) que
colaboram para construir sistemas mais
complexos.
A colaborao entre os objetos feita atravs do
envio de mensagens.
Um paradigma um conjunto de regras que
estabelecem fronteiras e descrevem como resolver
problemas dentro desta fronteira.
Um paradigma ajuda-nos a organizar a e coordenar a
maneira como olhamos o mundo.

Alan Santos 3
3.1 Introduo
Para entendermos os conceitos de orientao
a objetos necessrio entendermos o que
um objeto.

Alan Santos 4
3.1 Introduo
Consideremos objetos do mundo real
Ex.: seu cachorro, seu computador, sua bicicleta.

Os objetos do mundo real tm duas


caractersticas:
estado e
comportamento.
Ex.: cachorros tem estados (nome, cor, tamanho)
e comportamentos (latir, andar, correr).

Alan Santos 5
3.1 Introduo

Alan Santos 6
3.1 Introduo
Objetos de software, assim como objetos do
mundo real, possuem estado (variveis) e
comportamento (mtodos).
Dessa forma, podemos representar objetos do
mundo real atravs de objetos de software
Ex.: um livro, uma cadeira
Tambm podemos modelar conceitos abstratos
Ex.: uma ao do usurio em uma interface grfica.

Alan Santos 7
3.1 Introduo
Um objeto representa uma entidade, tanto fsica
quanto conceitual ou de software.
Entidade Fsica: caminho, carro, bicicleta, etc.
Entidade Conceitual: processo qumico, matrcula, etc
Entidade de Software: lista encadeada, arquivo, etc.

Podemos afirmar que um objeto um conceito,


abstrao, ou entidade com limites bem definidos
e um significado para a aplicao.

Alan Santos 8
3.1 Introduo
Considere um objeto que representa uma
conta corrente em um sistema bancrio.
Atravs dos mtodos, pode-se, por exemplo,
depositar e sacar.
Alm dos mtodos responsveis pelos servios, o
objeto deve conter dados, como o nome do dono
da conta e o valor do saldo.

Alan Santos 9
3.1 Introduo

Exemplo de um objeto

Alan Santos 10
3.1.1 Vantagens da Orientao a
Objetos
Facilita a reutilizao de cdigo
Os modelos refletem o mundo real de maneira
mais aproximada:
Descrevem de maneira mais precisa os dados
A decomposio baseada em um particionamento
natural e
Mais fceis de entender e manter.
Pequenas mudanas nos requisitos no implicam
em alteraes massivas no sistema em
desenvolvimento.
Implementao de Tipos Abstratos de Dados

Alan Santos 11
3.1.1 Vantagens da Orientao a
Objetos
A orientao a objetos no garante a
reutilizao, ela oferece mecanismos para
que isso ocorra, mas sempre ser funo do
desenvolvedor garantir isso.

Alan Santos 12
3.2 Desenvolvimento Orientado a
Objetos
Anlise Orientada a Objetos: o processo de construo de modelos do
domnio do problema, identificando e especificando um conjunto de
objetos que interagem e comportam-se conforme os requisitos
estabelecidos para o sistema.

Projeto Orientado a Objetos: o processo de gerao de uma


especificao detalhada do software a ser desenvolvido, de tal forma que
esta especificao possa levar a direta implementao no ambiente alvo.

Programao Orientada a Objetos: um modelo de programao que


baseia-se em conceitos como classes, objetos, herana, etc. Seu objetivo
a resoluo de problemas baseada na identificao de objetos e o
processamento requerido por estes objetos, e ento na criao de
simulaes destes objetos.
Alan Santos 13
3.2.1 Programao Orientada a
Objetos
A programao obtida atravs da definio de
classes e criao de hierarquias, nas quais
propriedades comuns so transmitidas das
superclasses para as subclasses atravs do
mecanismo de herana.

Objetos destas classes so instanciados tal que a


execuo do programa vista como um conjunto de
objetos relacionados que se comunicam enviando
mensagens uns para os outros.
Alan Santos 14
3.3 Paradigma Procedural x OO
Paradigma Procedural Paradigma de Objetos
Tipos de Dados Classes
Varivel Objeto / Instncia
Funo / Operao / Mtodo
Procedimento Servio
Chamada de Funo Envio de Mensagem.

Alan Santos 15
3.4 Conceitos OO
O paradigma de objetos baseia-se nos
seguintes conceitos:
Classes
Objetos
Herana
Polimorfismo e
Binding Dinmico
Cada um destes conceitos ser abordado a
seguir.

Alan Santos 16
3.1 Classes e Objetos
Em um programa orientado a objetos
normalmente existem vrios objetos de um
mesmo tipo.
Por exemplo, um programa de controle de estoque de
uma livraria pode conter vrios clientes e vrios livros.
As classes descrevem as informaes
armazenadas e os servios providos por um
objeto.
Em outras palavras, so padres a partir dos quais os
objetos so criados (cdigo).

Alan Santos 17
3.1 Classes e Objetos
Um objeto uma instncia de uma classe.
Os objetos que so instncias de uma mesma
classe armazenam os mesmos tipos de
informaes e apresentam o mesmo
comportamento.

Alan Santos 18
3.1 Classes e Objetos
Um objeto representa uma entidade
concreta (ex. produto em estoque) ou
abstrata (transao bancria, histrico, taxa de
juros) do mundo real.
Tambm pode ser algo necessrio ao
funcionamento do sistema sem uma ligao
forte com uma entidade do mundo real.

Alan Santos 19
3.1 Classes e Objetos
Um objeto num sistema possui trs propriedades:
Estado: definido pelo conjunto de propriedades do objeto
(os atributos) e de suas relaes com os outros objetos,
muda com o tempo.
Ex. objeto turma pode estar aberta ou fechada passa ao estado
fechada quando 10 alunos fizerem a inscrio.
Comportamento: como um objeto responde s solicitaes
dos outros e tudo mais o que um objeto capaz de fazer.
implementado por um conjunto de operaes.
Ex. objeto turma pode ter operaes acrescentar aluno ou
suprimir aluno.
Identidade: significa que cada objeto nico no sistema

Alan Santos 20
3.1 Classes e Objetos
Em Java, uma classe definida pela palavra-chave
class seguida do nome da classe.

A conta corrente uma classe que definida da


seguinte maneira:

class ContaCorrente {
// Definio dos mtodos e atributos
}

Alan Santos 21
3.1.1 Variveis
Definem o comportamento esttico do objeto.
Para cada varivel so especificados:
um modificador (opcional),
o nome,
o tipo
e o valor inicial (opcional) do atributo.

Alan Santos 22
3.1.1 Variveis
Na classe ContaCorrente, defina os atributos:
nome (nome do titular da conta) e
saldo (valor do saldo)

Alan Santos 23
3.1.2 Mtodos
Definem os servios que podem ser solicitados a
uma instncia (objeto),
ou seja, o comportamento dinmico de um objeto.
A definio de um mtodo em Java inclui
um modificador (opcional),
o tipo do dado retornado aps a execuo do
mtodo,
o nome do mtodo,
o nome e tipo dos parmetros
e o cdigo delimitado por chaves ( { } ).

Alan Santos 24
3.1.2 Mtodos
Na classe ContaCorrente, defina os mtodos:
verificaSaldo: retorna o saldo da conta corrente;
depositaValor: deposita um valor especificado x
na conta;
retiraValor: retira um valor especificado x da
conta;

A lgica dos mtodos escrita a seguir:

Alan Santos 25
3.1.2 Mtodos
class ContaCorrente {
float saldo;
String nome;

float verificaSaldo ( ) {
return saldo;
}
void depositaValor (float valor) {
saldo = saldo + valor;
}
void retiraValor (float valor) {
if (saldo>=valor) {
saldo = saldo valor;
}
}
}
Alan Santos 26
3.1.3 Mtodos Construtores
Quando uma classe criada, pode ser necessrio
atribuir um valor inicial a algumas variveis ou
chamar um mtodo.

Isto pode ser feito atravs de um mtodo


construtor, o qual automaticamente executado
toda vez que a classe instanciada.

Em Java, os construtores tm o mesmo nome da


classe a qual so membros.

Alan Santos 27
3.1.3 Mtodos Construtores
O mtodo construtor no tem tipo de retorno
O tipo implcito de retorno de um objeto construtor a
instncia da prpria classe.

No obrigatrio criar um construtor


Caso no exista a declarao de um construtor, o compilador
gera automaticamente um construtor default (padro).

Uma mesma classe pode ter vrios construtores, desde que


eles tenham
Quantidade diferente de parmetros ou
Parmetros de tipos diferentes.
Alan Santos 28
3.1.4 Instanciando uma classe
Em Java, os objetos so criados (as classes so instanciadas)
atravs do operador new.

A execuo desse comando cria um objeto de um


determinado tipo (classe) e retorna uma referncia a este
objeto.

Alan Santos 29
3.1.4 Instanciando uma classe
Implemente e execute o cdigo abaixo e observe o resultado:
ContaCorrente minhaConta;
minhaConta = new ContaCorrente (Maria);

Alan Santos 30
3.1.4 Instanciando uma classe
Analise o que aconteceu
Na primeira linha tem-se o nome da varivel (minhaConta) na qual o
identificador do objeto ser armazenado.
Na segunda linha criado o objeto do tipo ContaCorrente com o
comando new que retorna o identificador do objeto que
armazenado na varivel minhaConta.
O cdigo anterior poderia ser escrito tambm da seguinte
maneira:
ContaCorrente minhaConta = new
ContaCorrente (Maria);

Alan Santos 31
3.1.5 Operador this
Java inclui um valor de referncia especial, chamado this,
que usado dentro de qualquer mtodo para referir-se ao
objeto corrente.

O valor de this refere-se ao objeto do qual o mtodo


corrente foi chamado.

Em Java permitido que variveis locais (dentro de um


mtodo) tenham o mesmo nome de variveis de instncia.

Para definir que se est acessando a varivel de instncia,


usa-se o this.

Alan Santos 32
3.1.5 Operador this
Declare os mtodos construtores da classe
ContaCorrente da seguinte maneira:
class ContaCorrente {
float saldo;
String nome;
public ContaCorrente (String nome) {
this.nome = nome;
saldo = 0;
}
... // restante do cdigo }

Alan Santos 33
3.1.6 Acessando mtodos e variveis
de um objeto
Aps criar um objeto, queremos manipular os
seus dados acessando as variveis e mtodos
deste objeto.

Os mtodos e variveis so chamados de uma


instncia de outra classe atravs de operador
ponto ( . ).

Alan Santos 34
3.1.6 Acessando mtodos e variveis
de um objeto
Implemente uma classe chamada
AcessaContaCorrente que cria um
objeto do tipo ContaCorrente e modifica os
seus valores, definindo o nome do dono da
conta e modificando e visualizando o saldo.

Alan Santos 35
3.1.6 Acessando mtodos e variveis
de um objeto
class AcessaContaCorrente {
public static void main (String args [ ]) {
ContaCorrente minhaConta = new
ContaCorrente (Maria);
float saldo;
saldo = minhaConta.verificaSaldo ( );
System.out.println (saldo);
minhaConta.depositaValor (200);
saldo = minhaConta.verificaSaldo ( );
System.out.println (saldo);
}
}

Alan Santos 36
3.1.6 Acessando mtodos e variveis
de um objeto
Crie um objeto do tipo ContaCorrente com
valores iniciais de Joo para nome e 1000
para valor.
Depois,
verifique o saldo da conta,
deposite 300 e
verifique novamente o saldo.

Alan Santos 37
3.1.7 Variveis de Classe e Instncia
As variveis de uma classe podem ser
de instncia ou
de classe.

Cada classe possui as suas prprias cpias das


variveis de instncia, enquanto que as
variveis de classe so compartilhadas.

Alan Santos 38
3.1.7 Variveis de Classe e Instncia
Altere a classe ContaCorrente acrescentando a
varivel de classe dinheiroTotal, para guardar
o somatrio dos saldos de todas as contas.

Alan Santos 39
3.1.7 Variveis de Classe e Instncia
class ContaCorrente {
static float dinheiroTotal;
float saldo; String nome;

float verificaSaldo ( ) {
return saldo;
}
void depositaValor (float valor) {
saldo = saldo + valor;
dinheiroTotal += valor;
}
void retiraValor (float valor) {
if (saldo>=valor) {
saldo = saldo valor;
dinheiroTotal -= valor;
}
} Alan Santos 40
}
3.1.7 Variveis de Classe e Instncia
Cada instncia da classe ContaCorrente
(objeto) ter as mesmas variveis (saldo e
nome), porm, elas podem ter valores
diferentes em cada instncia.
A varivel de classe (dinheiroTotal), porm,
compartilhada por todos os objetos.
Por isso, possui o mesmo valor para todos os
objetos e se um objeto modificar o seu valor, o
novo valor visto por todos os outros objetos.

Alan Santos 41
3.1.7 Variveis de Classe e Instncia

Mltiplas instncias de uma classe

Alan Santos 42
3.1.7 Variveis de Classe e Instncia

Membros static
Definem membros da classe
No existem em cada objeto
Pode ser aplicado a atributos e mtodos
Podem ser acessados por objetos
No necessrio criar objeto, pode-se acessar
diretamente da classe
NomeClasse.membro
Alan Santos 43
3.1.7 Variveis de Classe e Instncia
public class ImprimirStrings {
1 String str = atributo-nao-estatico;
2 public void imprimir() {
3 String a = new String(abcdef);
4 String b = new String(xyz);
5 System.out.println(a.concat(b));
6 }
7 public static void main(String[] args) {
8 imprimir();
9 }
10 }

Alan Santos 44
3.1.7 Variveis de Classe e Instncia
O compilador acusa o seguinte erro na linha 9:
non-static method imprimir() cannot be
referenced from static context.
Por que isso acontece?
Um mtodo de classe no pode chamar um
mtodo de instncia, pois no h objeto
instanciado.

Alan Santos 45
3.1.7 Variveis de Classe e Instncia
Se fizermos referncia ao atributo no-esttico
str no mtodo main ou no imprimir obtermos o
seguinte erro de compilao:
non-static variable str cannot be referenced from
static context.
Por que isso acontece?
Mtodos estticos NO acessam variveis de
instncia
Mtodos estticos S acessam variveis estticas
e/ou declaradas no corpo do mtodo

Alan Santos 46
3.1.7 Variveis de Classe e Instncia
Resumindo:
Mtodos e atributos no-estticos no podem ser
referenciados em contextos estticos.

Alan Santos 47
3.1.7 Variveis de Classe e Instncia
1 public class Circulo {
2 static final double PI = 3.14159;
3 public static double calculaArea(double
raio) {
4 return PI * ( raio * raio );
5 }
6 }
7
8 // um mtodo qualquer
9 // utilizamos o nome da classe

10 double areaCirculo = Circle.calculaArea(5);

Alan Santos 48
3.1.7 Variveis de Classe e Instncia
No devemos abusar de mtodos estticos
porque um programa que utiliza somente
mtodos de classe no orientado a objetos
(no h objetos)

Alan Santos 49
3.2 Sobrecarga de Mtodos
(Overloading)
Muitas vezes desejvel criar mtodos com
mesmo nome, mas lista de parmetros
diferentes.
Em Java isto chamado de sobrecarga de
mtodos (ou overloading) e reconhecido em
tempo de compilao.
devido a esta propriedade que podemos ter
dois mtodos construtores com parmetros
diferentes.

Alan Santos 50
3.2 Sobrecarga de Mtodos
(Overloading)
Sobrecarregue o mtodo construtor da
classe ContaCorrente
Crie um construtor que receba como
parmetro o nome do titular da conta
E outro que receba o nome e o saldo inicial

Alan Santos 51
3.2 Sobrecarga de Mtodos
(Overloading)
class ContaCorrente {
static float dinheiroTotal;
float saldo;
String nome;
public ContaCorrente (String nome) {
this.nome = nome;
saldo = 0;
}
public ContaCorrente (String nome, float
saldo) {
this.nome = nome;
this.saldo = saldo;
} ... // restante do cdigo

Alan Santos 52
3.3 Passagem de Parmetros em Java
A passagem de parmetros em Java por valor e no por
referncia.
Por exemplo, no possvel alterar o valor de um parmetro
recebido do tipo primitivo dentro de um mtodo, pois os dados
primitivos so passados por valor.
Isso significa que o mtodo no tem acesso a varivel que foi
usada para passar o valor.
Quanto aos objetos, as referncias aos objetos tambm so
passadas por valor.
Desta maneira, voc no pode alterar a varivel que referencia
um objeto, ou seja, no pode fazer com que a varivel que
referencia o objeto aponte para outro objeto.
Mas, pode-se alterar o contedo do objeto a qual essa varivel
referencia, alterando o valor de um de seus atributos.

Alan Santos 53
3.4 Visibilidade
Em Java existem modificadores para
determinar a visibilidade das variveis e
mtodos.
Por exemplo, uma varivel ou mtodo public
(pblico) pode ser acessada por outros objetos,
porm se for private (privado) somente pode ser
chamada dentro do prprio objeto.

Alan Santos 54
3.4 Visibilidade

Alan Santos 55
3.4 Visibilidade
Como os dados geralmente esto protegidos,
e no podem ser acessados diretamente, o
acesso aos dados feito atravs dos mtodos.
Desta maneira, os dados podem ser acessados
somente pelo cdigo dos mtodos.
Essa propriedade de proteger os dados
privados com mtodos pblicos chamada de
encapsulamento.

Alan Santos 56
3.4.1 Encapsulamento
Benefcios
O cdigo cliente pode usar apenas a interface para
a operao
A implementao do objeto pode mudar, para
corrigir erros, aumentar performance, etc sem
que seja necessrio modificar o cdigo do cliente
A manuteno mais fcil e menos custosa e
Cria um programa legvel e bem estruturado.

Alan Santos 57
3.4 Visibilidade
Um bom hbito de programao consiste em
deixar privado tudo aquilo que no precisa ser
acessado por um mtodo de outro objeto.
Dessa forma, a classe ContaCorrente poderia
ter os seus dados privados e os mtodos
pblicos para que outras classes possam
cham-los.
Altere a classe ContaCorrente de acordo com
essa regra

Alan Santos 58
3.4.1 Pacotes
Servem para organizar o cdigo, por exemplo, agrupar classes
correlatas.
Vamos supor uma classe ponto pertencente ao pacote formas.
A classe ponto internamente nomeada por formas.ponto.
Assim se voc estiver utilizando numa aplicao pacotes
desenvolvidos por pessoas (empresas) diferentes, h menos risco de
haver coincidncia de nomes de classes.

package formas;

Se voc no declarar o pacote, a classe pertence automaticamente


ao pacote default que o diretrio corrente.

Alan Santos 59
3.4.1 Pacotes
Declarao Java:
package formas;
Para incluir um pacote num cdigo faz-se:
//inclui todas as classes
definidas no pacote formas
import formas.*;
// inclui uma classe especfica
import formas.Ponto;

Alan Santos 60
3.5 Herana
quando novas classes herdam propriedades
(dados e mtodos) de outras classes existentes.
Esse um importante recurso da orientao a
objetos que permite a reutilizao de cdigo.
As classes que herdam as propriedades so
chamadas subclasses e a classe pai chamada
superclasse.
Em Java usada a palavra extends para
implementar a herana.
Alan Santos 61
3.5 Herana
A utilizao da herana facilita a reutilizao de
cdigo porque o cdigo definido na superclasse
pode ser utilizado automaticamente na subclasse
Atravs da herana possvel representar a
relao de generalizao/especializao entre
duas classes:
a superclasse uma generalizao da(s) subclasse(s),
e
a subclasse uma especializao da(s) superclasse(s).

Alan Santos 62
3.5 Herana
A classe Ponto abaixo representa um ponto geomtrico no
plano cartesiano com duas coordenadas x e y.
class Ponto {
int x, y;
public Ponto (int x, int y) {
this.x = x;
this.y = y;
}
public Ponto ( ) {
this (-1, -1); // this tambm pode ser usado
para chamar construtores
}
public void print ( ) {
System.out.print (x +", "+ y);
}
Alan Santos 63
}
3.5 Herana
Suponha que queremos construir uma classe
Ponto3D que represente um ponto tri-
dimensional (com 3 coordenadas) de forma que
as variveis x e y no precisem ser declaradas em
Ponto3D.

Para isso, construa uma hierarquia de classes


onde Ponto a superclasse e Ponto3D a
subclasse, com os atributos x e y sendo herdados
de Ponto.
Alan Santos 64
3.5 Herana
A herana deve ser utilizada visando a
reutilizao de comportamento.
Ou seja, as classes derivadas devem se comportar como as
superclasses.
Para isso sempre deve existir uma hierarquia
de Generalizao /Especializao entre as
classes.

Alan Santos 65
3.5 Herana
Um objeto do tipo crculo pode ser usado no lugar de um
objeto do tipo elipse porque todo crculo um tipo especial
de elipse.
No h limites no nmero de nveis na hierarquia de herana.
Mtodos construtores no so herdados!
Mas um construtor de uma classe base chamado
implicitamente antes da primeira linha do construtor da
classe derivada.

Alan Santos 66
3.5.1 super
A declarao super pode ser usada como uma
verso do this, ao que se refere superclasse.

O super faz a chamada do mtodo construtor


da superclasse.

Tambm pode ser usada para chamar


mtodos da superclasse.
Alan Santos 67
3.5.1 super
Implemente uma verso melhorada da classe
Ponto3D, onde o cdigo abaixo, que est
presente em ambas as classes, substitudo
pela declarao super, que faz a chamada do
mtodo construtor da superclasse Ponto.
this.x = x;
this.y = y;

Alan Santos 68
3.5.1 super
Adicione em Ponto3D o mtodo
printPonto3D.
A implementao desse mtodo dever usar a
declarao super.print ( ) para chamar o
mtodo print() da superclasse da instncia
this e possuir uma linha e cdigo para
imprimir a coordenada z;

Alan Santos 69
3.6 Sobreposio (Overriding)
No exemplo anterior, foi necessrio reescrever o
mtodo print na classe Ponto3D para que ele agora
imprimisse a coordenada do ponto em 3 eixos (x, y, z).
Podemos utilizar a propriedade de sobreposio.
Reescreva o mtodo print na classe Ponto3D com o
mesmo nome ao invs de outro como utilizado (print
Ponto3D).
Mas, observe que o mtodo deve ter a mesma
assinatura (nome, argumentos e valor de retorno),
seno no se trata de redefinio e sim de sobrecarga
(overloading) do mtodo.

Alan Santos 70
3.6 Sobreposio (Overriding)
Crie uma classe TestePonto com o seguinte mtodo
main
public static void main (String args []) {
Ponto3D p3 = new Ponto3D( );
p3.print( );
}
Ao executar esse cdigo, voc pode observar que foi
chamado o mtodo print da classe Ponto3D .
Porm, se chamssemos um mtodo da classe Ponto
que no fosse sobrescrito na classe Ponto3D (por
exemplo, se no existisse o mtodo print na classe
Ponto3D), automaticamente, seria chamado o
mtodo da superclasse (Ponto).
Alan Santos 71
3.6.1 Restries sobreposio
Alguns mtodos no podem ser sobrepostos em
funo dos modificadores que recebem:
final: um mtodo final nunca muda, todas as classes
derivadas utilizam a mesma implementao.
As chamadas aos mtodos finais so resolvidas em tempo de
compilao (vinculao esttica).
static: implicitamente um mtodo final.
private: so implicitamente finais, porque no podem
ser sobrescritos nas classes derivadas
embora seja possvel escrever um mtodo com mesma
assinatura numa classe derivada.

Alan Santos 72
3.6.1 Dynamic Binding
Na classe TestePonto, quando chamamos o mtodo
print do objeto referenciado pela varivel p3, em
tempo de compilao verificado se esse mtodo est
definido na classe Ponto3D que o tipo deste objeto.
Porm, em tempo de execuo, a referncia do objeto
poderia estar se referindo a alguma subclasse do tipo
de referncia declarado.
Nesse caso, a deciso de qual mtodo ser executado
feita em tempo de execuo (dynamic binding).
Essa propriedade do objeto decidir qual mtodo
aplicar para si na hierarquia de classes chamada de
polimorfismo.

Alan Santos 73
3.6.1 Dynamic Binding
Implemente o cdigo abaixo, execute-o e
observe o seu resultado:
class Polimorfismo {
public static void main (String
args []){
Ponto p1 = new Ponto (1,1);
Ponto p2 = new Ponto3D (2,2,2);
p1.print (); p2.print ();
}
} Alan Santos 74
3.6.1 Dynamic Binding
No mtodo main declaramos a varivel p2 como
sendo do tipo Ponto e depois armazenamos
nela uma referncia a uma instncia da classe
Ponto3D.

Quando chamamos o mtodo print( ) (p2.print ( )


), o interpretador Java verifica que, na verdade,
p2 uma instncia de Ponto3D e, portanto,
chama o mtodo print da classe Ponto3D e no
da classe Ponto.
Alan Santos 75
3.6.1 Dynamic Binding
No mtodo main de Polimorfismo declare
uma varivel p3 como sendo do tipo Ponto3D e
depois armazene nela uma referncia a uma
instncia da classe Ponto.

Observe que como Ponto a superclasse, ele


pode referenciar objetos de subclasses,
mas o contrrio (uma varivel do tipo Ponto3D
referenciar um objeto do tipo Ponto) gera erro em
tempo de compilao.

Alan Santos 76
3.6.1 Dynamic Binding
Por exemplo, podemos fazer:
Ponto p1 = new Ponto( );
Ponto p2 = new Ponto3D( );
Mas no podemos fazer:
Ponto3D p3 = new Ponto( );

Alan Santos 77
3.6.1 Dynamic Binding
Agora, em Polimorfismo, execute o cdigo
abaixo:
Ponto p2 = new Ponto3D ( );
Ponto3D p4 = (Ponto3D) p2;

Alan Santos 78
3.6.1 Dynamic Binding
Veja que temos que usar casting se queremos
que uma varivel do tipo Ponto3D receba a
referncia de um objeto Ponto3D contida
em uma varivel do tipo Ponto.

Caso contrrio, ser gerado erro em tempo de


compilao.

Alan Santos 79
3.6.1 Dynamic Binding
Regras para mtodos sobrescritos:
Um mtodo no pode ser menos acessvel que o
mtodo que ele sobrescreve.

No exemplo explicado anteriormente, no


possvel o mtodo print da classe Ponto ser
public e o da classe Ponto3D ser private.

Mas, o contrrio vlido.

Alan Santos 80
3.6.1 Dynamic Binding
1 Elipse e = new Elipse();
2 Circulo c = new Circulo();
3 e = c;
4 e.calcularArea( );

A atribuio da linha 3 dinamicamente acoplada, pois


acopla o objeto e a um tipo diferente de seu tipo
originalmente declarado.
Em princpio, seria uma violao atribuir um objetos de um
tipo diferentes tipo a varivel e, no entanto, como c
(Circulo) subclasse de e (Elipse) essa atribuio vlida.
Qual o mtodo executado ? Crculo ou Elipse ?

Alan Santos 81
3.6.1 Dynamic Binding
A operao executada a de Circulo, porque o
compilador em tempo de execuo verifica que a
varivel aponta para um objeto desta classe
Em algumas linguagens o programador deve
pedir explicitamente o acoplamento dinmico
para uma mensagem em particular.
Importante: Todas as operaes sobrecarregadas
na classe derivada devem proporcionar
semanticamente os mesmos servios oferecidos
pela superclasse.
Alan Santos 82
3.7 O Modificador final
Todos os mtodos podem ser sobrepostos.
Se voc quiser declarar que no deseja mais
permitir que as subclasses sobreponham
mtodos de uma classe, deve declar-las
como final.

Alan Santos 83
3.7 O Modificador final
Altere o mtodo print da classe Ponto,
declarando-o como final:
public final void print ( ) {
Observe que gerado um erro em tempo de
compilao, pois ele redefinido na classe
Ponto3D.

Alan Santos 84
3.7 O Modificador final
Enquanto os mtodos final no podem ser
sobrepostos, as variveis declaradas como
final no podem ter os seus valores alterados
no cdigo do programa.
Isso gera erro em tempo de compilao.

Alan Santos 85
3.7 O Modificador final
Variveis com o modificador final
No podem ser modificadas depois de
inicializadas
Podem ser de instncia ou de classe
Classes com o modificador final
No podem ser herdadas
Pode ser usado junto com static
um membro final static uma constante
Nunca muda de valor

Alan Santos 86
3.8 Classes Abstratas
Em uma hierarquia til padronizar os
servios providos pelas classes.
Represente atravs de classes os seguintes
polgonos: Retngulo, Quadrado, Elipse e
Tringulo.
Estes polgonos tero dois mtodos bsicos:
rea ( ) e
circunferncia ( ).

Alan Santos 87
3.8 Classes Abstratas
Agora, para ser fcil trabalhar com um array
de polgonos, seria til que todos os polgonos
possussem uma mesma superclasse,
Polgono.
Para isso, ns queremos que a classe Poligono
contenha todas as estruturas que nossos
polgonos tenham em comum (os mtodos rea ( )
e circunferncia ( )).
Realize essa alterao usando herana.

Alan Santos 88
3.8 Classes Abstratas
Porm, esses mtodos no podem ser
implementados na classe Poligono, pois
eles tm comportamentos diferentes.
Por exemplo, a rea de um tringulo
diferente da rea de um quadrado.
Java lida com essas situaes atravs de
mtodos abstratos.

Alan Santos 89
3.8 Classes Abstratas
Java permite definir um mtodo sem
implement-lo declarando o mtodo com o
modificador abstract.
Um mtodo abstract no possui corpo
ele possui somente a definio da assinatura
(nome, argumentos e tipo de retorno)
seguida de um ponto-e-vrgula (;).

Alan Santos 90
3.8 Classes Abstratas
Realize essa alterao nas classes que voc
implementou, observe que haver um erro de
compilao
Isso acontece por que toda classe que contm
pelo menos um mtodo abstract uma classe
abstrata e deve ser declarada como abstract.
Elimine o erro, efetuando a correo devida.

Alan Santos 91
3.8 Classes Abstratas
Algumas regras para classes abstratas:
Uma classe abstrata no pode ser instanciada.
Uma subclasse de uma classe abstrata pode ser
instanciada somente se implementar todos os mtodos
abstratos.
Se uma subclasse de uma classe abstrata no implementa
todos os mtodos abstratos que herda, ento ela tambm
uma classe abstrata.
Mtodos static, private e final no podem ser abstratos
(abstract), pois no podem ser sobrescritos na subclasse.
Classes abstratas podem ter variveis e mtodos no
abstratos.

Alan Santos 92
3.8 Classes Abstratas
Assim, se a classe Poligono possui os
mtodos abstratos circunferncia ( ) e rea ( ),
necessrio que todas as subclasses de
Poligono implementem estes mtodos
para que possam ser instanciadas.

Efetue as definies destas classes no exemplo


estudado.

Alan Santos 93
3.8 Classes Abstratas
Note que uma classe abstrata implementada
atravs da palavra-chave extends:
class Retangulo extends Poligono{
A classe Retangulo no abstrata e por este
motivo implementa todos os mtodos abstratos
da classe Poligono.
Alm disso, como a classe Retangulo herda
todas os mtodos e variveis da superclasse ela
pode utilizar o mtodo getType( ) implementado
na classe abstrata Poligono.
Alan Santos 94
3.8 Classes Abstratas
Uma classe abstrata uma classe que no tem
instncias diretas.
Uma classe concreta uma classe que pode ter
instncias.
Em outras palavras se X uma classe abstrata o
cdigo a seguir no pode ser executado:
X objeto = new X();
Apesar disso, voc pode criar construtores de
uma classe abstrata para que eles sejam
chamados pelos construtores das subclasses.
(Reutilizao)
Alan Santos 95
3.8 Classes Abstratas
O objetivo de criarmos classes abstratas encapsular
outras classes com comportamento comum.
Elas podem surgir naturalmente na modelagem ou serem
criadas para promover o reuso.
Alm disso, uma classe abstrata pode definir um
protocolo para uma operao sem definir a
implementao do mtodo.
public abstract class Figure {
// inicio da class Figure
public abstract double area();
public abstract double perimetro();
}// fim da class Figure

Alan Santos 96
3.8 Classes Abstratas
Assim, voc pode declarar mtodos abstratos em uma classe abstrata apenas para
especificar um protocolo comum de operaes.
Toda subclasse concreta da classe abstrata deve fornecer uma implementao para
TODOS os mtodos abstratos:

class Circle extends Figure {


protected double raio;
public Circle(double r) {
raio = r;
}

public double area() {


return PI*raio*raio;
}

public double perimetro() {


return 2*PI*raio;
}
}

Alan Santos 97
3.8 Classes Abstratas
Se uma subclasse de uma classe abstrata no
implementa todos os mtodos abstratos ento
ela tambm abstrata e
Uma classe abstrata tambm pode ter
mtodos concretos.
Frequentemente, faz sentido mover o mximo
de funcionalidade possvel para uma
superclasse, seja ela abstrata ou no.

Alan Santos 98
3.9 Interfaces
Uma interface, ao contrrio de uma classe abstrata, no possui nenhuma
implementao, todos os mtodos so abstratos.
Mesmo que o programador omita o modificador abstract, os mtodos sero
considerados abstratos por default.
Todos os mtodos de uma interface so pblicos, mesmo que o modificador public
seja omitido.
Declarar um mtodo de uma interface como private ou protected gera erro em
tempo de compilao.
Alm disso, como uma interface apenas uma especificao de uma classe e no
uma implementao, os mtodos no podem ser final ou static.
Todas as variveis declaradas em uma interface so constantes, mesmo que no
possuam os modificadores static final.
Alm disso, como elas so constantes, elas devem ser inicializadas. Desta maneira,
voc pode usar uma interface para compartilhar constantes entre vrias classes.
Essa utilizao da interface poderia ser comparada como usar um arquivo de
cabealho com um grande nmero de constantes em C.

Alan Santos 99
3.9 Interfaces
A declarao de uma interface muito
semelhante a uma classe, com a diferena de que
as palavras abstract class so substitudas pela
palavra interface:
interface MinhaInterface {
int getSize ( );
void setSize (int param);
}
No possvel criar uma instncia a partir de
uma interface.
Primeiramente, a interface precisa ser implementada.

Alan Santos 100


3.9 Interfaces
Definimos que uma classe implementa uma
interface atravs da palavra implements:
class MinhaClasse implements MinhaInterface {
int size;
public int getSize ( ) {
return size;
}
public void setSize (int tam) {
size = tam;
}
}

Alan Santos 101


3.9 Interfaces
Uma classe pode ser subclasse (extends) apenas
de uma classe, mas pode implementar
(implements) vrias interfaces.
Na declarao de uma classe que implementa
vrias interfaces, os nomes das interfaces
devem estar separados por vrgula (,).
Alm disso, uma classe pode derivar uma nica
superclasse e implementar vrias interfaces.
class MinhaClasse extends MinhaSuperclasse
implements MinhaInterface1, MinhaInterface
2 {

Alan Santos 102


3.9.1 Utilizando as Interfaces
As interfaces so bastante usadas na amarrao
dinmica de mtodos (dynamic binding).
Para que o interpretador possa decidir qual classe
ele chamar em tempo de execuo, todas as
classes devem possuir o mtodo para que no
seja gerado nenhum erro em tempo de
compilao.
Na verdade, a nossa classe abstrata Poligono
poderia ser uma interface.
Alan Santos 103
3.9.1 Utilizando as Interfaces
Temos que tomar o cuidado, porm, para que nenhum
mtodo seja definido em uma interface.
Para que a classe abstrata Poligono pudesse ser
uma interface teramos que retirar a implementao
do mtodo getType () e a varivel cor.
Alm disso, como em Java no existe conceitualmente
a herana mltipla, uma classe pode ser subclasse
(extends) apenas de uma nica classe.
Nas situaes em que til herana mltipla, so
usadas interfaces.

Alan Santos 104


3.10 Inner Classes
A partir da verso JDK 1.1, o Java suporta classes que
so membros de outras classes, ou seja, classes que
so definidas dentro do escopo de uma outra classe ou
so annimas, definidas dentro de uma expresso.
Nas verses anteriores do JDK eram permitidas apenas
classes top-level que pertenciam a pacotes.
Inner classes ou nested class so um fenmeno do
compilador e no do interpretador.
Ou seja, o compilador gera o cdigo necessrio para
que a inner class acesse os dados da enclosing class
(classe a qual est dentro).

Alan Santos 105


3.10 Inner Classes
As inner classes tem as seguintes propriedades:
O nome tem que ser diferente do nome da enclosing class.
Pode usar variveis e mtodos da enclosing class.
Pode ser definida como abstract.
Pode ser uma interface implementada por outra inner class.
Podem ser declaradas private ou protected. Os modificadores de proteo no
previnem a inner class de acessar variveis membros de outras classes e da
enclosing class.
Outras classes, que no a enclosing class, no enxergam a inner class.
Podem acessar variveis private da enclosing class.
Se uma inner class for declarada como static, ela se torna uma top-level class e
perde a capacidade de acessar variveis da enclosing class.
No podem possuir variveis membros static. Se a inner class precisa usar uma
varivel static, essa varivel deve ser declarada na enclosing class.

Alan Santos 106


3.11 Classes Annimas (Anonymous
Class)
tambm possvel incluir toda a definio de
uma classe dentro do escopo de uma
expresso, a que chamamos de anonymous
class.
Por exemplo, vamos redefinir a classe
TestaInnerClass para usar uma classe
annima.

Alan Santos 107


3.11 Classes Annimas (Anonymous
Class)
f.addMouseMotionListener (new MouseMotionAdapter){
public void mouseDragged (MouseEvent e) {
String s = "Mouse Dragging: X = "+e.getX( )+" Y =
"+ e.getY( );
tf.setText (s);
}
} );

Classes Annimas no possuem mtodos


construtores.
Os parmetros so repassados ao construtor da
classe pai.

Alan Santos 108


3.12 Garbage Collection
Quando um programador aloca uma rea de
memria em C ou C++ sua responsabilidade
liberar a memria quando o programa no
precisar mais dela.
Se ele no liberar esse espao de memria,
poder haver falta de memria, ou seja, ter
menos espao de memria de que quando
comeou.
Os problemas de falta de memria so difceis de
serem encontrados e podem fazer com que a
mquina trave de repente.

Alan Santos 109


3.12 Garbage Collection
Por exemplo, considere o cdigo a seguir que
aloca a memria para uma string, a utiliza e
depois a libera:
String str = Primeiro espao;
System.out.println (Usando
memria original: +str);
str = Outro espao;
System.out.println (Usando outro
espao de memria: +str);

Alan Santos 110


3.12 Garbage Collection
No exemplo acima, Java ocupa uma certa rea de
memria para colocar a string Primeiro espao.
Essa string referenciada pela varivel str.
Aps isso, criada uma outra string (Outro
espao) que ocupar uma outra rea de
memria.
A varivel str passa a referenciar a nova string,
ficando a primeira String sem referncia e no
mais acessvel.
Como essa rea no ser mais utilizada, ela
liberada pela coleta de lixo.
Alan Santos 111
3.12 Garbage Collection

Alan Santos 112


3.12 Garbage Collection
Java executa a coleta de lixo varrendo
periodicamente a rea de memria em busca
de posies que no sejam mais
referenciadas.
O processo de coleta de lixo uma thread de
baixa prioridade.
Voc no notar quando ele estiver
executando.

Alan Santos 113


3.13 Finalizao de um Objeto
Em Java no necessrio o programador liberar a rea de
memria de objetos no mais usados, o Java faz isso
automaticamente por meio do processo o Garbage
Collection (Coleta de lixo).

O Garbage Collection libera os recursos de memria


utilizados pelo objeto, mas estes objetos podem possuir
outros recursos tais como arquivos abertos e conexes de
rede.

Nesse caso, poderia ser interessante ter um mtodo que


realizasse a finalizao de recursos, tais como, fechar
arquivo e finalizar conexes de rede.

Alan Santos 114


3.13 Finalizao de um Objeto
Para isso, existe o mtodo finalize.
Esse mtodo no recebe argumentos e no retorna valor.
S pode existir um mtodo finalize por classe e deve ser
nomeado finalize ( ).
O mtodo finalize chamado algum tempo, no preciso,
aps o objeto tornar-se no usado, mas seguramente
antes do Garbage Collection.
Como, muitas vezes, um interpretador Java pode finalizar a
sua execuo sem o Garbage Collection liberar todos os
recursos, no h garantia de que o mtodo finalize ser
chamado.
Desta maneira, esse mtodo no muito utilizado.

Alan Santos 115