Você está na página 1de 63

Java 2 Standard Edition

Programao
orientada a objetos
em Java
Helder da Rocha
www.argonavis.com.br
1
Assuntos abordados neste mdulo
Conceitos de programao orientada a objetos existentes na
sintaxe da linguagem Java
Artefatos: pacote, classe, objeto, membro, atributo, mtodo,
construtor e interface
Caractersticas OO em Java: abstrao, encapsulamento, herana e
polimorfismo
Sintaxe Java para construo de estruturas de dados
Tipos de dados primitivos
Componentes de uma classe
Construo de aplicaes simples em Java
Como construir uma classe Java (um tipo de dados) contendo
mtodos, atributos e construtores
Como construir e usar objetos
Este mdulo longo e aborda muitos assuntos que sero
tratados novamente em mdulos posteriores
2
Por que OO importante?

Java uma linguagem orientada a objetos


Para desenvolver aplicaes e componentes de
qualidade em Java preciso entender e saber aplicar
princpios de orientao a objetos ao programar
possvel escrever programas em Java sem saber
usar os recursos da OO, mas
Dificilmente voc ser capaz de ir alm de programas
simples com mais de uma classe
Ser muito difcil entender outros programas
Seu cdigo ser feio, difcil de depurar e de reutilizar
Voc estar perdendo ao usar uma linguagem como Java
(se quiser implementar apenas rotinas procedurais pode usar uma
linguagem melhor para a tarefa como Shell, Fortran, etc.)
3
O que Orientao a objetos

Paradigma do momento na engenharia de software


Afeta anlise, projeto (design) e programao
A anlise orientada a objetos
Determina o que o sistema deve fazer: Quais os atores
envolvidos? Quais as atividades a serem realizadas?
Decompe o sistema em objetos: Quais so? Que tarefas
cada objeto ter que fazer?
O design orientado a objetos
Define como o sistema ser implementado
Modela os relacionamentos entre os objetos e atores
(pode-se usar uma linguagem especfica como UML)
Utiliza e reutiliza abstraes como classes, objetos,
funes, frameworks, APIs, padres de projeto
4
Abstrao de casos de uso em
(1) anlise OO e (2) anlise procedural
Sistema de Biblioteca
Adicionar
Bibliotecrio livros
Pesquisar Usurio
Catlogo

(1) Trabalha no espao do (2) Trabalha no espao da soluo


problema (casos de uso (casos de uso decompostos em
simplificados em objetos) procedimentos algortmicos)
Abstraes mais simples e Abstraes mais prximas do
mais prximas do mundo real mundo do computador
Biblioteca Lgica procedural
encapsulada em Sistema de Biblioteca
Catlogo
objetos pequenos
Livro
Livro Adicionar Livros Pesquisar Catalogo
Autor
Autor
Livro Lgica exposta e
Autor
Autor espalhada por
todo o sistema
5
O que um objeto?

Objetos so conceitos que tm


identidade,
estado e
comportamento
Caractersticas de Smalltalk, resumidas por Allan Kay:
Tudo (em um programa OO) so objetos
Um programa um monte de objetos enviando
mensagens uns aos outros
O espao (na memria) ocupado por um objeto consiste
de outros objetos
Todo objeto possui um tipo (que descreve seus dados)
Objetos de um determinado tipo podem receber as
mesmas mensagens
6
Ou seja...

Em uma linguagem OO pura


Uma varivel um objeto
Um programa um objeto
Um procedimento um objeto
Um objeto composto de objetos, portanto
Um programa (objeto) pode ter variveis (objetos que
representam seu estado) e procedimentos (objetos que
representam seu comportamento)
Analogia: abstrao de um telefone celular
composto de outros objetos, entre eles bateria e botes
A bateria um objeto tambm, que possui pelo menos um
outro objeto: carga, que representa seu estado
Os botes implementam comportamentos
7
Objetos (2)

Em uma linguagem orientada a objetos pura


Um nmero, uma letra, uma palavra, uma valor booleano,
uma data, um registro, uma boto da GUI so objetos
Em Java, objetos so armazenados na memria de
heap e manipulados atravs de uma referncia
(varivel), guardada na pilha. Pilha
0010
Heap
5
Tm estado (seus atributos) ref 001A 001A

Tm comportamento (seus mtodos) 23


001F
Tm identidade (a referncia)
Valores unidimensionais no so objetos em Java
Nmeros, booleanos, caracteres so armazenados na pilha
Tm apenas identidade (nome da varivel) e estado (valor
literal armazenado na varivel); - dinmicos; + rpidos
8
Variveis, valores e referncias

