Vous êtes sur la page 1sur 44

Programao

Orientada a Objetos
GCC110 Turmas 10A/22A
2016-2

Parte 6 Atributos e Mtodos Estticos e


Destrutores

Jlio Csar Alves professores.dcc.ufla.br/~jcalves


Parte 6
Atributos e Mtodos Estticos

2
Atributos Estticos

Imagine que voc est desenvolvendo um jogo e nele as tropas inimigas atacam em grupos.
Voc gostaria que a estratgia de ataque dessas tropas dependesse da quantidade de
inimigos, ou seja, se a tropa for grande seguir uma estratgia, se for pequena ser outra.

Voc definiu uma classe Inimigo para tratar os comportamentos de cada um dos soldados
das tropas inimigas. Essa classe precisa de alguma forma saber quantos inimigos existem no
momento para que o soldado siga a estratgia adequada.

Precisamos ento em algum lugar ter um atributo para


guardar o nmero de inimigos existentes.
Qual seria melhor forma de guardar isso?
Em uma nova classe? Na prpria classe? Como?

3
Atributos Estticos

Se colocarmos essa informao em uma classe diferente da Inimigo, teramos que


lembrar de avis-la toda hora que crissemos um objeto da classe Inimigo (o que
poderia ser esquecido em algum momento).

O ideal ento que a prpria classe Inimigo controlasse essa informao no seu
construtor, pois assim seria garantido que toda vez que um objeto fosse criado, ele
seria contabilizado.

Ento t fcil...

Essa soluo funciona?


4
Atributos Estticos

Suponha por exemplo que sejam criados dois Pilha de Execuo HEAP
(ou Stack) 0x98
objetos da classe Inimigo.
... ...
Qual seria o valor do atributo nroInimigos? soldado1 0x98 nroInimigos 1
soldado2 0xC3 0xC3
... ...
nroInimigos 1

Ns j sabemos que cada objeto pode ter um valor diferente para os atributos. Isso porque, na memria,
cada objeto tem seu espao para guardar os valores dos seus atributos.
Dessa forma, quando criado um objeto da classe Inimigo reservado um novo espao para armazenar os
valores de nroInimgos.

Concluso: posso ter milhares de objetos que todos eles vo ter valores independentes do atributo
nroInimigos com valor 1. 5
Atributos Estticos

E se a gente conseguisse reservar um espao na memria que


fosse o mesmo para todos os objetos de um classe?

Seria timo mesmo


ter um atributo
s pra mim!

Podemos fazer isso usando um atributo esttico.


Atributos estticos pertencem classe e no aos objetos.

Quando um atributo declarado como esttico, ele reservado na memria (Heap) uma nica vez e pode
ser acessado por todos objetos naquela classe.
Dessa forma, se um objeto alterar o valor do atributo, todos os demais podero acessar esse novo valor.
6
Atributos Estticos
Vamos usar um atributo
esttico em nosso jogo.

Para declarar um atributo esttico


usamos o modificador static.

0x81 HEAP
Pilha de Execuo
(ou Stack) nroInimigos 021

soldado1 0x98 0x98


soldado2 Os atributos estticos
0xC3 ... ... ficam em um espao
reservado para a classe.
0xC3
... ...

Como agora existe apenas uma cpia atributo nroInimigos na memria, o incremento dentro do construtor
executado nessa cpia. Assim quando um segundo objeto criado, o atributo j est com valor 1 e ao ser
incrementado ele passa para 2. 7
Atributos Estticos

Atributos estticos so tambm chamados de variveis de classe


(em oposio a variveis de instncia, que um dos sinnimos
de atributo normal).

Todos vocs j usaram um atributo esttico!


Vocs se saberiam dizer qual?

Vejamos o comando que usamos para exibir algo na tela:


System.out.println(texto);
O out um atributo esttico pblico da classe System. Todo atributo esttico pblico
pode ser acessado sem a necessidade de se criar um objeto, basta usar a sintaxe:
Classe.atributo

