Você está na página 1de 65

PROGRAMAÇÃO

ORIENTADA A OBJETOS
ESPECIALIZAÇÃO DE ENGENHARIA DE SOFTWARE
Construtores

2
Construtores
• Além de métodos e atributos, o corpo de uma
classe pode conter construtores, definindo como os
atributos de um objeto devem ser inicializados,
quando a classe é criada.

<nome da classe> (<lista de parâmetros>) {


<corpo do construtor>
}

3
Construtores
• A chamada do construtor é indicada pelo nome da classe seguida de
parênteses
• O construtor deve ter o mesmo nome da classe;
• Não retorna nada e não possui tipo.

• Um construtor sem parâmetros

Conta() {
saldo = 0;
senha = 0;
}

• O operador new invoca o construtor;

4
Construtores
• Caso não seja definido um construtor, um
construtor implícito default, equivalente a
<nome da classe>(){}
• É fornecido, inicializando os atributos com seus
valores default.
• Tipos primitivos são zerados;
• O construtor de objetos internos são chamados
automaticamente
• Quando um construtor é criado, o default é
descartado e não poderá ser usado.

5
Construtores
Valores default para atributos
• 0 para int, double, etc.
• False para boolean
• null para tipos referência
• null denota uma referência nula, não existente, para um
objeto de qualquer tipo.

6
Criação de Objetos

7
Criação de Objetos
• Um objeto é criado através do operador new
Conta c;...

8
Criação de Objetos

9
Referências
• Objetos são manipulados através de referências.
Criação de Objetos

11
Aliasing
• O Aliasing ocorre quando mais de uma variável
armazena a mesma referência para um dado objeto.

12
Aliasing
• Caso o new seja dado em b, o Aliasing não ocorre e
a atribuição é feita apenas pelo valor.

13
Remoção de objetos
• Não existe mecanismo de remoção explícita de
objetos da memória em Java (como o free()de C++)
• O Garbage Collector de Java elimina estes objetos
da memória quando não são mais referenciados.
• É possível liberar recursos quando o objeto está na
iminência de ser destruído, com o método finalize

14
Remoção de objetos
• O Garbage Collector é um processos automático em
Java, que é totalmente transparente ao
programador.

• Algumas críticas a este processo, é o fato dele ser


não-determinístico, ou seja, não há garantias sobre
quando acontecerá a desalocação e se ela
realmente vai ocorrer.

15
Membros static

16
Membros static
• O modificador static define membros que serão
instanciados uma única vez.
• Ou seja, não haverá uma cópia para cada objeto;
• Todos os objetos compartilham uma única cópia.
• É a mesma ideia de um elemento global para todos os
objetos.

• O exemplo a seguir mostra a utilização de membros


static.

17
Membros static
• Neste exemplo, foi criada uma variável/atributo
static para guardar o total de contas no sistema.

18
Membros static
• Se um atributo static não for inicializado, o
compilador atribui um valor padrão;

19
Membros static
• Da mesma forma que há variáveis estáticas (de
classe) e variáveis de instância (atributos), há
métodos estáticos (de classe) e métodos de
instância.
• um método estático só tem acesso as variáveis de classe
(estáticas);
• um método estático pode ser acrescentado à
classeContaComGerador para retornar o valor corrente
de prox_num

20
Membros static
• Um método static não pode acessar membros não static
• Um método static pode ser chamado mesmo quando não
houver um objeto instanciado;
• Pelo mesmo motivo, o ponteiro this não pode ser utilizado
em um método static.

• Um método static deve ser invocado pelo nome da


classe seguido de . ou por um objeto.
classe.metodo(argumentos);

21
Membros static

• Não existe instância da classe Teste no main

22
Classe Math

23
Classe Math
• A classe Math está definida no pacote java.lang
• Fornece uma coleção de métodos static que realizam
cálculos matemáticos comuns;
• Não é necessário instanciar um objeto da classe para
poder utilizar seus métodos;
• Por exemplo:
Math.sqrt(900.00);

• Os argumentos destes métodos podem ser


constantes, variáveis ou expressões.