Variveis so usadas em linguagens em geral para


armazenar valores
Em Java, variveis podem armazenar endereos de
memria do heap ou valores atmicos de tamanho fixo
Endereos de memria (referncias) so inaccessveis aos
programadores (Java no suporta aritmtica de ponteiros!)
Valores atmicos representam tipos de dados primitivos
Valores so passados para variveis atravs de
operaes de atribuio
Atribuio de valores feita atravs de literais
Atribuio de referncias (endereos para valores) feita
atravs de operaes de construo de objetos e, em dois
casos, pode ser feita atravs de literais
9
Literais e tipos

Tipos representam um valor, uma coleo de valores


ou coleo de outros tipos. Podem ser
Tipos bsicos, ou primitivos, quando representam unidades
indivisveis de informao de tamanho fixo
Tipos complexos, quando representam informaes que
podem ser decompostas em tipos menores. Os tipos
menores podem ser primitivos ou outros tipos complexos
Literais: so valores representveis literalmente.
Nmeros: 1, 3.14, 1.6e-23 Unidimensionais
Valores booleanos: true e false
Caracteres individuais: 'a', '\u0041', '\n') Compostos
Seqncias de caracteres: "aaa", "Java"
Vetores de nmeros, booleanos ou strings: {"a", "b"}
10
Tipos primitivos e complexos

Exemplos de tipos primitivos (atmicos)


Um inteiro ou um caractere,
Um literal booleano (true ou false)
Exemplos de tipos complexos
Uma data: pode ser decomposta em trs inteiros,
representando dia, ms e ano
Um vetor de inteiros: pode ser decomposto em suas partes
Uma seqncia de caracteres: pode ser decomposta nos
caracteres que a formam
Em Java, tipos complexos so armazenados como
objetos e tipos primitivos so guardados na pilha
Apesar de serem objetos, seqncias de caracteres
(strings) em Java podem ser representadas literalmente.
11
Tipos primitivos em Java
Tm tamanho fixo. Tm sempre valor default.
Armazenados na pilha (acesso rpido)
No so objetos. Classe 'wrapper ' faz transformao, se
necessrio (encapsula valor em um objeto).
Tipo Tamanho Mnimo Mximo Default 'Wrapper'
boolean false Boolean
char 16-bit Unicode 0 Unicode 216 - 1 \u0000 Character
byte 8-bit -128 +127 0 Byte
short 16-bit -215 +215 1 0 Short
int 32-bit -231 +231 1 0 Integer
long 64-bit -263 +263 1 0 Long
float 32-bit IEEE754 IEEE754 0.0 Float
double 64-bit IEEE754 IEEE754 0.0 Double
void Void

12
Exemplos de tipos primitivos e literais
Literais de caracter:
char c = 'a';
char z = '\u0041'; // em Unicode
Literais inteiros
int i = 10; short s = 15; byte b = 1;
long hexa = 0x9af0L; int octal = 0633;
Literais de ponto-flutuante
float f = 123.0f;
double d = 12.3;
double g = .1e-23;
Literais booleanos
boolean v = true;
boolean f = false;
Literais de string (no tipo primitivo - s uma referncia)
String s = "abcde";
Literais de vetor (no tipo primitivo - v uma referncia)
int[] v = {5, 6};
13
O que uma classe?
Classes so uma especificao para objetos
Uma classe representa um tipo de dados complexo
Classes descrevem
Tipos dos dados que compem o objeto (o que podem armazenar)
Procedimentos que o objeto pode executar (o que podem fazer)
Instncias da classe Casa (objetos)
Classe Casa c1 = new Casa();
c1.numero = 12;
Casa 12
c1.cor = Color.yellow;

Casa c2 = new Casa();


boolean abrePorta() {} c2.numero = 56;
56
int numero c2.cor = Color.red;
Color cor
static String arquiteto Casa c3 = new Casa();
c3.numero = 72;
72 c3.cor = Color.white;
c3.abrePorta();
14
Ou seja...

Classes no so os objetos que representam


