Você está na página 1de 63

Java 2 Standard Edition

Programao orientada a objetos em Java


Helder da Rocha
www.argonavis.com.br

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

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.)

O que Orientao a objetos


Paradigma do momento na engenharia de software A anlise orientada a objetos
Afeta anlise, projeto (design) e programao 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? 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

O design orientado a objetos

Abstrao de casos de uso em (1) anlise OO e (2) anlise procedural


Bibliotecrio Adicionar livros Sistema de Biblioteca Pesquisar Catlogo Usurio

(1) Trabalha no espao do problema (casos de uso simplificados em objetos) Abstraes mais simples e mais prximas do mundo real
Biblioteca Catlogo Livro Autor Autor Livro Autor Livro Autor

(2) Trabalha no espao da soluo (casos de uso decompostos em procedimentos algortmicos) Abstraes mais prximas do mundo do computador
Sistema de Biblioteca
Adicionar Livros Pesquisar Catalogo

Lgica procedural encapsulada em objetos pequenos

Lgica exposta e espalhada por todo o sistema

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 Heap Pilha (varivel), guardada na pilha. 0010
Tm estado (seus atributos) Tm comportamento (seus mtodos) Tm identidade (a referncia)
5

ref 001A
23

001A 001F

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

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

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 boolean char byte short int long float double void Tamanho 16-bit 8-bit 16-bit 32-bit 64-bit 32-bit 64-bit Mnimo Unicode 0 -128 -215 -231 -263 IEEE754 IEEE754 Mximo Unicode 216 - 1 +127 +215 1 +231 1 +263 1 IEEE754 IEEE754 Default false \u0000 0 0 0 0 0.0 0.0 'Wrapper' Boolean Character Byte Short Integer Long Float Double 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
boolean abrePorta() {} int numero Color cor static String arquiteto

12

Casa c1 = new Casa(); c1.numero = 12; c1.cor = Color.yellow; Casa c2 = new Casa(); c2.numero = 56; c2.cor = Color.red; Casa c3 = new Casa(); c3.numero = 72; c3.cor = Color.white; c3.abrePorta();

56

72

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 { private Porta porta; private int numero; public java.awt.Color cor; public Casa() { porta = new Porta(); numero = ++contagem * 10; } public void abrePorta() { porta.abre(); } public static String arquiteto = "Z"; private static int contagem = 0; static { if ( condio ) { arquiteto = "Og"; } } }

Tipo

Atributos de instncia: cada objeto poder armazenar valores diferentes nessas variveis. Procedimento de inicializao de objetos (Construtor): cdigo executado aps a criao de cada novo objeto. Cada objeto ter um nmero diferente. Mtodo de instncia: s possvel cham-lo se for atravs de um objeto. Atributos estticos: no preciso criar objetos para us-los. Todos os objetos os compartilham. Procedimento de inicializao esttico: cdigo executado uma 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
Exemplo:
> Objeto obj = new Objeto();

Chamada de construtor

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
Tipo Interface
Formato das mensagens que se pode enviar para um objeto

CDPlayer liga() desliga() selecionaFaixa(int) avana() retorna() executa() pausa() para()

Em Java
(...) Classe Java (tipo) Referncia CDPlayer cd1;

cd1 = new CDPlayer(); cd1.liga(); Criao de objeto cd1.selecionaFaixa(3); cd1.executa(); (...) 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 a * Composio: a parte essencial de b b Agregao: a parte de b b a Associao: a usado por b b a Reuso da interface da classe: pouco flexvel b a Herana: b a (substituio pura) 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 Vago

Trem
1..*

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 usa EstradaDeFerro

25

Herana (reuso de interface)


Um carro um veculo
Veculo representao UML

Carro

Fuscas e Porsches so carros (e tambm veculos)


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

Fusca

Porsche

representao UML detalhada de Veculo

26

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

Sobreposio