24
Classe Math
Método Descrição Exemplo
abs( 23.7 ) é 23.7
abs(x) Valor absoluto de x abs( 0.0 ) é 0.0
abs( -23.7 ) é 23.7
Arredonda x para o menor inteiro maior ceil( 9.2 ) é 10.0
ceil(x)
que x ceil( -9.8 ) é -9.0
cos(x) Cosseno de x (x em radianos) cos( 0.0 ) é 1.0
exp( 1.0 ) é 2.71828
exp(x) Exponencial ex
exp( 2.0 ) é 7.38906
Arredonda x para o menor inteiro não floor( 9.2 ) é 9.0
floor(x)
maior que x floor( -9.8 ) é -10.0
log(x) Logaritmo natural de x (base e) log( Math.E ) é 1.0
log( Math.E * Math.E ) é 2.0

25
Classe Math

Método Descrição Exemplo


max(x,y) Maior valor entre x e y max( 2.3, 12.7 ) é 12.7
max( -2.3, -12.7 ) é -2.3
min( 2.3, 12.7 ) é 2.3
min(x,y) Menor valor entre x e y min( -2.3, -12.7 ) é -12.7
pow( 2.0, 7.0 ) é 128.0
pow(x,y) x elevado a y (xy)
pow( 9.0, 0.5 ) é 3.0
sin(x) Seno de x (x em radianos) sin( 0.0 ) é 0.0
sqrt(x) Raiz quadrada de x sqrt( 900.0 ) é 30.0
tan(x) Tangente de x (x em radianos) tan( 0.0 ) é 0.0

26
Classe Math
• Declaradas public final static
• Todas as classes podem utilizar;
• São constantes (final);
• Podem ser acessadas pelo nome da classe;
• Somente uma cópia.

Constante Valor
Math.PI 3.14159265358979323846
Math.E 2.7182818284590452354

27
Promoção de Argumentos

28
Promoção de Argumentos
• A promoção de argumentos consistem em
converter o tipo de um argumento
• Por exemplo, o método Math.sqrt espera um double,
mas pode ser invocado passando-se um int como
argumento;
• A promoção é realizada automaticamente, desde que se
respeite as regras de promoção
• Especifica quais conversões podem ser realizadas sem a perda
de dados.
• Em uma expressão com dois ou mais tipos primitivos
diferentes, cada valor é promovido ao tipo “mais
abrangente”.
29
Promoção de Argumentos

Tipo Promoções Válidas


double Nenhuma
float double
long float ou double
int long, float ou double
char int, long, float ou double
short int, long, float ou double (mas não char)
byte short, int, long, float ou double (mas não char)
boolean Nenhuma (valores booleanos não são considerados números em Java)

30
cast
• Considerando a tabela anterior, não é possível
realizar a promoção de argumentos de tipos “mais
altos” para tipos “mais baixos”;
• No entanto, é possível realizar o cast explícito
• Assumindo o alto risco de erros de truncamento.
• Suponha que o método abaixo só aceita valores
inteiros:
raizQuadrada((int) valorDouble);

31
Sobrecarga de Métodos

32
Sobrecarga de Métodos
• Métodos com o mesmo nome podem ser declarados
dentro de uma mesma classe
• Desde que possuam um conjunto diferente de parâmetros;
• Isto é a Sobrecarga de métodos.
• Quando um método sobrecarregado é invocado, o
compilador Java seleciona o método apropriado
• De acordo com o número, tipo e ordem dos argumentos
passados para o método.
• Desta forma, podemos ter um conjunto de métodos
com o mesmo nome que realizam o mesmo tipo de
operação sobre argumentos diferentes.
33
Sobrecarga de Métodos
• Por exemplo, os métodos abs(), min() e max() da
classe Math são sobrecarregados, cada um com
quatro versões:
• Uma com dois argumentos double;
• Uma com dois argumentos float;
• Uma com dois argumentos int;
• Uma com dois argumentos long.
• Vejamos um exemplo de métodos que calculam o
quadrado de um número int ou double.

34
Sobrecarga de Métodos
public class Sobrecarga
{
int quadrado(int num)
{
return num*num;
}
double quadrado(double num)
{
return num*num;
}
public void print()
{
System.out.printf("Quadrado de 7.5 e: %f", quadrado(7.5));
System.out.printf("\nQuadrado de 7 e: %d", quadrado(7));
}
}