A planta de uma casa um objeto, mas no uma casa
Classes definem lgica esttica
Relacionamentos entre classes so definidos na
programao e no mudam durante a execuo
Relacionamentos entre objetos so dinmicos e podem
mudar. O funcionamento da aplicao reflete a lgica de
relacionamento entre os objetos, e no entre as classes.
Classes no existem no contexto da execuo
Uma classe representa vrios objetos que ocupam espao
na memria, mas ela no existe nesse domnio
A classe tem papel na criao dos objetos, mas no existe
quando os objetos trocam mensagens entre si.
15
Resumo
Objetos so conceitos que tm estado (atributos),
comportamento (mtodos) e identidade (referncia)
Tipos representam valores
Primitivos: valores fixos e indivisveis. So armazenados na pilha
Complexos: valores multidimensionais que podem ser
decompostos em componentes menores. Descrevem objetos que
so armazenados no heap
Literais
Usados para definir tipos primitivos ou certos tipos complexos
formados por componentes iguais (strings e vetores)
Variveis podem armazenar valores de tipos primitivos ou
referncias para objetos
Classes so tipos complexos: descrevem objetos
No so importantes no contexto da execuo
16
Membros: atributos e mtodos
Uma classe define uma estrutura de dados no-ordenada
Pode conter componentes em qualquer ordem
Os componentes de uma classe so seus membros
Uma classe pode conter trs tipos de componentes
Membros estticos ou de classe: no fazem parte do "tipo"
Membros de instncia: definem o tipo de um objeto
Procedimentos de inicializao
Membros estticos ou de classe
Podem ser usados atravs da classe mesmo quando no h objetos
No se replicam quando novos objetos so criados
Membros de instncia
Cada objeto, quando criado, aloca espao para eles
S podem ser usados atravs de objetos
Procedimentos de inicializao
Usados para inicializar objetos ou classes
17
Exemplo
public class Casa { Atributos de instncia: cada
objeto poder armazenar valores
private Porta porta;
private int numero; diferentes nessas variveis.
public java.awt.Color cor; Procedimento de inicializao de
objetos (Construtor): cdigo
public Casa() {
executado aps a criao de cada
Tipo porta = new Porta();
numero = ++contagem * 10; novo objeto. Cada objeto ter um
} nmero diferente.
Mtodo de instncia: s possvel
public void abrePorta() {
porta.abre();
cham-lo se for atravs de um
} objeto.
Atributos estticos: no preciso
public static String arquiteto = "Z";
criar objetos para us-los. Todos
private static int contagem = 0;
os objetos os compartilham.
static { Procedimento de inicializao
if ( condio ) { esttico: cdigo executado uma
arquiteto = "Og";
}
nica vez, quando a classe
} carregada. O arquiteto ser um s
} para todas as casas: ou Z ou Og.18
Boas prticas ao escrever classes

Use, e abuse, dos espaos


Endente, com um tab ou 4 espaos, membros da classe,
Endente com 2 tabs, o contedo dos membros, ...
A ordem dos membros no importante, mas seguir
convenes melhora a legibilidade do cdigo
Mantenha os membros do mesmo tipo juntos (no
misture mtodos estticos com mtodos de instncia)
Declare as variveis antes ou depois dos mtodos (no
misture mtodos, construtores e variveis)
Mantenha os seus construtores juntos, de preferncia
bem no incio
Se for necessrio definir blocos static, defina apenas um,
e coloque-o no incio ou no final da classe.
19
Construtores

Construtores so procedimentos realizados na


construo de objetos
Parecem mtodos, mas no tm tipo de retorno e tm
nome idntico ao nome da classe
No fazem parte da definio do tipo do objeto (interface)
Nem sempre aparecem explcitos em uma classe: podem
ser omitidos (o sistema oferece uma implementao default)
Para cada objeto, o construtor chamado
exatamente uma vez: na sua criao
Chamada de
Exemplo:
construtor
> Objeto obj = new Objeto();
Alguns podem requerer parmetros
> Objeto obj = new Objeto(35, "Nome");
20
Objetos possuem uma interface ...

Atravs da interface* possvel utiliz-lo


No preciso saber dos detalhes da implementao
O tipo (Classe) de um objeto determina sua interface
O tipo determina quais mensagens podem ser enviadas

CDPlayer
Em Java
Tipo
(...) Classe Java (tipo)
liga()
desliga() CDPlayer cd1; Referncia
Interface
selecionaFaixa(int) cd1 = new CDPlayer();
Formato das avana()
mensagens retorna() cd1.liga(); Criao de objeto
que se pode executa() cd1.selecionaFaixa(3);
enviar para pausa() cd1.executa();
um objeto para() (...) Envio de mensagem

* interface aqui refere-se a um conceito e no a um tipo de classe Java 21


... e uma implementao (oculta)

Implementao no interessa quem usa objetos