8
Constantes e Atributos Estticos

Em linguagens de programao orientadas a objetos no existe o


conceito de variveis globais (acessveis a partir de qualquer classe).

Mas existem algumas constantes, como o valor de PI, para as quais seria
desperdcio de recursos e desempenho exibir a criao de um objeto
apenas para consultar seus valores.

Para resolver isso podemos declarar um atributo esttico, constante e pblico.


E acess-lo usando a sintaxe que acabamos de aprender: Classe.atributo.

Em Java existe uma classe chamada Math. Ela tem o atributo esttico, pblico e
constate PI. Dessa forma, voc pode acessar o valor de pi, usando: Math.PI

A classe Math fornece diversas funes matemticas teis, como:


arredondamento, raiz quadrada, seno, cosseno, etc.
9
Constantes em Java

Aproveitando que falamos do PI, voc pode declarar uma constante


em Java usando o modificador final.

Atributos constantes podem ter seu valor inicializado na declarao


ou nos construtores. Mas em nenhum outro mtodo.

Cuidado:
Usar atributos constantes de tipos primitivos (int, float, etc.)
tranquilo.
Mas atributos constates do tipo objeto exigem ateno. Objetos
constantes no so imutveis!

10
Objetos Constantes

Suponha a declarao do seguinte atributo constante:

Isso significa que no posso atribuir um novo objeto varivel soldadoFixo (seu
endereo constante), mas nada me impede que eu chame um mtodo desse objeto
e assim eu mude seu estado.

Queria me tornar constante


assim to fcil...
Como fao ento
caso precise de um
objeto somente-
leitura (imutvel)?
tudo culpa da classe que
me projetou assim, mudo
Voc precisar projetar uma classe que no d acesso a mtodos de
por qualquer coisa. alterao dos atributos.
Obs: Como ser visto mais pra frente, isso pode ser facilitado com o uso de herana.
11
Mtodos Estticos

A linguagem Java possui um mtodo para potncia. Ele usado conforme exemplo
abaixo:

Repare que o mtodo est sendo chamado sem utilizao de um objeto. Est sendo
chamado no formato Classe.mtodo. Isso te lembra alguma coisa?

Alm de um atributo, eu
tambm queria muito ter um
mtodo, para exercer meus
comportamentos sabe...

Assim como atributos, as classes podem ter mtodos estticos, tambm


chamados de mtodos de classe.
12
Mtodos Estticos

Diferentemente dos atributos estticos, chamadas de mtodos so armazenadas na


Pilha (Stack) e no no Heap e o cdigo ser o mesmo para qualquer objeto.

Ento qual o sentido de se poder utilizar mtodos estticos?

Fazem sentido para permitir que sejam executados sem a


necessidade de se instanciar um objeto da classe.
Operaes matemticas, como Math.pow() por exemplo, tm
sempre o mesmo funcionamento (no dependem do estado
de um objeto), assim mais prtico poder usar as funes
sem precisar instanciar um objeto.

13
Exemplo de Mtodo Esttico

Suponha por exemplo que eu tenha uma classe Carro.


E essa classe tenha um mtodo que converte de mph para k/h (recebe um por
parmetro e devolve o outro).

Vocs concordam que eu poderia querer usar esse mtodo, mesmo se no tiver
nenhum carro?
Talvez o usurio da classe precise apenas dessa converso e no de um carro
propriamente dito.

Se tal mtodo no for esttico eu obrigaria o usurio a criar um carro s pra isso (j
pensou se fosse no mundo real)?
No faz sentido criar um carro falso apenas para chamar um mtodo desses.

Obs: em uma boa modelagem um mtodo como esse provavelmente ficaria em uma classe
utilitria e no em uma classe Carro, mas aqui vale como exemplo didtico.
14
Esteja atento!

Tem um fato muito


importante sobre
mtodos estticos
que ainda no te
contaram...

15
Limitaes dos Mtodos Estticos