35
Sobrecarga de Métodos
public class TesteSobrecarga
{
public static void main(String args[])
{
Sobrecarga teste = new Sobrecarga();

teste.print();
}
}

36
Erro Comum
• Note que somente o tipo de retorno de um método não é
suficiente para que o compilador o diferencie de outro
com assinatura parecida
• Erro de compilação.
• Exemplo:
int quadrado(int num)
long quadrado(int num)

• Ou seja, mesmo nome, com os mesmos argumentos, não


pode.

37
Sobrecarga de Construtores
• Java permite que objetos de uma mesma classe
sejam inicializados de formas diferentes
• Através da sobrecarga de construtores;
• Basta definir múltiplos construtores com assinaturas
diferentes
• Número e tipo de argumentos.

38
public class Tempo
{ public Tempo(int hora, int minuto, int segundo)
{
private int h, m, s;
h = hora;
public Tempo()
m = minuto;
{ s = segundo;
h = m = s = 0; }
}
public Tempo(int hora) public static void main(String args[])
{
{
Tempo t = new Tempo();
h = hora;
Tempo t2 = new Tempo(12);
m = s = 0;
Tempo t3 = new Tempo(12, 30);
} Tempo t4 = new Tempo(12, 30, 00);
}
public Tempo(int hora, int minuto) }

{
h = hora;
m = minuto;
s = 0;
}
39
Observação sobre Construtores
em Java
• Java permite que outros métodos possuam o
mesmo nome que a classe
• Embora não se tratem de construtores;
• Não são chamados quando um objeto da classe é criado;
• Possuem tipo de retorno.

• Um erro comum é colocar um tipo de retorno em


um método com o mesmo nome da classe e
confundi-lo com um construtor.

40
Observação sobre Construtores
em Java
public class ConstrutorFalso
{
public int ConstrutorFalso()
{
System.out.println("Um objeto foi criado?");
return 1;
}
public ConstrutorFalso()
{
System.out.println("Um objeto foi criado!");
}
public static void main(String args[])
{
ConstrutorFalso obj = new ConstrutorFalso();
}
}

41
Associação

42
Associação
 Como já vimos, uma associação é um
relacionamento estrutural entre duas classes,
significando que os objetos de uma classe
instanciam objetos de outra classe.

 As Classes podem ser tipos de dados e a


Associação pode se evidenciar quando um atributo
de uma classe tem outra classe como seu tipo.

43
Associação
 Exemplo:

public class Pessoa


{
private String nome;
... Declaração de uma instância da
private Residencia endereco; classe Residencia, associando a
... classe Residencia à classe Pessoa
}

44
Associação
 São tipos comuns de Associação:
 Composição
 Agregação

45
Composição e Agregação

46
Composição
• Uma classe Java pode ter referências a objetos de
outras classes como membros
• Composição, ou relacionamento tem-um.

• Por exemplo, um despertador precisa saber o


horário atual
• É razoável embutir duas referências a objetos de uma
classe Hora como membros da classe Despertador.

47
Composição
public class Hora public void setH(int valor)
{ { h = valor; }
private int h, m, s;
public void setM(int valor)
public int getH() { m = valor; }
{ return h; }
public void setS(int valor)
public int getM() { s = valor; }
{ return m; } }

public int getS()


{ return s; }

48
Composição
public class Despertador
{
public void setHorarioAtual
boolean ligado;
Hora despertador, horarioAtual; (int h, int m, int s)

{
public void setDespertador
(int h, int m, int s, boolean valor)
horarioAtual.setH(h);
{
despertador.setH(h); horarioAtual.setM(m);
despertador.setM(m); horarioAtual.setS(s);
despertador.setS(s);
ligado = valor; }
}
}

49
Composição
public class TesteDespertador
{
public static void main(String args[])
{
Despertador d = new Despertador();

d.setHorarioAtual(11, 30, 05);


d.setDespertador(07, 0, 0, true);
}
}

50
Composição
• Neste exemplo, não é possível existir a classe
despertador, sem que exista a classe hora. Temos
uma Composição. A instanciação da classe Hora é
obrigatória na classe Despertador.