Papel do usurio de classes
no precisa saber como a classe foi escrita, apenas quais
seus mtodos, quais os parmetros (quantidade, ordem e
tipo) e valores que so retornados
usa apenas a interface (pblica) da classe
Papel do desenvolvedor de classes
define novos tipos de dados
expe, atravs de mtodos, todas as funes necessrias
ao usurio de classes, e oculta o resto da implementao
tem a liberdade de mudar a implementao das classes
que cria sem que isto comprometa as aplicaes
desenvolvidas pelo usurio de classes
22
Resumo
Os componentes de uma classe, em Java, podem pertencer a
dois domnios, que determinam como so usados
Domnio da classe: existem independentemente de existirem
objetos ou no: mtodos static, blocos static, atributos static
e interface dos construtores de objetos
Domnio do objeto: mtodos e atributos no declarados como
static (definem o tipo ou interface que um objeto possui), e
contedo dos construtores
Construtores so usados apenas para construir objetos
No so mtodos (no declaram tipo de retorno)
"Ponte" entre dois domnios: so chamados uma vez antes do objeto
existir (domnio da classe) e executados no domnio do objeto criado
Separao de interface e implementao
Usurios de classes vem apenas a interface.
Implementao encapsulada dentro dos mtodos, e pode variar sem
afetar classes que usam os objetos 23
Reuso de implementao

Separao interface-implementao: maior reuso


Reuso depende de bom planejamento e design
Uma vez criada uma classe, ela deve representar uma
unidade de cdigo til para que seja reutilizvel
Formas de uso e reuso
Uso e reuso de objetos criados pela classe: mais flexvel
Composio: a parte essencial de b b a *
Agregao: a parte de b b a
Associao: a usado por b b a
Reuso da interface da classe: pouco flexvel
Herana: b a (substituio pura) b a
ou b um tipo de a (substituio til, extenso)

* Notao UML 24
Agregao, composio e associao
Composio: um trem formado por locomotiva e vages
1
Locomotiva
Trem
1..* Vago

Agregao: uma locomotiva tem um farol (mas no vai


deixar de ser uma locomotiva se no o tiver)
Locomotiva Farol

Associao: um trem usa uma estrada de ferro (no faz parte


do trem, mas ele depende dela)
Trem EstradaDeFerro
usa

25
Herana (reuso de interface)

Um carro um veculo
Veculo representao
UML

Carro

Fuscas e Porsches so carros (e tambm veculos)


representao
Veculo Veculo
UML simplificada
(no mostra os getVelocidade():float
mtodos) getPassageiros():int
Carro acelera()
freia()

representao UML
Fusca Porsche
detalhada de Veculo
26
Extenso e sobreposio

Extenso
Acrescenta novos Veculo
mtodos aos j herdados Veculo getVelocidade():float
(Um objeto do tipo getPassageiros():int
Carro tem mais mtodos acelera()
Carro
que um objeto do tipo freia()
abastece()
Veiculo) fechaPorta()
abrePorta()

Sobreposio
Carro