Voc v algum problema


nesse mtodo esttico?

Reparem que o mtodo esttico, pertence classe, ento pode ser


chamado sem existir nenhum objeto.

Mas se for chamado diretamente, Carro.maxAumentoVelocidade(), qual


seria o valor do atributo velocidade?
Ou se existirem vrios objetos carros, qual velocidade usaria?

16
Limitaes dos Mtodos Estticos

Nenhuma das duas situaes possvel, portanto:


Mtodos estticos podem acessar apenas atributos tambm estticos.

Os objetos so
egostas e no me
deixam acessar seus
atributos?

Os mtodos disponveis na classe Math so bons exemplos de


mtodos estticos.
17
Limitaes dos Mtodos Estticos
public class Programa {

public static void main(String[] args) { Esse programa funciona?


metodo(); Por que ou por que no?
}

public void metodo() {


System.out.println(Teste);
} A mensagem de erro indica que um mtodo
}
normal (no esttico) no pode ser chamado
javac "Programa.java"
a partir de um mtodo esttico.
Programa.java:4: error: non-static method metodo()
cannot be referenced from a static context Mas por que ser?
metodo();
^
1 error

A questo que um mtodo no-esttico pode acessar um atributo tambm no-esttico. E assim se um
mtodo esttico pudesse chamar um mtodo no-esttico, seria possvel fazer uma chamada ao mtodo
esttico sem instanciar um objeto e acessar um atributo no-esttico (o que j vimos que no possvel).
18
Mtodos estticos e o this

Bacana! Vou usar


o this no meu
mtodo
esttico...

Isso pode ser feito?

ERRADO!
Por que?

A varivel this aponta para o objeto o qual teve o mtodo


chamado, mas uma chamada de mtodo esttico pode ser feita
sem usar objetos, dessa forma, pra quem o this apontaria?

19
Por que o mtodo main esttico?

Agora que sabemos o que um mtodo esttico, ns percebemos que sempre


declaramos o mtodo main em nossos programas como um mtodo esttico.

public static void main(String[] args)

Por que voc acha que o mtodo main precisa ser estico?

Ns executamos nossos programas usando a JVM e O que a JVM faz realizar a chamada abaixo:
passando o nome da classe que tem o mtodo MinhaClasse.main(...)
main como parmetro:
Que s possvel pelo fato do mtodo main ser
java MinhaClasse esttico.

Ao executar um programa voc pode passar dados (parmetros) para a execuo


do mesmo. Tudo que voc digitar aps o nome da classe ser acrescentado ao
parmetro args (vetor de strings) do mtodo main.
Ex: java MinhaClasse detalhado 12 3 20
Exerccio Resolvido 01

Defina a assinatura de mtodos em Java para as seguintes situaes:


a) Um mtodo pblico e esttico chamado getNroCarros, de uma classe Carro, que no recebe
argumentos e retorna um inteiro.
b) Um mtodo pblico e esttico chamado calcularHipotenusa que recebe os valores de dois
catetos (double) e retorna o resultado do clculo da hipotenusa.
c) Um mtodo pblico e esttico chamado main que recebe um vetor de strings e no retorna
valores.
Exerccio Resolvido 01

Defina a assinatura de mtodos em Java para as seguintes situaes:


a) Um mtodo pblico e esttico chamado getNroCarros, de uma classe Carro, que no recebe
argumentos e retorna um inteiro.
b) Um mtodo pblico e esttico chamado calcularHipotenusa que recebe os valores de dois
catetos (double) e retorna o resultado do clculo da hipotenusa.
c) Um mtodo pblico e esttico chamado main que recebe um vetor de strings e no retorna
valores.

a)
public static int getNroCarros()

b)
public static double calcularHipotenusa(double cateto1, double cateto2)

c)
public static void main(String[] args)
Exerccio Resolvido 02