51
Agregação
• Em uma Agregação a classe que agregou pode
existir sem a classe agregada.
• Exemplo:
• Imagine uma classe ArCondicionado e uma classe
itensCarro, não existe pedido sem itens.
• Não é obrigado instanciar a classe agregada.

52
Enumerações

53
Enumerações
• Uma enumeração, em sua forma mais simples,
declara um conjunto de constantes representadas
por um identificador
• É um tipo especial de classe, definida pela palavra enum
e um identificador;
• Como em classes, { e } delimitam o corpo de uma
declaração;
• Entre as chaves, fica uma lista de constantes de
enumeração, separadas por vírgula
• Cada uma representando um valor único.

54
Enumerações
public void sorteiaCarta()
{
import java.util.Random; //pode conter COPAS, PAUS, OUROS ou ESPADAS
Naipe cartaNaipe;
public class Baralho //pode conter uma das constantes do enum Valor
{ Valor cartaValor;

private enum Naipe {COPAS, int numero;


PAUS, OUROS, ESPADAS}; Random aleatorio = new Random();
private enum Valor {A, DOIS, TRES,
QUATRO, CINCO, SEIS, SETE, OITO, NOVE, DEZ, J, Q, K}; switch(aleatorio.nextInt(4))
{
case 0: cartaNaipe = Naipe.COPAS; break;
case 1: cartaNaipe = Naipe.PAUS; break;
case 2: cartaNaipe = Naipe.OUROS; break;
case 3: cartaNaipe = Naipe.ESPADAS;
}

55
Enumerações
int temp = 1+aleatorio.nextInt(13);

switch (temp)
{
case 1: cartaValor = Valor.A; break;
case 2: cartaValor = Valor.DOIS; break;
case 3: cartaValor = Valor.TRES; break;
case 4: cartaValor = Valor.QUATRO; break;
case 5: cartaValor = Valor.CINCO; break;
case 6: cartaValor = Valor.SEIS; break;
case 7: cartaValor = Valor.SETE; break;
case 8: cartaValor = Valor.OITO; break;
case 9: cartaValor = Valor.NOVE; break;
case 10: cartaValor = Valor.DEZ; break;
case 11: cartaValor = Valor.J; break;
case 12: cartaValor = Valor.Q; break;
case 13: cartaValor = Valor.K; break;
}
}
}

56
Enumerações
• Variáveis do tipo Naipe só podem receber valores
definidos na enumeração
• Caso contrário, ocorrerá erro de compilação.

• Cada valor é acessado como um membro, separado


do nome da enumeração pelo operador .;

57
Enumerações
• Por padrão, utiliza-se apenas letras maiúsculas para
denotar as constantes de uma enumeração;

• Uma constante de enumeração


• Não pode ser impressa (sem cast);
• Não pode ser comparada (a princípio) com tipos
primitivos.

58
Enumerações
• Um enum é implicitamente declarado como final
• Também são implicitamente declarados como static;
• Qualquer tentativa de criar um objeto de um enum com
o operador new resulta em erro de compilação.

• Um enum pode ser utilizado em qualquer situação


em que constantes possam ser utilizadas
• Rótulos de case;
• For aprimorado.

59
static import

60
static import
• Uma declaração static import permite que
referenciemos membros static importados como se
fossem declarados na classe em que os usa
• O nome da classe e o operador . não são necessários.
• Existem duas sintaxes para um static import
• Uma que importa apenas um membro static em
particular (single static import);
• Uma que importa todos os membros static de uma
classe (static import on demand).

61
static import
• Single static import

import static pacote.Classe.membroStatic;

• Static import on demand

import static pacote.Classe.*;

62
static import
//static import on demand
import static java.lang.Math.*;
public class StaticImportTest
{
public static void main( String args[] )
{
System.out.printf( "sqrt( 900.0 ) = %.1f\n", sqrt(900.0));
System.out.printf( "ceil( -9.8 ) = %.1f\n", ceil(-9.8));
System.out.printf( "log( E ) = %.1f\n", log(E));
System.out.printf( "cos( 0.0 ) = %.1f\n", cos(0));
}
}

63
static import
• Note que não é necessário utilizar o nome da classe
Math para invocar os métodos sqrt, ceil, log e cos.

64
DÚVIDAS

Você também pode gostar