Redefine os mtodos
implementados
Fusca Porsche previamente (Um objeto do
abrePorta() freia() tipo Fusca tem o mesmo
getVelocidade() nmero de mtodos de um
objeto do tipo Carro
27
Polimorfismo

Uso de um objeto no lugar de outro


pode-se escrever cdigo que no dependa da existncia
prvia de tipos especficos
Ligao da interface
Desenhista usa Figura com o objeto real
pode ser feita durante
geraFigura() desenha() a execuo

Conhece apenas interface


do tipo genrico (Figura)
Crculo Quadrado Tringulo
Chama "desenha()" sem desenha() desenha() desenha()
saber qual objeto ser
desenhado. Objeto real
pode ser "plugado"
durante a execuo. Cada desenha() sobrepe funcionamento
original com algo diferente
28
Encapsulamento

Simplifica o objeto expondo apenas a sua interface


essencial
Cdigo dentro de mtodos naturalmente encapsulado
No possvel acessar interior de um mtodo fora do objeto
Mtodos que no devem ser usados externamente e
atributos podem ter seu nvel de acesso controlado em
Java, atravs de modificadores
private: apenas acesso dentro da classe
package-private (default): acesso dentro do pacote*
protected: acesso em subclasses
public: acesso global

* no existe um modificador com este nome. A ausncia de um


modificador de acesso deixa o membro com acesso package-private 29
Resumo de caractersticas OO
Abstrao de conceitos
Classes, definem um tipo separando interface de implementao
Objetos: instncias utilizveis de uma classe
Herana: " um"
Aproveitamento do cdigo na formao de hierarquias de classes
Fixada na compilao (inflexvel)
Associao "tem um"
Consiste na delegao de operaes a outros objetos
Pode ter comportamento e estrutura alterados durante execuo
Vrios nveis de acoplamento: associao, composio, agregao
Encapsulamento
Separao de interface e implementao que permite que usurios
de objetos possam utiliz-los sem conhecer detalhes de seu cdigo
Polimorfismo
Permite que objeto seja usado no lugar de outro
30
Exerccio

1. Crie, e compile as seguintes classes


Uma Pessoa tem um nome (String)
Uma Porta tem um estado aberto, que pode ser true ou
false, e pode ser aberta ou fechada
Uma Construcao tem uma finalidade
Uma Casa uma Construcao com finalidade residencial
que tem um proprietrio Pessoa, um nmero e um
conjunto (vetor) de Portas
2. Crie as seguintes classes
Um Ponto tem coordenadas x e y inteiras
Um Circulo tem um Ponto e um raio inteiro
Um Pixel um tipo de Ponto que possui uma cor

31
Menor classe utilizvel em Java

Uma classe contm a representao de um objeto


define seus mtodos (comportamento)
define os tipos de dados que o objeto pode armazenar
(estado)
determina como o objeto deve ser criado (construtor)
Uma classe Java tambm pode conter
procedimentos independentes (mtodos static)
variveis estticas
rotinas de inicializao (blocos static)
O programa abaixo a menor unidade compilvel
em Java class Menor {}

32
Smbolos essenciais
Separadores
{ ... } chaves: contm as partes de uma classe e delimitam blocos de
instrues (em mtodos, inicializadores, estruturas de controle, etc.)
; ponto-e-vrgula: obrigatria no final de toda instruo simples ou
declarao
Identificadores
Nomes usados para representar classes, mtodos, variveis (por
exemplo: desenha, Casa, abrePorta, Circulo, raio)
Podem conter letras (Unicode) e nmeros, mas no podem comear
com nmero
Palavras reservadas
So 52 (assert foi includa na verso 1.4.0) e consistem de 49
palavras-chave e literais true, false e null.
Exemplos de palavras-chave so public, int, class, for e void
A maior parte dos editores de cdigo Java destaca as palavras
reservadas
33
Para que serve uma classe

Uma classe pode ser usada para


conter a rotina de execuo principal de uma aplicao
iniciada pelo sistema operacional (mtodo main)
conter funes globais (mtodos estticos)
conter constantes e variveis globais (campos de dados
estticos)
especificar e criar objetos (contm construtores, mtodos
e atributos de dados)

34
Uma unidade de compilao
Casa.java

package cidade; // classe faz parte do pacote cidade

import cidade.ruas.*; // usa todas as classes de pacote


import pais.terrenos.LoteUrbano; // usa classe LoteUrbano
import Pessoa; // ilegal desde Java 1.4.0
import java.util.*; // usa classes de pacote Java

class Garagem {
... Por causa da declarao package
} o nome completo destas classes
cidade.Garagem
interface Fachada { cidade.Fachada e
... cidade.Casa
}

/** Classe principal */ Este arquivo, ao ser


public class Casa { compilado, ir gerar
... trs arquivos .class
}

35
O que pode conter uma classe

Um bloco class pode conter (entre as chaves {...}), em


qualquer ordem
(1) zero ou mais declaraes de atributos de dados
(2) zero ou mais definies de mtodos
(3) zero ou mais construtores
(4) zero ou mais blocos de inicializao static
(5) zero ou mais definies de classes ou interfaces
internas
Esses elementos s podem ocorrer dentro do bloco class
NomeDaClasse { ... }
tudo, em Java, pertence a alguma classe
apenas import e package podem ocorrer fora de uma
declarao class (ou interface)
36
Mtodos
Contm procedimentos - instrues simples ou compostas executadas
em seqncia - entre chaves
Podem conter argumentos
O tipo de cada argumento precisa ser declarado
Mtodo identificado pelo nome + nmero e tipo de argumentos
Possuem um tipo de retorno ou a palavra void
Podem ter modificadores (public, static, etc.) antes do tipo
... class T2 {
public void paint (Graphics g){ int x, y;
int x = 10; public int soma () {
g.drawString(x, x*2, "Booo!"); return x + y;
} }
... public static int soma(int a, int b){
return a + b;
}
class T1 {
private int a; private int b; public static int soma(int a,
public int soma () { int b, int c){
return a + b; return soma(soma(a, b), c);
} }
} }
37
Sintaxe de definio de mtodos

Sintaxe bsica
[mod]* tipo identificador ( [tipo arg]* ) [throws exceo*] { ... }
Chave
[mod]* zero ou mais modificadores separados por espaos
tipo tipo de dados retornado pelo mtodo
identificador nome do mtodo
[arg]* zero ou mais argumentos, com tipo declarado,
separados por vrgula
[throws exceo*] declarao de excees
Exemplos
public static void main ( String[] args ) { ... }
private final synchronized
native int metodo (int i, int j, int k) ;
String abreArquivo ()
throws IOException, Excecao2 { ... }

38
Atributos de dados

Contm dados
Devem ser declaradas com tipo
Podem ser pr-inicializadas (ou no)
Podem conter modificadores
public class Livro {
private String titulo;
public class Produto { private int codigo = 815;
public static int total = 0; ...
public int serie = 0; public int mostraCodigo() {
public Produto() { return codigo;
serie = serie + 1; }
total = serie; }
} class Casa {
} class Data { static Humano arquiteto;
int dia; int numero;
int mes; Humano proprietario;
int ano; Doberman[] guardas;
} }
39
Sintaxe de declarao de atributos

Sintaxe bsica
[modificador]* tipo identificador [= valor] ;
Chave
[modificador]* zero ou mais modificadores (de acesso, de
qualidade), separados por espaos: public, private, static, transient,
final, etc.
tipo tipo de dados que a varivel (ou constante) pode conter
identificador nome da varivel ou constante
[= valor] valor inicial da varivel ou constante
Exemplo
protected static final double PI = 3.14159 ;
int numero;

40
Construtores
Tm sempre o mesmo nome que a classe
Contm procedimentos entre chaves, como os mtodos
So chamados apenas uma vez: na criao do objeto
Pode haver vrios em uma mesma classe
So identificados pelo nmero e tipo de argumentos
Nunca declaram tipo de retorno
public class Produto {
public static int total = 0;
public int serie = 0;
public Produto() { public class Livro {
serie = total + 1; private String titulo;
total = serie; public Livro() {
} titulo = "Sem ttulo";
} }
public Livro(String umTitulo) {
titulo = umTitulo;
}
}
41
Sintaxe de construtores

Construtores so procedimentos especiais usados para


construir novos objetos a partir de uma classe
A definio de construtores opcional: Toda classe sem
construtor declarado explicitamente possui um construtor
fornecido pelo sistema (sem argumentos)
Parecem mtodos mas
no definem tipo de retorno
possuem, como identificador, o nome da classe: Uma classe pode
ter vrios construtores, com o mesmo nome, que se
distinguem pelo nmero e tipo de argumentos
Sintaxe
[mod]* nome_classe ( [tipo arg]* ) [throws exceo*] { ... }

42
Exemplo

Exemplo de classe com um atributo de dados


(varivel), um construtor e dois mtodos
public class UmaClasse {
variavel (referencia)
private String mensagem; do tipo String
public UmaClasse () { construtor
mensagem = "Mensagem inicial";
} inicializao de varivel
ocorre quando objeto
public void setMensagem (String m) {
mensagem = m;
construdo
} mtodo que recebe
public String getMensagem() { parmetro e altera
return mensagem; varivel
}
} mtodo que retorna varivel

43
Exemplo: um crculo

public class Circulo {


public int x;
public int y;
public int raio;
public static final double PI = 3.14159;

public Circulo (int x1, int y1, int r) {


x = x1;
y = y1;
raio = r;
}
Circulo

public double circunferencia() { +x: int


return 2 * PI * raio; +y: int
} +raio: int
} +PI: 3.14159

+Circulo(x:int, y:int, raio:int)


+circunferencia(): double

44
Usando crculos

Use dentro de um mtodo ou construtor (blocos de


procedimentos)
Circulo c1, c2, c3;
c1 = new Circulo(3, 3, 1);
c2 = new Circulo(2, 1, 4);
c3 = c1; // mesmo objeto!
System.out.println("c1: (" + c1.x + ", "
+ c1.y + ")");
int circ = (int) c1.circunferencia();
System.out.print("Raio de c1: " + c1.raio);
System.out.println("; Circunferncia de c1: "
+ circ);

45
Herana

Circulo

+x: int
+y: int
+raio: int
+PI: 3.14159

+Circulo(x:int, y:int, raio:int)


+circunferencia(): double
class Coisa extends Circulo {
Coisa() {
this(1, 1, 0);
}
Coisa(int x, int y, int z) {
super(x, y, z);
}
} Coisa

+Coisa(x:int, y:int, raio:int)


+Coisa()
A Coisa um Circulo!
46
Exerccio

1. Escreva uma classe Ponto


contm x e y que podem ser definidos em construtor
mtodos getX() e getY() que retornam x e y
mtodos setX(int) e setY(int) que mudam x e y
2. Escreva uma classe Circulo, que contenha
raio inteiro e origem Ponto
construtor que define origem e raio
mtodo que retorna a rea
mtodo que retorna a circunferncia
use java.lang.Math.PI (Math.PI)
3. Crie um segundo construtor para Circulo que aceite
um raio do tipo int e coordenadas x e y

47
Vetores
Vetores so colees de objetos ou tipos primitivos
Os tipos devem ser conversveis ao tipo em que foi declarado o vetor
int[] vetor = new int[10];
Cada elemento do vetor inicializado a um valor default,
dependendo do tipo de dados:
null, para objetos
0, para int, long, short, byte, float, double
Unicode 0, para char
false, para boolean
Elementos podem ser recuperados a partir da posio 0:
int elemento_1 = vetor[0];
int elemento_2 = vetor[1];

48
Vetores
De tipos primitivos
pilha heap pilha heap class Point {
public int x;
# 0 # 23 public int y;
}
0 0
v[0] = 23;
0 v[2] = 52; 52 Point
+x: int
int[] v = new int[3]; +y: int
inicializao dos
v objeto do tipo (int[]) cria um vetor
elementos
De objetos (Point uma classe, com membros x e y, inteiros)
pilha heap pilha heap heap
# null # # 0 p[0].x
0 p[0].y
null null
Point[] p = new Point[2]; p[0] = new Point();
cria um vetor cria um objeto Point
p objeto do tipo (Point[]) 49
Inicializao de vetores

Vetores podem ser inicializados no momento em que so criados.


Sintaxe:
String[] semana = {"Dom", "Seg", "Ter",
"Qua", "Qui", "Sex","Sab"};
String[][] usuarios = {
{"Joo", "Ningum"},
{"Maria", "D.", "Aparecida"},
{"Fulano", "de", "Tal"}
};
Essa inicializao no pode ser usada em outras situaes
(depois que o vetor j existe), exceto usando new, da forma:
semana =
new String[] {"Dom", "Seg", "Ter", "Qua",
"Qui", "Sex", "Sab"};

50
A propriedade length

length: todo vetor em Java possui esta propriedade que


informa o nmero de elementos que possui
length uma propriedade read-only
extremamente til em blocos de repetio
for (int x = 0; x < vetor.length; x++) {
vetor[x] = x*x;
}
Uma vez criados, vetores no podem ser redimensionados
Use System.arraycopy() para copiar um vetor para
dentro de outro (alto desempenho)
Use java.util.ArrayList (ou Vector) para manipular com
vetores de tamanho varivel (baixo desempenho)
ArrayLists e Vectors so facilmente conversveis em vetores
quando necessrio

51
Vetores multidimensionais

Vetores multidimensionais em Java so vetores de vetores


possvel criar toda a hierarquia (vetor de vetor de vetor...), para
fazer vetores retangulares ...
int [][][] prisma = new int [3][2][2];

... ou criar apenas o primeiro nvel (antes de usar, porm, preciso


criar os outros nveis)

int [][][] prisma2 = new int [3][][];


prisma2[0] = new int[2][];
prisma2[1] = new int[3][2];
prisma2[2] = new int[4][4];
prisma2[0][0] = new int[5];
prisma2[0][1] = new int[3];

52
Exerccios

1. Crie uma classe TestaCirculos que


a) crie um vetor de 5 objetos Circulo
b) imprima os valores x, y, raio de cada objeto
c) declare outra referncia do tipo Circulo[]
d) copie a referncia do primeiro vetor para o segundo
e) imprima ambos os vetores
f) crie um terceiro vetor
g) copie os objetos do primeiro vetor para o terceiro
h) altere os valores de raio para os objetos do primeiro
vetor
i) imprima os trs vetores