Suponha que voc est fazendo pretende fazer um jogo no qual vrias bolas caem do alto e
picam no cho e o jogador precisar realizar certa sequncia de movimentos para obter pontos.
Para que o jogo fique interessante voc quer implementar a fsica da gravidade e, dependendo
dos itens que o jogador coletar, a gravidade do ambiente pode ser alterada (tornando o
movimento de todas as bolas diferentes).
Sabendo que as bolas devem possuir coordenadas X e Y inteiras e que a gravidade deve comear
com o valor 10, implemente a classe Bola com seus atributos e construtor (e ignore os mtodos).
Exerccio Resolvido 02

Suponha que voc est fazendo pretende fazer um jogo no qual vrias bolas caem do alto e
picam no cho e o jogador precisar realizar certa sequncia de movimentos para obter pontos.
Para que o jogo fique interessante voc quer implementar a fsica da gravidade e, dependendo
dos itens que o jogador coletar, a gravidade do ambiente pode ser alterada (tornando o
movimento de todas as bolas diferentes).
Sabendo que as bolas devem possuir coordenadas X e Y inteiras e que a gravidade deve comear
com o valor 10, implemente a classe Bola com seus atributos e construtor (e ignore os mtodos).
public class Bola {
private int posicaoX;
private int posicaoY;
private static int gravidade = 10; O atributo gravidade deve ser declarado
como esttico, porque ele valer para
public Bola(int posicaoX, int posicaoY) { todas as bolas do jogo.
this.posicaoX = posicaoX;
this.posicaoY = posicaoY;
}
}
Parte 6
Destrutores e Garbage Collector

25
Garbage Collector

Em um programa Java, o que acontece na memria com uma varivel local (de tipo
primitivo) quando um mtodo termina?
E o que acontece se um essa varivel local referencia um objeto?

A varivel local sempre desalocada quando o mtodo termina.


No caso de tipos primitivos a varivel guarda o prprio valor, ento ao desalocar uma
varivel do tipo int, o prprio valor inteiro tambm foi desalocado.

Mas no caso de variveis que referenciam objetos, a varivel ser deslocada significa
que o local que guarda o endereo do objeto foi desalocado, mas e a memria
alocada para o objeto em si, na HEAP, o que acontece?

26
Garbage Collector

Em Java, sempre que no h mais nenhuma varivel referenciando um objeto:


Ele fica disponvel para a coleta de lixo (garbage collector).
Portanto, voc no precisa desalocar a memria utilizada por um objeto (no
existe comando delete). A linguagem cuida disso pra voc.

Foi aqui que deixaram


um objeto que ningum
precisa mais?

27
Garbage Collector

Eu entendo
minha senhora.
Mas no
adianta ligar, eu
passo na hora
que eu quiser.

A mquina virtual Java quem controla o Garbage Collector, portanto


no tem como o programador ter certeza sobre quando exatamente
um objeto ser desalocado.

28
Garbage Collector
public class ClasseQualquer {
Mas o que acontece
private Carro carro;
quando o mtodo
public ClasseQualquer() { termina, mas algum
carro = new Carro(); referenciava o mesmo
} objeto fora do mtodo?

public float metodoQualquer() {


movimentarCarro();
return carro.getVelocidade();
} Nesse mtodo, por exemplo, a varivel aux local.
Logo ao terminar o mtodo ela desalocada.
public float movimentarCarro {
Carro aux = carro; Mas ela aponta para o atributo carro, se o objeto
aux.movimentar(); ficasse disponvel para coleta de lixo aps a chamada
} de mtodo, a classe perderia o atributo.
}

Lembre-se que o objeto fica disponvel para coleta de lixo


apenas quando no tem mais ningum o referenciando.
29
Garbage Collector

Como ento deixar um objeto, pelo


menos, disponvel para ser destrudo?

Um objeto pode ser destrudo pelo Garbage Collector se:


Terminou seu escopo (mtodo, por ex.).
ltima varivel que o referenciava aponta agora para um novo objeto.
ltima varivel que o referenciava aponta agora para null.