Carro Redefine os mtodos implementados previamente (Um objeto do tipo Fusca tem o mesmo nmero de mtodos de um objeto do tipo Carro

Fusca
abrePorta() getVelocidade()

Porsche
freia()

27

Polimorfismo
Uso de um objeto no lugar de outro
pode-se escrever cdigo que no dependa da existncia prvia de tipos especficos
Desenhista geraFigura() Conhece apenas interface do tipo genrico (Figura) Chama "desenha()" sem saber qual objeto ser desenhado. Objeto real pode ser "plugado" durante a execuo. usa Figura desenha() Ligao da interface com o objeto real pode ser feita durante a execuo

Crculo desenha()

Quadrado desenha()

Tringulo desenha()

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
29

* no existe um modificador com este nome. A ausncia de um modificador de acesso deixa o membro com acesso package-private

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 import import import cidade.ruas.*; // usa todas as classes de pacote pais.terrenos.LoteUrbano; // usa classe LoteUrbano Pessoa; // ilegal desde Java 1.4.0 java.util.*; // usa classes de pacote Java

class Garagem { ... } interface Fachada { ... } /** Classe principal */ public class Casa { ... }

Por causa da declarao package o nome completo destas classes cidade.Garagem cidade.Fachada e cidade.Casa Este arquivo, ao ser 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
... public void paint (Graphics g){ int x = 10; g.drawString(x, x*2, "Booo!"); } ... class T1 { private int a; private int b; public int soma () { return a + b; } } class T2 { int x, y; public int soma () { return x + y; } public static int soma(int a, int b){ return a + b; } public static int soma(int a, int b, int c){ return soma(soma(a, b), c); } }

37

Sintaxe de definio de mtodos


Sintaxe bsica Chave
[mod]* tipo identificador ( [tipo arg]* ) [throws exceo*] { ... } [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; private int codigo = 815; ... public int mostraCodigo() { return codigo; } } class Casa { static Humano arquiteto; int numero; Humano proprietario; Doberman[] guardas; }

public class Produto { public static int total = 0; public int serie = 0; public Produto() { serie = serie + 1; total = serie; } class Data { } int dia; int mes; int ano; }

39

Sintaxe de declarao de atributos


Sintaxe bsica Chave
[modificador]* tipo identificador [= valor] ; [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 protected static final double PI = 3.14159 ; int numero;

Exemplo

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 class Livro { public Produto() { private String titulo; serie = total + 1; public Livro() { total = serie; 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 { private String mensagem; public UmaClasse () { mensagem = "Mensagem inicial"; } public void setMensagem (String m) { mensagem = m; } public String getMensagem() { return mensagem; } }

variavel (referencia) do tipo String construtor inicializao de varivel ocorre quando objeto construdo mtodo que recebe parmetro e altera 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; } public double circunferencia() { return 2 * PI * raio; } }

Circulo

+x: int +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; public int y; } Point
+x: int +y: int

0 0 0

#
v[0] = 23; v[2] = 52;

23 0 52

int[] v = new int[3]; v objeto do tipo (int[]) cria um vetor inicializao dos elementos

De objetos (Point uma classe, com membros x e y, inteiros)


pilha heap null null
Point[] p = new Point[2]; cria um vetor p objeto do tipo (Point[])

pilha

heap # null

heap 0 0
p[0].x p[0].y

p[0] = new Point(); cria um objeto 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 da classe, apenas

private int raio; private int x, y; public double area() { return Math.PI * raio * raio; } public void mudaRaio(int novoRaio) { int maxRaio = 50; if (novoRaio > maxRaio) { raio = maxRaio; } if (novoRaio > 0) { int inutil = 0; raio = novoRaio; } } }

novoRaio varivel local ao mtodo mudaRaio maxRaio varivel local ao mtodo mudaRaio raio varivel de instncia inutil varivel local ao bloco if

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
Membros de instncia s existem se houver um objeto
Errado!
public class Circulo { public int raio; public int x, y; membros de instncia Pode. Porque area() faz parte do objeto!

main() no faz parte do objeto!

:Circulo
+x: 0 +y: 0 +raio: 0 area():double

Certo!
public class Circulo { public int raio; public int x, y;

tem que criar pelo menos um objeto!

public double area() { return Math.PI * raio * raio; } public static void main(String[] a){ raio = 3; qual raio? double z = area(); existe? } } No pode. No existe objeto em main()!

public double area() { return Math.PI * raio * raio; } public static void main(String[] a){ Circulo c = new Circulo(); c.raio = 3; raio de c double z = c.area(); } area() de c

qual area? existe?

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 { private int raio; public void mudaRaio(int raio) { this.raio = raio; } }

varivel de instncia varivel local

58

Comentrios
H duas formas de incluir comentrios em um arquivo Java 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 /** ... */ /* ... comentrio de bloco ... */ // comentrio de linha

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 -numero: String +depositar(valor: double) +sacar (valor: double) +toString(): String +Conta(nome: String) subtrai valor do saldo atual sobrepe Object.toString() retorna String contendo saldo atual

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