53
Escopo de variveis

Atributos de dados (declarados no bloco da classe): podem


ser usadas em qualquer lugar (qualquer bloco) da classe
Uso em outras classes depende de modificadores de acesso (public,
private, etc.)
Existem enquanto o objeto existir (ou enquanto a classe existir, se
declarados static)
Variveis locais (declaradas dentro de blocos de
procedimentos)
Existem enquanto procedimento (mtodo, bloco de controle de
execuo) estiver sendo executado
No podem ser usadas fora do bloco
No pode ter modificadores de acesso (private, public, etc.)

54
Exemplo
public class Circulo {

variveis visveis dentro private int raio;


da classe, apenas private int x, y;

public double area() {


return Math.PI * raio * raio;
novoRaio varivel local }
ao mtodo mudaRaio
maxRaio varivel local public void mudaRaio(int novoRaio) {
int maxRaio = 50;
ao mtodo mudaRaio
if (novoRaio > maxRaio) {
raio varivel de instncia raio = maxRaio;
}
if (novoRaio > 0) {
inutil varivel local int inutil = 0;
ao bloco if raio = novoRaio;
}
}
}

55
Membros de instncia vs.
componentes estticos (de classe)
Componentes estticos
Os componentes de uma classe, quando declarados
'static', existem independente da criao de objetos
S existe uma cpia de cada varivel ou mtodo
Membros de instncia
mtodos e variveis que no tenham modificador 'static'
so membros do objeto
Para cada objeto, h uma cpia dos mtodos e variveis
Escopo
Membros de instncia no podem ser usados dentro de
blocos estticos: preciso obter antes, uma referncia para
o objeto