Cuidado: chamar um mtodo usando uma varivel nula d


erro (NullPointerException). 30
Memory Leaky

Em linguagens como C e C++ se no desalocarmos a memria que alocamos (com


malloc ou new) ela fica perdida (desperdiada).
Ns chamamos isso de Memory Leaky (vazamento de memria).

Acho que Pior que


temos um isso ficar
vazamento sem
aqui. referncia.

31
Memory Leaky

Em programas que voc usa por pouco tempo e logo o fecha isso pode no ser to grave.
Mas imagine, por exemplo, que seu navegador de internet tenha problema com alocao de memria e a
cada pgina que voc entra ele desperdia um pouco de memria. Em pouco tempo seu computador
ficar lento, por ocupar toda a memria disponvel.

Isso pior ainda em um sistema comercial (de controle de operaes, por exemplo) que precise funcionar
24h por dia. Como ele nunca desligado o Memory Leaky vai consumindo memria pra sempre (at a
aplicao ou o computador travar na verdade).

Acho que Pior que


temos um isso ficar
vazamento sem
aqui. referncia.

32
Memory Leaky

Com o que vimos sobre o Garbage Collector, voc acha que em


Java precisamos nos preocupar com Memory Leaky?

O Garbage Collector ajuda a evitar vrios casos de Memory Leaky, pois ele
desaloca memria de objetos que no esto mais sendo referenciados.

Mas ele no impede completamente o Memory Leaky pois o programador


pode deixar uma varivel apontando para um objeto que nunca mais ser
utilizado.

Esteja atento ao uso de memria do seu programa. Sempre que verificar que um objeto
no ser mais necessrio, garanta que no tem nenhuma varivel referenciando-o.

33
Exemplo Garbage Collector

Suponha o seguinte trecho de cdigo:

Carro meuCarro = new Carro();


Carro outroCarro = new Carro();
...
...
outroCarro = meuCarro; J era... S eu que
pego o objeto agora.
O que aconteceu com o objeto que a varivel
outroCarro estava apontando?
Como fao para conseguir acess-lo agora?

34
Passagem de parmetros

Suponha que faamos um mtodo em Java que recebe parmetros e


os altera. Ao sair do mtodo os parmetros esto alterados?

public void metodoA(int x) { public void testaMetodoA() {


x = 5; Carro carro = new Carro(Ferrari);
} int x = 0;
public void metodoB(Carro c) { metodoA(x);
c.acelerar(); System.out.println(x = + x);
} metodoB(carro);
System.out.println(carro.getVelocidade());
public void metodoC(Carro c) { metodoC(carro);
c = new Carro(Fusca); System.out.println(carro.getNome());
} }

Supondo que um carro criado com velocidade zero, e que o


mtodo acelerar aumente a velocidade em 10, o que seria exibido Por que?
na tela pelo cdigo acima?
35
Passagem de parmetros
public void metodoA(int x) {
x = 5;
}
Em Java os parmetros so passados por valor. public void metodoB(Carro c) {
Assim quando um mtodo chamado, alocado
c.acelerar();
espao na pilha de execuo para guardar os
}
valores dos parmetros. public void metodoC(Carro c) {
c = new Carro(Fusca);
}
Se eles forem alterados, os novos valores ficam public void testaMetodoA() {
nesse espao. Carro carro = new Carro(Ferrari);
int x = 0;
Ao terminar o mtodo, esse espao desalocado.
metodoA(x);
System.out.println(x = + x);
metodoB(carro);
System.out.println(carro.getVelocidade());
metodoC(carro);
System.out.println(carro.getNome());
36
}
Passagem de parmetros
public void metodoA(int x) { Portanto, mesmo que se altere o parmetro x, essa alterao perdida ao terminar
x = 5; o mtodo.
}
public void metodoB(Carro c) { No caso de objetos, o que passado por parmetro na verdade a referncia (o
endereo do objeto). Portanto, se chamarmos um mtodo que altera o estado do
c.acelerar(); objeto, como ele est na Heap, ele realmente vai ser alterado.
}
public void metodoC(Carro c) { J nesse caso estamos alterando o endereo da varivel local (parmetro) alocado
c = new Carro(Fusca); na pilha de execuo do mtodo. A varivel original usada para passar o parmetro
} no alterada ( a mesma coisa do primeiro caso, metodoA).
public void testaMetodoA() {
Carro carro = new Carro(Ferrari);
int x = 0;
metodoA(x);
System.out.println(x = + x);
metodoB(carro);
System.out.println(carro.getVelocidade());
metodoC(carro);
System.out.println(carro.getNome());
37
}
Parmetros por referncia em Java?