56
Exemplos
:Circulo
main() no
Membros de instncia s existem faz parte do
+x: 0
+y: 0
se houver um objeto objeto! +raio: 0
area():double

Errado! Certo!
public class Circulo { membros de public class Circulo {
instncia tem que
public int raio; public int raio; criar pelo
public int x, y; Pode. Porque area() public int x, y; menos um
faz parte do objeto! objeto!
public double area() { public double area() {
return Math.PI * raio * raio; return Math.PI * raio * raio;
} }

public static void main(String[] a){ public static void main(String[] a){
raio = 3; qual raio? Circulo c = new Circulo();
double z = area(); existe? c.raio = 3;
raio de c
} double z = c.area();
} qual area? } area() de c
No pode. No existe existe? }
objeto em main()!

57
Variveis locais vs.
variveis de instncia
Variveis de instncia ...
sempre so automaticamente inicializadas
so sempre disponveis no interior dos mtodos de instncia e
construtores
Variveis locais ...
sempre tm que ser inicializadas antes do uso
podem ter o mesmo identificador que variveis de instncia
neste caso, preciso usar a palavra reservada this para fazer
a distino
class Circulo { varivel de instncia
private int raio;
public void mudaRaio(int raio) {
this.raio = raio; varivel local
}
}
58
Comentrios

H duas formas de incluir comentrios em um


arquivo Java
/* ... comentrio de bloco ... */
// comentrio de linha
Antes de mtodos, construtores, campos de dados e
classes, o comentrio de bloco iniciado com /**
pode ser usado para gerar HTML em documentao
H uma ferramenta (JavaDoc) que gera
automaticamente documentao a partir dos arquivos
.java
relaciona e descreve classes, mtodos, etc e cria
referncias cruzadas
Descries em HTML podem ser includas nos
comentrios especiais /** ... */
59
Gerao de documentao

Para gerar documentao de um arquivo ou de uma


coleo de arquivos .java use o javadoc:
javadoc arquivo1.java arquivo2.java
O programa criar uma coleo de arquivos HTML,
interligados, entre eles estaro
ndice de referncias cruzadas
uma pgina para cada classe, com links para cada
mtodo, construtor e campo pblico, contendo descries
(se houver) de comentrios /** .. */
Consulte a documentao para maiores informaes
sobre a ferramenta javadoc.

60
Convenes de cdigo
Toda a documentao Java usa uma conveno para nomes
de classes, mtodos e variveis
Utiliz-la facilitar a manuteno do seu cdigo!
Classes, construtores e interfaces
use caixa-mista com primeira letra maiscula, iniciando novas
palavras com caixa-alta. No use sublinhado.
ex: UmaClasse, Livro
Mtodos e variveis
use caixa mista, com primeira letra minscula
ex: umaVariavel, umMetodo()
Constantes
use todas as letras maisculas. Use sublinhado para separar as
palavras
ex: UMA_CONSTANTE

61
Exerccios

1. Classe Conta e TestaConta


a) Crie a classe Conta, de acordo com o diagrama UML abaixo
acrescenta valor ao saldo atual
Conta
-saldo: double subtrai valor do saldo atual
-numero: String
sobrepe Object.toString()
+depositar(valor: double) retorna String contendo saldo
+sacar (valor: double) atual
+toString(): String
+Conta(nome: String)

b) Crie uma classe TestaConta, contendo um mtodo main(), e


simule a criao de objetos Conta, o uso dos mtodos depositar() e
sacar() e imprima, aps cada operao, os valores disponveis
atravs do mtodo toString()
c) Gere a documentao javadoc das duas classes

62
Curso J100: Java 2 Standard Edition
Reviso 17.0

1996-2003, Helder da Rocha


(helder@acm.org)

argonavis.com.br
63

Você também pode gostar