Em C e C++ eu posso retornar


valores por referncia. Ou seja,
posso passar o endereo de um
parmetro e assim ter a alterao
no mesmo aps terminar o
mtodo. Posso fazer isso em Java?

No, no pode.
Mas como fao ento
caso um mtodo
precise retornar mais
de uma informao?

Seu mtodo pode retornar um objeto que tem vrios


atributos. Ou um objeto que tem vrios objetos (coleo).

38
Destrutores

H linguagens que possuem destrutores.


Um destrutor um mtodo especial, assim como o construtor.
Voc coloca l dentro cdigo necessrio ao eliminar objeto.
E precisa cuidar de desalocar a memria ocupada pelo objeto.

Linguagens que tenham destrutor:


S pode existir um destrutor.
Ele chamado automaticamente ao usar o comando delete,
no pode ser chamado diretamente.
No recebe argumento e no retorna valor.

Posso fazer uma


coisinha antes de voc
destruir o mundo?

39
Destrutores
Mesmo no tendo destrutor em Java, pode ser que eu precise fazer algumas coisas antes
do objeto ser destrudo (como fechar uma conexo com o banco de dados por ex.).
Para isso Java tem o mtodo Finalize().

A diferena pra um destrutor :


Ele chamado antes da destruio do objeto.
E voc no sabe ou no tem controle sobre quando ele ser executado (depende do Em Java no
Garbage Collector). posso fazer
nada mesmo?

Posso fazer uma


coisinha antes de voc
destruir o mundo?

40
Tempo de vida de um objeto

Quanto tempo
eu tenho de
vida??

Tempo de vida de um objeto nada mais que o tempo desde a sua criao at a
sua destruio.

41
Exerccio 1

Assuma que queiramos trocar os valores de duas variveis inteiras, a e b, e para fazer isso
implementamos o mtodo abaixo.

public void trocar(int i1, int i2) {


int tmp = i1;
i1 = i2;
i2 = tmp;
}

Ns ento chamamos o mtodo com nossas variveis a e b:


trocar(a, b);

A variveis a e b foram trocadas depois da chamada? Se voc testar, voc ver que no! Por que
esse mtodo no funciona? Explique em detalhes.
Exerccio 2

Faa a implementao em Java das classes necessrias para tratar a situao abaixo. Voc
precisa definir os atributos que fazem parte do cenrio e as assinaturas dos mtodos (no
necessrio implement-los).
Estou muito feliz, fui contratado pela empresa Arati
para desenvolver um jogo de aventura chamado
DragonRife. No jogo o jogador controla um heri
que capaz de se movimentar pra cima, pra baixo,
pra direita e pra esquerda e comea o jogo com
100% de sade. Ele deve recolher tesouros que esto
espalhados na tela e fugir de um drago que lana
labaredas de fogo (que retiram 20% da sade do
heri de cada vez). Os tesouros podem possuir cores
e valores monetrios diferentes. Em cada fase existe
um drago diferente (variando sua cor e seu
tamanho), mas todos eles andam apenas na parte
debaixo da tela pra esquerda e/ou pra direita. O
objetivo do heri juntar o maior valor monetrio
possvel, evitando ser morto pelo drago.
44

Vous aimerez peut-être aussi