Your SlideShare is downloading. ×

Orientação a Objetos com Java

14,680
views

Published on

Curso de Orientação a Objetos com Java

Curso de Orientação a Objetos com Java

Published in: Technology

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
14,680
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
444
Comments
0
Likes
6
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Orientação a Objetos com Java Centro de Formação Java www.cfj.com.br regismelo@gmail.comOrientação a Objetos com Java Pág: 1
  • 2. Missão Apresentar, motivar e exercitar a plataforma J2SE – Java 2 Standard Edition e conceitos de Orientação a Objetos.Orientação a Objetos com Java Pág: 2
  • 3. Metodologias • Exposição e discussão teóricas; • Exercícios práticos de projeto e modelagem em laboratório.Orientação a Objetos com Java Pág: 3
  • 4. O que esse curso não cobre ou não é? Não Cobre: • Conceitos gerais de programação – Esse não é um curso para quem nunca programou antes; Não é: • Um curso para aprender a programar (lógica de programação).Orientação a Objetos com Java Pág: 4
  • 5. Programa • Iniciando • Identificadores, Keywords e tipos • Orientação a objetos • Arrays • Ponteiros, Referências e listas • Herança e ligação dinâmica • Classe abstratas • Interfaces e Polimorfismo • Tratamento de Exceções • Packages • JDBC • IO • ThreadsOrientação a Objetos com Java Pág: 5
  • 6. Antes de iniciar... Vamos nos apresentar • Nome; • Empresa; • Experiência com programação; • Razões de estar fazendo esse treinamento; • Expectativas desse curso.Orientação a Objetos com Java Pág: 6
  • 7. Livro SugeridoOrientação a Objetos com Java Pág: 7
  • 8. Módulo I IniciandoOrientação a Objetos com Java Pág: 8
  • 9. O que é Java? • Linguagem para eletrodomésticos? • James Gosling, SUN Microsystems, 1995; • Familiar (sintaxe parecida com C – também sensitive case); • Simples e robusta (menos bugs!); • Coleta de lixo (menos bugs!); • Independente de plataforma; • Segura; • Código intermediário interpretado; • Sintaxe fortemente tipada e rigorosa.Orientação a Objetos com Java Pág: 9
  • 10. Entendendo um pouco mais • Máquinas virtuais; • Coleta de lixo; • Segurança.Orientação a Objetos com Java Pág: 10
  • 11. Como Funciona? Compilação Source Compiler Byte Code Assembly Code Native JIT Code Compiler Durante a instalação ou na primeira chamada Máquina Virtual - JVMOrientação a Objetos com Java Pág: 11
  • 12. A máquina virtual Java • Conhecida como JVM; • JVM é dependente de plataforma; • Processa os byte codes que são independentes de plataforma; • Existem diversas VMs de diversos fornecedores; • Cada VM deve ser capaz de executar qualquer classe compilada java (bytecode).Orientação a Objetos com Java Pág: 12
  • 13. …A máquina virtual Java JVM NF.java NF bytecode Pedido Pedido.java bytecode Cliente bytecode Cliente.java Windows *.* Palm OS Linux Macintosh Solaris ???Orientação a Objetos com Java Pág: 13
  • 14. Como obter uma JVM? • Diversos fabricantes fornecem JVMs (SUN, IBM, ...); • A versão disponibilizada pela SUN é a mais popular e pode ser baixada gratuitamente no site http://java.sun.com/j2se/1.4.2/download.html. • A versão atual da JVM da SUN é a 1.4.2; • Na página, podem ser baixados o JRE e o SDK; • JRE = Ambiente para máquinas que irão rodar Java; • SDK = Ambiente para desenvolvedores (JVM, compilador, debugger, etc).Orientação a Objetos com Java Pág: 14
  • 15. Coleta de Lixo • Memória alocada que não é mais utilizada deve ser liberada; • Em outras linguagens, desalocar memória é responsabilidade do programador; • Java provê um mecanismo que monitora e libera memória; • Garbage Collector: – Checa e libera memória que não é mais utilizada; – Acontece automaticamente – não é necessário disparar um processo; – Pode variar enormemente entre JVMs.Orientação a Objetos com Java Pág: 15
  • 16. Coleta de LixoOrientação a Objetos com Java Pág: 16
  • 17. Coleta de LixoOrientação a Objetos com Java Pág: 17
  • 18. SegurançaOrientação a Objetos com Java Pág: 18
  • 19. Segurança • JRE – Java Runtime Enviroment tem três tarefas básicas: – Ler o bytecode Java; – Verificar seu código • Código compatível com a especificação? • Código não viola a integridade do sistema? • Estouro de pilha (stack overflow ou underflow)? • Tipos de parâmetros incorretos? • Conversão de tipos ilegais? – Executar o código.Orientação a Objetos com Java Pág: 19
  • 20. Fazendo funcionar HelloWorld.java public class HelloWorld { public static void main( String args[] ) { System.out.println( “Hello, World” ); } }Orientação a Objetos com Java Pág: 20
  • 21. Fazendo funcionarOrientação a Objetos com Java Pág: 21
  • 22. Exercício • Primeiro, instalar o JDK; • Digitar o código do slide anterior e salvá-lo em um arquivo chamado HelloWorld.java; • Compilar o código javac HelloWorld.java • Executar o código 30 minutos java HelloWorldOrientação a Objetos com Java Pág: 22
  • 23. Onde Pesquisar? • http://java.sun.com/docs/books/tutorial/getS tarted/cupojava/index.html • http://java.sun.com/docs/white/platform/jav aplatformTOC.doc.html • http://java.sun.com/docs/overviews/java/jav a-overview-1.htmlOrientação a Objetos com Java Pág: 23
  • 24. Módulo II Identificadores, Keywords e tiposOrientação a Objetos com Java Pág: 24
  • 25. Comentários • Existem três estilos possíveis de comentários em Java: // Comentário de uma linha /* Comentário de várias linhas */ /** Comentário de documentação */Orientação a Objetos com Java Pág: 25
  • 26. Comentários • Particularmente, o comentário de documentação… /** Comentário de documentação */ …é útil para documentar funcionalidades no código. • Essas funcionalidades podem ser extraídas automaticamente do código fonte para gerar documentações em HTML – utilitário JavaDoc.Orientação a Objetos com Java Pág: 26
  • 27. Blocos de código e uso do “;” • Um statement é uma linha de código terminada por uma “;” total = a + b + c; • Um bloco de código é delimitado por chaves { total = a + b + c; }Orientação a Objetos com Java Pág: 27
  • 28. Palavras chave no Java • A linguagem Java possui 51 palavras chave/reservadas:Orientação a Objetos com Java Pág: 28
  • 29. Tipos primitivos • Java possui 8 tipos primitivos: boolean char byte short int long float doubleOrientação a Objetos com Java Pág: 29
  • 30. Tipos primitivos • Tipos primitivos e seus tamanhos * Em java, booleanos só podem receber valores true e false.Orientação a Objetos com Java Pág: 30
  • 31. Tipos primitivos Em Java, strings não são tipos primitivos, são objetos! • String a = “SoftSite”; • Literais: “”, “Hello”, “World”; • Concatenação: “Hello” + “World” = “HelloWorld”; • Conversão Implícita: “Hello” + 2001 = “Hello2001”; • Comparação de Strings: a.equals(b) ; • Tamanho de uma String: a.length() ;Orientação a Objetos com Java Pág: 31
  • 32. Variáveis, declarações e atribuições 1 public class Atribuicao { 2 public static void main(String args []) 3 { 4 int x, y; // declara uma variável inteira 5 float z = 3.414f;// declara e atribui um float 6 double w = 3.1415;// declara e atribui um double 7 boolean truth = true;// declara e atribui um boolean 8 char c;// declara uma variável char 9 String str;// declara uma String 10 String str1 = "SoftSite";// declara e associa uma String 11 c = S;// declara e associa um char 12 str = “Hello World!";// declara e associa uma String 13 x = 6; 14 y = 1000;// Associa uma valor a um int 15 ... 16 } 17 }Orientação a Objetos com Java Pág: 32
  • 33. Java Coding Conventions • Java é case sensitive; • Só por essa razão temos um bom motivo para padronizarmos como deveremos escrever nossos códigos; • Além de tudo é uma boa prática toda a equipe escrever da mesma forma – aumenta o entendimento e organização; • Existe um documento formal da SUN que determinada esse padrão.Orientação a Objetos com Java Pág: 33
  • 34. Java Coding Conventions • Classes e Interfaces class MinhaClasse interface MinhaInterface • Métodos e Variáveis double valorSalarioMensal calcularSalario() • Constantes DIAS_EXPIRACAO_SENHA MAX_SIZEOrientação a Objetos com Java Pág: 34
  • 35. Variáveis e escopo • Variáveis local – Declaradas dentro de um bloco de código { }; – Criadas quando o bloco de código inicia, destruídas quando ele acaba; – DEVEM ser inicializadas ou o compilador emitirá um erro! public static void main( String args[] ) { int a = 10; }Orientação a Objetos com Java Pág: 35
  • 36. Variáveis e escopo • Variáveis de instância – Declaradas no escopo da classe – visíveis para todos os métodos public class HelloWorld { int a = 10; }Orientação a Objetos com Java Pág: 36
  • 37. Variáveis e escopo • Variáveis de classe (continuação) – São automaticamente inicializadasOrientação a Objetos com Java Pág: 37
  • 38. Expressões lógicas • Operadores booleanos ! = NOT & = AND | = OR ^ = XOR • Operadores a nível de bit ~ = Complemento & = AND | = OR ^ = XOROrientação a Objetos com Java Pág: 38
  • 39. Expressões lógicas • Operadores curto circuito && = AND || = OR • Exemplo: String s = null; if ( ( s != null ) && ( s.length() > 10 ) // faça alguma coisa aqui!Orientação a Objetos com Java Pág: 39
  • 40. Concatenação de Strings • O operador +, concatena Strings produzindo uma nova String String a = “SoftSite ” + “Tecnologia”; String b = “SoftSite “ + 1; String c = 1 + “SoftSite”; String d = 1 + 1 + “SoftSite”; String e = “SoftSite” + 1 + 1;Orientação a Objetos com Java Pág: 40
  • 41. Operador Rigth Shift • Operações binárias de deslocamento para direita podem usar o operador >> 128 >> 1; // Retorna 128/21 = 64 256 >> 4; // Retorna 256/24 = 16 -256 >> 4;// Retorna -256/24 = -16 (O bit do sinal é preservado utilizando o >>) • O operador >>> é o correspondente a >> sem considerar o sinal.Orientação a Objetos com Java Pág: 41
  • 42. Operador Left Shift • Deslocamento para esquerda 128 << 1; // Retorna 128*21 = 256 256 << 4; // Retorna 256*24 = 4096 -256 << 4;// Retorna -256/24 = -4096Orientação a Objetos com Java Pág: 42
  • 43. Casting • Se existe perda de precisão em uma atribuição é necessário fazer uma conversão explicitamente: long longValue = 99L; int intValue2 = (int)longValue; // Ok! int intValue1 = longValue; // ERRO!Orientação a Objetos com Java Pág: 43
  • 44. Casting • Java também pode “promover” o tipo de uma expressão automaticamente para um tipo maior: long longValue; int intValue = 10; longValue = intValue;Orientação a Objetos com Java Pág: 44
  • 45. Expressões condicionais if statement if ( expressao boolean ) facaAlgumaCoisa(); if ( expressao boolean ) { facaoAlgumaCoisa(); } else { facaOutraCoisa(); }Orientação a Objetos com Java Pág: 45
  • 46. Expressões condicionais switch statement switch( expressao ) { case 1 : facaoAlgumaCoisa(); break; case 2 : facaOutraCoisa(); break; default : facaQualquerCoisa(); break; }Orientação a Objetos com Java Pág: 46
  • 47. Iteração for statement for( inicializacao; teste; incremento ) { trabalhe(); } Exemplo: for( int i = 0; i < 10; i++ ) { System.out.println( “SoftSite Tecnologia” ); }Orientação a Objetos com Java Pág: 47
  • 48. Iteração while statement while( teste ) { trabalhe(); } Exemplo: while( true ) { System.out.println( “SoftSite Tecnologia” ); }Orientação a Objetos com Java Pág: 48
  • 49. Iteração do while statement do { trabalhe(); } while( teste ) Exemplo: do { System.out.println( “SoftSite Tecnologia” ); } while( true )Orientação a Objetos com Java Pág: 49
  • 50. Controle Iteração • break [label]; • continue [label]; • label : código.Orientação a Objetos com Java Pág: 50
  • 51. Controle Iteração • break [label]; • continue [label]; • label : código. do do { { trabalhe(); trabalhe(); break; continue; } while( true ) } while( true )Orientação a Objetos com Java Pág: 51
  • 52. Exercício • A série de fibonacci é formada pela seqüência 1, 1, 2, 3, 5, 8, 13, ... Escreve uma programa que gere a série de fibonacci até o vigésimo termo. • Faça um programa para calcular o fatorial de um número lido do teclado (para ler um número do teclado use a classe Keyboard fornecida no seu material). ~45 minutosOrientação a Objetos com Java Pág: 52
  • 53. Onde Pesquisar? • Livro Thinking in Java – Capítulo 2 • Tópico: “Special case: primitive types” • Tópico: “Comments and embedded documentation” – Capítulo 3Orientação a Objetos com Java Pág: 53
  • 54. Módulo III Orientação a objetosOrientação a Objetos com Java Pág: 54
  • 55. Orientação a objetos • Orientação a objetos é uma técnica para modelagem de sistemas; • A O.O. contrasta da programação convencional na qual a estrutura e os dados são fracamente acoplados; • O.O. é um paradigma antigo e maduro e continua sendo a técnica do momento.Orientação a Objetos com Java Pág: 55
  • 56. Orientação a objetos • Forma de abstrair o problema – divide & conquer; • Comportamento e dados fortemente acoplados; • Abstrações próximas do mundo real. O.O. ProceduralOrientação a Objetos com Java Pág: 56
  • 57. Orientação a objetos Allan Kay, um dos criadores do SmallTalk: • Tudo são objetos; • Um programa é um grupo de objetos enviando mensagens uns aos outros.Orientação a Objetos com Java Pág: 57
  • 58. Orientação a objetos Um objeto é qualquer coisa, real ou abstrata, na qual nós armazenamos dados e as operações que manipulam os dados [ Martin ]Orientação a Objetos com Java Pág: 58
  • 59. Orientação a objetos • Exemplos de objetos: Conta Corrente Nota Fiscal Produto Cliente PedidoOrientação a Objetos com Java Pág: 59
  • 60. Orientação a objetos Declarando objetos em Java • É necessário criar um novo tipo (classe) public class MyDate { int day; int month; int year; }Orientação a Objetos com Java Pág: 60
  • 61. Orientação a objetos ...Declarando objetos em Java • Declarar uma variável do tipo MyDate dataAniversario; • Acessar o objeto dataAniversario.day = 25; dataAniversario.month = 05; dataAniversario.year = 1975;Orientação a Objetos com Java Pág: 61
  • 62. Orientação a objetos • Porém, é importante saber que tipos primitivos em java alocam espaço na memória quando são declarados; • Objetos NÃO alocam espaço em memória quando são declarados; • Variáveis declaradas do tipo do objeto não contém o dado e sim um ponteiro para o dado.Orientação a Objetos com Java Pág: 62
  • 63. Orientação a objetos MyDate today; today ????Orientação a Objetos com Java Pág: 63
  • 64. Orientação a objetos MyDate today; today = new MyDate(); 0x1402bc84 today day = 0; month = 0; year = 0;Orientação a Objetos com Java Pág: 64
  • 65. Orientação a objetos MyDate today; today = new MyDate(); today.day = 25; today.month = 05; today.year = 2003; 0x1402bc84 today day = 25; month = 5; year = 2003;Orientação a Objetos com Java Pág: 65
  • 66. Orientação a objetos MyDate today; today = new MyDate(); today.day = 25; today.month = 05; 0x852ef8b today.year = 2003; day = 0; month = 0; today = new MyDate(); year = 0; 0x1402bc84 today day = 25; month = 5; year = 2003;Orientação a Objetos com Java Pág: 66
  • 67. Orientação a objetos • Classes podem ter propriedades (como vimos nos slides anteriores – year, month, day); • E também podem ter procedimentos public class MyDate { int day; int month; int year; public String toString() { return day + “/” + month + “/” year; } }Orientação a Objetos com Java Pág: 67
  • 68. Orientação a objetos • Métodos podem ou não ter retorno public class MyDate { int day; int month; int year; public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } }Orientação a Objetos com Java Pág: 68
  • 69. Orientação a objetos • Podem receber argumentos public class MyDate { int day; int month; int year; public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } public void incrementarDias( int numDias ) { day += numDias; } }Orientação a Objetos com Java Pág: 69
  • 70. Orientação a objetos • Podem ter o mesmo nome e diferentes argumentos (overloading) public class MyDate { int day; int month; int year; public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } public void incrementarAno( int numAnos ) { year = year + numAnos; } public void incrementarDias( int numDias ) { day += numDias; } }Orientação a Objetos com Java Pág: 70
  • 71. Orientação a objetos • Podem ter construtores public class MyDate { int day; int month; int year; public MyDate() Construtores são métodos especiais chamados quando o objeto é { year = 2003; } instanciado public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } public void incrementarAno( int numAnos ) { year = year + numAnos; } public void incrementarDias( int numDias ) { day += numDias; } }Orientação a Objetos com Java Pág: 71
  • 72. Orientação a objetos • E construtores podem também ter parâmetros public class MyDate { int day; int month; int year; public MyDate(int anoInicial) { year = anoInicial; } public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } public void incrementarAno( int numAnos ) { year = year + numAnos; } public void incrementarDias( int numDias ) { day += numDias; } }Orientação a Objetos com Java Pág: 72
  • 73. Exercício • Crie uma classe chamada ContaCorrente que contém as seguintes características: – Propriedades: numero (String), saldo (double) – Métodos: debitar e creditar recebendo um parâmetro double e fazendo a devida operação com o saldo; getSaldo retornando o saldo da conta – Construtor: Recebendo o número da conta e o saldo inicial – Para testar, declare uma classe chamada Banco e chame os métodos da classe ContaCorrente 30 minutos (Nome dos arquivos gerados – ContaCorrente.java e Banco.java)Orientação a Objetos com Java Pág: 73
  • 74. Encapsulamento • Encapsulamento, consiste em separar os aspectos externos de um objeto, que são acessíveis para outros objetos, dos detalhes internos de implementação do objeto [ Rumbaugh ]; • Qualquer mecanismo que nos permita “esconder” a implementação do objeto fazendo com que outros componentes do sistema não tenham conhecimento do conteúdo interno dos dados armazenados no objeto [ Yourdon ]; • É o resultado (ou ato) de se esconder os detalhes de implementação de um objeto do usuário [ Martin ];Orientação a Objetos com Java Pág: 74
  • 75. EncapsulamentoOrientação a Objetos com Java Pág: 75
  • 76. Encapsulamento • Information hiding; • A comunicação entre objetos é feita através de mensagens enviadas para as operações; • A implementação de um objeto pode ser mudada sem afetar as aplicações que o usam; • Facilidade de manutenção;Orientação a Objetos com Java Pág: 76
  • 77. Encapsulamento Encapsulamento Métodos públicos Atributos públicos Métodos privados Atributos privadosOrientação a Objetos com Java Pág: 77
  • 78. Encapsulamento - Visibilidade • Public: permite acesso a partir de qualquer classe; • Private: permite acesso apenas na própria classe; • Protected: permite acesso apenas a objetos da mesma classe e de suas sub- classes; • Package: permite acesso a todas as classes do mesmo pacote;Orientação a Objetos com Java Pág: 78
  • 79. Encapsulamento - Visibilidade public class MyDate { private int day; private int month; private int year; public MyDate(int anoInicial) { year = anoInicial; } public String toString() { return day + “/” + month + “/” year; } public void incrementarAno() { year++; } public void incrementarAno( int numAnos ) { year = year + numAnos; } public void incrementarDias( int numDias ) { day += numDias; } }Orientação a Objetos com Java Pág: 79
  • 80. Encapsulamento - Visibilidade Consequências de tornar um atributo privado • Tentar acessar um componente privado (de fora da classe) resulta em erro de compilação; • Mas como torná-lo acessível apenas para consulta (leitura)? • Isto é possível definindo-se um método que retorna o atributo (na própria classe onde o atributo se encontra);Orientação a Objetos com Java Pág: 80
  • 81. Encapsulamento - Visibilidade public class MyDate { private int day; private int month; private int year; public int getDay() { return day; } public void setDay( int newDay ) { day = newDay; } public int getMonth() { return month; } public void setMonth( int newMonth ) { month = newMonth; } ... }Orientação a Objetos com Java Pág: 81
  • 82. Encapsulamento - Visibilidade • Todas as vezes que você quiser ler uma propriedade defina um método getNomePropriedade • Caso o atributo seja boolean use isNomePropriedade • Para alterar uma propriedade declare um método setNomePropriedade • Esse padrão (get, set e is) é apenas uma convenção de nome.Orientação a Objetos com Java Pág: 82
  • 83. Encapsulamento - Visibilidade Dica • É uma boa prática de programação definir as propriedades de objetos sempre como private.Orientação a Objetos com Java Pág: 83
  • 84. Exercício • Altere a classe ContaCorrente declarando os atributos saldo e numero como private e definindo os métodos setSaldo, getNumero e setNumero 30 minutos (Nome do arquivo envolvido – ContaCorrente.java)Orientação a Objetos com Java Pág: 84
  • 85. Propriedades estáticas • Propriedades estáticas são compartilhadas por todas as instâncias de uma classe; • Podem ser acessadas sem necessitar instanciar um novo objeto (pois referem-se à classe e não a um objeto).Orientação a Objetos com Java Pág: 85
  • 86. Propriedades estáticas public class Conta { static int contador; public Conta() { contador++; } } public class Banco { public static void main( String args[] ) { System.out.println( Conta.contador ); } }Orientação a Objetos com Java Pág: 86
  • 87. Métodos estáticos • Métodos também podem ser static; • Operações relativas a toda a classe e não a um objeto; public class Empregado { public void aumentarSalario() { ... } public static void feriasColetivas() { ... } }Orientação a Objetos com Java Pág: 87
  • 88. Inicializadores estáticos • Uma classe pode conter um bloco static que não pertence a nenhum método; • Esse código é executado apenas uma vez quando a classe é lidaOrientação a Objetos com Java Pág: 88
  • 89. Inicializadores estáticos public class Demo { static int i; static { System.out.println( “<<Static block de Demo>>” ); } } public class Show { public static void main( String args[] ) { System.out.println( Demo.i ); } }Orientação a Objetos com Java Pág: 89
  • 90. Propriedades Final • Não podem ser alterados; • Utilizado para determinar constantes. // atributo final public final int a = 10; // variável estática final public static final string nome = “Softsite”;Orientação a Objetos com Java Pág: 90
  • 91. Onde Pesquisar? • Livro Thinking in Java – Capítulo 1 • Até o tópico: “The hidden implementation” – Capítulo 2 – Capítulo 5 • A partir do tópico: “Java access specifiers” – Capítulo 6 • Tópico: “The final keyword”Orientação a Objetos com Java Pág: 91
  • 92. Módulo IV ArraysOrientação a Objetos com Java Pág: 92
  • 93. Declarando Arrays • Grupo de dados do mesmo tipo; • É possível declarar arrays de objetos e tipos primitivos: char s[]; ContaCorrente contas[]; • Arrays são objetos e se comportam como tal, ou seja, são ponteiros; • Quando um array é declarado, todos os seus elementos são automaticamente inicializados com seus valores padrão.Orientação a Objetos com Java Pág: 93
  • 94. Criando Arrays • Use new para criar novos arrays: char s[] = new char[20]; ContaCorrente[] c = new ContaCorrente[10]; s[0] = ‘A’; c[9] = new ContaCorrente( “100”, 5075.12 );Orientação a Objetos com Java Pág: 94
  • 95. Criando Arrays • Declare e instancie um array char c[] = { ‘R’, ‘F’, ‘M’ }; String s[] = { “SoftSite”, “Tecnologia” };Orientação a Objetos com Java Pág: 95
  • 96. Referenciando arrays • Todos os arrays começam pelo índice zero; • A propriedade length informa o tamanho do array; String s[] = { “SoftSite ”, “Tecnologia” }; for( int i = 0; i < s.length; i++ ) { System.out.print( s[i] ); }Orientação a Objetos com Java Pág: 96
  • 97. Redimensionando Arrays • Não é possível redimensionar Arrays em Java; • Caso isso seja necessário, deveremos usar outros tipos em java (veremos adiante nesse curso).Orientação a Objetos com Java Pág: 97
  • 98. Operações com Arrays • Para copiar um array para outro System.arraycopy( src[], start, dest[], posIniDest, length ) • Para ordenar um array java.util.Arrays.sort( array ); • Comparar dois arrays java.util.Arrays.equals( src, dest ); • Realizar uma busca binária (o array deve estar ordenado) java.util.Arrays.binarySearch( array, key );Orientação a Objetos com Java Pág: 98
  • 99. Exercício • Altere a classe Banco para receber várias contas (em um laço) e armazene as contas recebidas em um array de Strings. Use uma constante para definir o número de elementos do seu array. Depois de receber todos as contas, ordene o array e imprima-o no vídeo. ~45 minutos (Nome do arquivo envolvido – Banco.java)Orientação a Objetos com Java Pág: 99
  • 100. Onde Pesquisar? • Livro Thinking in Java – Capítulo 11 • Tópico: “Arrays”Orientação a Objetos com Java Pág: 100
  • 101. Módulo V Ponteiros, referências e listasOrientação a Objetos com Java Pág: 101
  • 102. Passagem por valor e Ponteiros • Em java a passagem, sempre é por valor; • Modificações no parâmetro formal não são refletidas no parâmetro real; • Uma expressão pode ser usada como parâmetro; • Ineficiência em alguns casos (cópia).Orientação a Objetos com Java Pág: 102
  • 103. Passagem por valor e Ponteiros class PassagemPorValor { private static void incrementa (int x) { x = x + 1; System.out.println (“x = ” + x); } public static void main (String [] args) { int y = 1; System.out.println(“y = ” + y); incrementa (y); System.out.println(“y = ” + y); } }Orientação a Objetos com Java Pág: 103
  • 104. Relembrando... MyDate today; today = new Date(); today.day = 25; 0x852ef8b today.month = 05; day = 0; today.year = 2003; month = 0; today = new Date(); year = 0; 0x1402bc84 today day = 25; month = 5; year = 2003;Orientação a Objetos com Java Pág: 104
  • 105. Passagem por valor e Ponteiros public static void main( String args[] ) { MyDate today; today = new MyDate(); funcao(today); System.out.println( today.getMonth() ); 0x852ef8b } day = 0; month = 10; month = 0; void funcao( MyDate d ) year = 0; { d.setMonth( 10 ); } todayOrientação a Objetos com Java Pág: 105
  • 106. Passagem por valor e Ponteiros • O “fenômeno” do slide anterior é conhecido como aliasing; • Apesar da passagem por parâmetros em Java ser por valor, pode-se ter aliasing quando um objeto é passado como parâmetro; • É sempre a referência (ponteiro) de um objeto que é passada como parâmetro e não o objeto em si.Orientação a Objetos com Java Pág: 106
  • 107. Passagem por valor e Ponteiros public static void main( String args[] ) { MyDate today; today = new MyDate(); 0x852ef8b today.setDay(25); day = 25; f( today ); month = 0; year = 0; System.out.println( today.getDay()); } public void f( MyDate f ) { 0x1402bc84 today f = new MyDate(); day = 30; f.setDay( 30 ); month = 0; f year = 0; }Orientação a Objetos com Java Pág: 107
  • 108. Listas • Como vimos anteriormente, arrays em java não podem ser redimensionados; • Java oferece uma série de estruturas de listas dinâmicas; • As mais utilizadas: – ArrayList  Arrays dinâmicos – Vector  Arrays dinâmicos sincronizados – HashMap  Arrays que podem ser pesquisados – HashTable  Igual a HashMap, porém sincronizadosOrientação a Objetos com Java Pág: 108
  • 109. ArrayList • Exemplo: import java.util.*; public void foo() { ArrayList al = new ArrayList(); al.add( “SoftSite” ); al.add( “Tecnologia” ); }Orientação a Objetos com Java Pág: 109
  • 110. ArrayList • O método add é utilizado para adicionar elementos no ArrayList; • Diferente dos arrays tradicionais do Java, um ArrayList não tem um tipo determinado, ou seja, o primeiro elemento pode ser de um tipo diferente do segundo elemento; • Porém, todos os elementos devem ser objetos – tipos primitivos não são permitidos.Orientação a Objetos com Java Pág: 110
  • 111. Wrappers • Para adicionar tipos primitivos é preciso “empacotá-los” em objetos; • Em Java existem classes empacotadoras (wrappers) úteis para realizar esse tipo de operação; • Cada tipo primitivo possui um wrapper correspondente.Orientação a Objetos com Java Pág: 111
  • 112. Wrappers boolean Boolean byte Byte char Character short Short int Integer long Long float Float double DoubleOrientação a Objetos com Java Pág: 112
  • 113. ArrayList • Exemplo: import java.util.*; public void foo() { ArrayList al = new ArrayList(); al.add( new Integer(1) ); al.add( new Double(2) ); al.add( new Float(3) ); }Orientação a Objetos com Java Pág: 113
  • 114. ArrayList • Para recuperar os elementos de um ArrayList utiliza-se o método get( elemento ); • O tamanho de um ArrayList é obtido com size(). public class Demo { public void print( ArrayList al ) { for( int i = 0; i < al.size(); i++ ) { System.out.println( al.get(i) ); } } }Orientação a Objetos com Java Pág: 114
  • 115. ArrayList • O método get( pos ) retorna um Object, pode ser necessário realizar conversões (casts): public class Demo { public void print( ArrayList al ) { for( int i = 0; i < al.size(); i++ ) { ContaCorrente c = (ContaCorrente)al.get(i); } } }Orientação a Objetos com Java Pág: 115
  • 116. ArrayList Principais métodos do ArrayList • clear()  Remove todos os elementos do array; • int indexOf( Object )  Retorna a primeira ocorrência do elemento; • boolean contains( Object )  Verifica se o elemento existe; • remove( int )  Remove um elemento da lista; • clone()  Retorna uma cópia do array • isEmpty()  Testa se o array está vazio.Orientação a Objetos com Java Pág: 116
  • 117. HashMap • HashMap é um tipo de lista voltado para pesquisas; • Você quer acessar a lista seqüencialmente? Use um ArrayList; • Você quer acessar a lista aleatoriamente, utilizando uma chave de busca? Use HashMap.Orientação a Objetos com Java Pág: 117
  • 118. HashMap • Exemplo: import java.util.*; public void foo() { HashMap hm = new HashMap(); Conta c1 = new Conta( “123”, 5000 ); Conta c2 = new Conta( “321”, 2500 ); hm.put( c1.getNumero(), c1 ); hm.put( c2.getNumero(), c2 ); }Orientação a Objetos com Java Pág: 118
  • 119. HashMap • O método put é utilizado para adicionar elementos no HashMap; • Use put( chave, valor ), onde chave é o elemento que poderá se buscado no HashMap. • Exemplo: // Recuperar a conta 123 ContaCorrente c = (ContaCorrente)hm.get( “123” )Orientação a Objetos com Java Pág: 119
  • 120. HashMap • Duplicações não são permitidas em um Hash: HashMap hm = new HashMap(); hm.put( “1”, “SoftSite” ); hm.put( “1”, “Tecnologia” ); System.out.println( hm.get(“1” ) );Orientação a Objetos com Java Pág: 120
  • 121. HashMap Principais métodos do HashMap • clear()  Remove todos os elementos do HashMap; • boolean containsKey( Object )  Verifica se a chave existe; • boolean containsValue( Object )  Verifica se o elemento existe; • remove( Object )  Remove um elemento do HashMap; • clone()  Retorna uma cópia do HashMap; • isEmpty()  Testa se o HashMap está vazio; • size()  Retorna o tamanho de um HashMap.Orientação a Objetos com Java Pág: 121
  • 122. Exercício • Altere a classe Banco para trabalhar com ArrayList ao invés de Arrays e armazer instâncias de Contas; • A classe Banco deverá ter os seguintes métodos: adicionarConta( ContaCorrente c ) // Adicionar uma nova conta ContaCorrente obterConta( String numConta ) // Recupera uma conta removerConta( ContaCorrente c ) // Remove uma conta exibirContas() // Lista as contas na tela • Teste-a declarando um método main que recebe dados do teclado e realiza a operação correspondente. 45 minutos (Nome dos arquivos envolvidos – Banco.java e ContaCorrente.java)Orientação a Objetos com Java Pág: 122
  • 123. Onde Pesquisar? • Livro Thinking in Java – Capítulo 11 • A partir do tópico: “Introduction to containers” – Apêndice A • Até o tópico: “Pass by value”Orientação a Objetos com Java Pág: 123
  • 124. Módulo VI Herança e ligação dinâmicaOrientação a Objetos com Java Pág: 124
  • 125. Herança - Motivação • Seria interessante que o nosso “banco” oferecesse outros tipos de conta? • Poderíamos imaginar contas corrente, contas poupança e contas especiais; • Qual seria a diferença entre essas contas?Orientação a Objetos com Java Pág: 125
  • 126. Herança - Motivação Conta Corrente  Métodos: Creditar, Debitar, getSaldo, getNumero, setNumero Propriedades: saldo, numero Conta Poupança  Métodos: Creditar, Debitar, getSaldo, getNumero, setNumero, render juros Propriedades: saldo, numero Conta Especial  Métodos: Creditar, Debitar, getSaldo, getNumero, setNumero, getLimite, setLimiteOrientação a Objetos com Java Pág: 126
  • 127. Herança - Motivação • Em uma programação tradicional, teríamos que definir diversas vezes os métodos que são comuns as classes ContaCorrente, ContaPoupanca e ContaEspecial; • O reaproveitamento de código se basearia no Copy & Paste; • Quando um desses métodos precisar ser alterado, todas as classes correspondentes precisarão ser alteradas; • Manutenção = Difícil!Orientação a Objetos com Java Pág: 127
  • 128. Herança • Herança é o compartilhamento de atributos e operações entre as classes baseado em uma relação hierárquica [ Rumbaugh ]; • Herança é qualquer mecanismo que permite a um objeto incorporar toda ou parte da definição de outro objeto como parte de sua própria definição [ Yourdon ].Orientação a Objetos com Java Pág: 128
  • 129. Herança - Vantagens • Permite o reuso de código; • Facilita a manutenção; • Um bom projeto acaba com o “reaproveitamento” Copy & Paste.Orientação a Objetos com Java Pág: 129
  • 130. Herança - Terminologias • Super-Classe e Sub-Classe; • Classe Pai e Classe Filho; • Classe Base e Classe Derivada; • Generalização e Especialização;Orientação a Objetos com Java Pág: 130
  • 131. Herança – Representação UMLOrientação a Objetos com Java Pág: 131
  • 132. Herança • Objetos da sub-classe comportam-se como objetos da super-classe; ContaPoupanca poupanca = new ContaPoupanca(); ContaCorrente conta = poupanca; conta.creditar( 1000 ); poupanca.debitar( 500 );Orientação a Objetos com Java Pág: 132
  • 133. Herança • Objetos da sub-classe podem ser usados no lugar de objetos da super-classe ContaPoupanca poupanca = new ContaPoupanca(); foo( poupanca ); void foo( ContaCorrente c ) { c.creditar( 2500 ); }Orientação a Objetos com Java Pág: 133
  • 134. Herança • Algumas operações da super-classe podem ser redefinidas na sub-classe (extensibilidade); • Um bom exemplo disso é a classe conta especial, onde o método de debitar deverá testar se o saldo e o limite de crédito não foram excedidos (na conta corrente só é considerado o saldo); • Estamos especializando o método debitar.Orientação a Objetos com Java Pág: 134
  • 135. Herança IMPORTANTE • Java só suporta herança simples, ou seja, uma classe só pode herdar de uma única outra classe – só pode ter um pai.Orientação a Objetos com Java Pág: 135
  • 136. Herança • Para definir a herança em java usa-se a palavra reservada “extends”; • Subclasse “extends” Superclasse ; public class ContaPoupanca extends ContaCorrente { ... }Orientação a Objetos com Java Pág: 136
  • 137. Herança • Atributos e métodos privados são herdados, mas não podem ser acessados diretamente – métodos get, set e is; • Qualificador protected: visibilidade restrita à classe e às subclasses; • Construtores não são herdados; • Os métodos da classe pai podem ser acessados através da keyword super (super.metodo() ou super() caso seja um construtor).Orientação a Objetos com Java Pág: 137
  • 138. Herança [public] class <nome da classe> [ extends <classe pai> ] { [ public/protected/private] [final] [static] <DADOS> [ public/protected/private] [final] [static] [abstract] <MÉTODOS> }Orientação a Objetos com Java Pág: 138
  • 139. Herança – Definição da ContaCorrente public class ContaCorrente { private String numero; protected double saldo; public ContaCorrente( String numero, double saldo ) { this.numero = numero; this.saldo = saldo; } public void creditar( double valor ) { saldo += valor; } public void debitar( double valor ) { if ( saldo >= valor ) { saldo -= valor; } } ... (métodos get e set) }Orientação a Objetos com Java Pág: 139
  • 140. Herança - Definição da ContaPoupanca public class ContaPoupanca extends ContaCorrente { private final double TAXA_JUROS = 0.01; public void renderJuros() { double juros = (getSaldo() * (TAXA_JUROS) ); creditar( juros ); } }Orientação a Objetos com Java Pág: 140
  • 141. Herança – Redefinição de métodos • A redefinição de métodos ocorre quando uma classe define um método usando o mesmo nome, tipo de retorno e argumentos de um método da super- classe. class A { String f( ) { return “Classe A” ; } } class B extends A { String f( ) { return “Classe B”; } }Orientação a Objetos com Java Pág: 141
  • 142. Herança – Redefinição de métodos public class Override_Test { public static void main ( String args [ ] ) { B b = new B (); System.out.println (b.f()); // Imprime Classe B A a = new A(); System.out.println ( a.f()); // Imprime Classe A a = (A)b; System.out.println ( a.f()); // Imprime Classe B } }Orientação a Objetos com Java Pág: 142
  • 143. Herança – Redefinição de métodos • Invariância: tipos dos argumentos e resultados da redefinição têm que ser iguais aos tipos da definição; • Semântica e visibilidade dos métodos redefinidos deve ser preservada (a visibilidade pode ser aumentada); • private  package  protected  public • Só é possível acessar a definição dos métodos da superclasse imediata (via super).Orientação a Objetos com Java Pág: 143
  • 144. Herança – Redefinição de métodos • Invocando métodos redefinidos class A { String f( ) {System.out.println( “Classe A” ); return “Classe A” ; } } class B extends A { String f( ) { super.f(); System.out.println( “Classe B” ); return “Classe B”; } }Orientação a Objetos com Java Pág: 144
  • 145. Herança – Redefinição de métodos public class Override_Test { public static void main ( String args [ ] ) { B b = new B (); // Imprime Classe A e Classe B System.out.println (b.f()); A a = new A(); // Imprime Classe A System.out.println ( a.f()); A a = (A)b; // Imprime Classe A e Classe B System.out.println ( a.f()); } }Orientação a Objetos com Java Pág: 145
  • 146. Herança – Definição da ContaEspecial public class ContaEspecial extends ContaCorrente { private final double LIMITE_CREDITO = 1000; public void debitar( double valor ) { if ( saldo+LIMITE_CREDITO >= valor ) { saldo -= valor; } } }Orientação a Objetos com Java Pág: 146
  • 147. Herança • Comportamento – Objetos da subclasse comportam-se como os objetos da superclasse • Substituição – Objetos da subclasse podem ser usados no lugar de objetos da superclasseOrientação a Objetos com Java Pág: 147
  • 148. Herança • Substituição por subtipos ... ContaCorrente cc = new ContaPoupanca( “123”, 1000 ); cc.credito( 500 ); cc.debito( 200 ); System.out.println( cc.getSaldo() ); ...Orientação a Objetos com Java Pág: 148
  • 149. Herança • Verificação dinâmica ... ContaEspecial ce = new ContaEspecial( “123”, 1000 ); banco.adicionarConta( ce ); ContaCorrente cc = banco.obterConta( “123” ); cc.debitar( 1500 ); ...Orientação a Objetos com Java Pág: 149
  • 150. Herança • Verificação de tipos com instanceof ... ContaEspecial ce = new ContaEspecial( “123”, 1000 ); banco.adicionarConta( ce ); ContaCorrente cc = banco.obterConta( “123” ); if ( cc instanceof ContaEspecial ) { System.out.println(“Cuidado com o limite!” ); } ...Orientação a Objetos com Java Pág: 150
  • 151. Herança • Conversões (casts) ... ContaPoupanca cp = new ContaPoupanca( “123”, 1000 ); banco.adicionarConta( cp ); ContaCorrente cc = banco.obterConta( “123” ); ((ContaPoupanca)cc ).renderJuros(); ...Orientação a Objetos com Java Pág: 151
  • 152. Herança • Cuidado – casts podem gerar erros em tempo de execução! • O código abaixo compila, porém não funciona: ... ContaPoupanca cp = new ContaPoupanca( “123”, 1000 ); banco.adicionarConta( cp ); ContaCorrente cc = banco.obterConta( “123” ); ((ContaEspecial)cc ).creditar( 50 ); ...Orientação a Objetos com Java Pág: 152
  • 153. Herança • casts e instanceof: – ((Tipo) variável) – variável instanceof Tipo – O tipo de variável deve ser supertipo de tipo – casts geram exceções, instanceof retorna false – casts são essenciais para verificação estática de tipos (Compilação).Orientação a Objetos com Java Pág: 153
  • 154. Herança – Ligação dinâmica • Dois métodos com o mesmo nome e tipo: – Definição e redefinição, qual usar? • O código é escolhido dinamicamente (em tempo de execução), não estaticamente (em tempo de compilação); • Escolha é feita com base na classe do objeto associado à variável destino do métodoOrientação a Objetos com Java Pág: 154
  • 155. Exercício • Crie as classes ContaEspecial e ContaPoupanca; • Verifique se é necessário alterar a classe Banco para suportar os novos tipos de classe criados; • Permita ao usuário cadastrar os novos tipos de conta. ~45 minutos (Nome dos arquivos envolvidos – ContaEspecial.Java, ContaPoupanca.Java e Banco.java)Orientação a Objetos com Java Pág: 155
  • 156. Onde Pesquisar? • Livro Thinking in Java – Capítulo 6 – Capítulo 7 • Tópico: “Designing with inheritance” – Capítulo 10Orientação a Objetos com Java Pág: 156
  • 157. Módulo VII Classes AbstratasOrientação a Objetos com Java Pág: 157
  • 158. Classes Abstratas Um exemplo: • API para enviar mensagens – Voz; – e-mail; – Texto; – Fax...Orientação a Objetos com Java Pág: 158
  • 159. Classes Abstratas Como modelar? Message +play:void sender:String TextMessage VoiceMessage +TextMessage +VoiceMessage +play:void +play:voidOrientação a Objetos com Java Pág: 159
  • 160. Classes Abstratas • Classe Abstrata: – Classe parcialmente implementada. Composta por um ou mais métodos abstratos. – Tem como finalidade servir de base para a implementação do polimorfismo. • Método Abstrato: – Método não implementado.Orientação a Objetos com Java Pág: 160
  • 161. Classes Abstratas • Definição - Classes Abstratas – São classes que contêm métodos abstratos; – São identificadas pela palavra-chave abstract; – Podem possuir dados (atributos); – Podem herdar de classes abstratas e não abstratas; – São úteis no reuso.”Orientação a Objetos com Java Pág: 161
  • 162. Classes Abstratas • Métodos Abstratos: – São métodos sem implementação, identificados pela palavra-chave abstract; – Um método abstrato possui apenas sua assinatura seguida de “;” ; – Toda classe que possui um método abstrato é abstrata e deve ser declarada como tal; – Uma classe pode ser declarada abstrata mesmo que não possua métodos abstratos. Isso evita que se instanciem objetos dessa classe; – Uma classe abstrata não pode ser instanciada.Orientação a Objetos com Java Pág: 162
  • 163. Classes Abstratas • Métodos Abstratos: – Uma subclasse de uma classe abstrata só pode ser instanciada se sobrescrever todos os métodos abstratos da superclasse e implementá-los; – Se uma subclasse de uma classe abstrata não implementa todos os métodos abstratos da superclasse então a subclasse também é abstrata e deve ser declarada como tal.Orientação a Objetos com Java Pág: 163
  • 164. Classes Abstratas abstract public class Message { protected String sender; public abstract void play(); public String getSender() { return this.sender; } }Orientação a Objetos com Java Pág: 164
  • 165. Classes Abstratas • Métodos que não podem ser declarados como abstratos: – Construtores – Estáticos – PrivadosOrientação a Objetos com Java Pág: 165
  • 166. Classes Abstratas Implementando o objeto mensagem • Classes: – TextMessage; – VoiceMessage.Orientação a Objetos com Java Pág: 166
  • 167. Classes Abstratas - TextMessage public class TextMessage extends Message { protected String msg; public TextMessage( String sender, String msg ) { this.sender = sender; this.msg = msg; } public void play(){ System.out.println( "Sender name: " + sender + "n" + "Message: " + msg ); } }Orientação a Objetos com Java Pág: 167
  • 168. Classes Abstratas - VoiceMessage public class VoiceMessage extends Message { protected String fileName; public VoiceMessage( String sender, String fileName){ this.sender = sender; this.fileName = fileName; } public void play(){ try { java.net.URL u = new java.net.URL("file", "localhost",fileName); java.applet.AudioClip clip = java.applet.Applet.newAudioClip(u); clip.play(); } catch ( Exception e ) { System.out.println( "Erro --> " + e ); } } }Orientação a Objetos com Java Pág: 168
  • 169. Classes Abstratas • Para uma classe que herda de uma classe abstrata: – A subclasse deve implementar todos os métodos abstratos; ou – A subclasse deve continuar sendo abstrata. • Classes abstratas não podem ser instanciadas. • No caso das diferentes implementações de Message, cada uma deverá fornecer sua própria implementação para o método play().Orientação a Objetos com Java Pág: 169
  • 170. Exercício • Implemente uma nova classe, chamada ContaAbstrata. Essa classe deverá declarar os métodos creditar e debitar como abstract; • Faça com que a classe ContaCorrente herde da classe ContaAbstrata; • Altere as definições (defina novos métodos) da classe ContaAbstrata, tente compilar o código e verifique o que acontece. (Nome dos arquivos envolvidos – ContaCorrente.java e ContaAbstrata.java) 30 minutosOrientação a Objetos com Java Pág: 170
  • 171. Onde Pesquisar? • Livro Thinking in Java – Capítulo 7 • Tópico: “Abstract classes and methods”Orientação a Objetos com Java Pág: 171
  • 172. Módulo VIII Interfaces e PolimorfismoOrientação a Objetos com Java Pág: 172
  • 173. Estudo de Caso • Imagine a necessidade de implementarmos uma classe de ordenação; • Utilizando essa classe, gostaríamos de poder ordenar qualquer tipo de classe – ContaCorrente, ContaPoupanca, Cliente, Produtos, etc.Orientação a Objetos com Java Pág: 173
  • 174. Estudo de Caso • Implementaremos um algoritmo comum para ordenação – ShellSort; • Para que a ordenação funcione, temos que definir uma maneira de comparar dois objetos; • Para o nosso exemplo, o entendimento da rotina de ordenação é desnecessário.Orientação a Objetos com Java Pág: 174
  • 175. Estudo de Caso abstract class Sortable { public abstract int compareTo( Sortable b ); } Compara dois objetos e retorna: 1 – Maior; -1 – Menor; 0 - IgualOrientação a Objetos com Java Pág: 175
  • 176. Classe ShellSort class ShellSort { public static void sort( Sortable[] a ) { int n = a.length; int incr = n / 2; while ( incr >= 1 ) { for( int i = incr; i < n; i++ ) { Sortable temp = a[i]; int j = i; while( j >= incr && temp.compareTo(a[j-incr]) < 0 ) { a[j] = a[j - incr]; j -= incr; } a[j] = temp; } incr /= 2; } } }Orientação a Objetos com Java Pág: 176
  • 177. Estudo de Caso – Ordenando Contas • Para ordenar, todos os objetos deverão herdar de Sortable.Orientação a Objetos com Java Pág: 177
  • 178. Estudo de Caso – Ordenando Contas • E sobrescrever o método compareTo public class ContaCorrente extends ContaAbstrata { public int compareTo( Sortable b ) { ContaCorrente c = (ContaCorrente)b; if ( this.saldo < c.saldo ) return -1; if ( this.saldo > c.saldo ) return 1; return 0; }Orientação a Objetos com Java Pág: 178
  • 179. Estudo de Caso – Ordenando Contas Qual o problema dessa implementação?Orientação a Objetos com Java Pág: 179
  • 180. Estudo de Caso – Ordenando Contas • Vamos imaginar que agora, precisamos implementar uma classe para imprimir – vamos chamá-la de Printable; • Ela disponibilizará um único método – print(); • Como resolver esse problema?Orientação a Objetos com Java Pág: 180
  • 181. Estudo de Caso – Ordenando ContasOrientação a Objetos com Java Pág: 181
  • 182. Estudo de Caso – Ordenando Contas • E se só a classe ContaCorrente pudesse ser impressa? • Ela teria que herdar da classe Sortable, de forma que pudesse ser ordenada, e herdar também da classe Printable.Orientação a Objetos com Java Pág: 182
  • 183. Estudo de Caso – Ordenando ContasOrientação a Objetos com Java Pág: 183
  • 184. Estudo de Caso – Ordenando Contas • Porém, Java não permite herança múltipla (uma classe herdar de mais de uma classe); • O problema dessa implementação é que estamos usando a herança, que deveria herdar funcionalidades, para simplesmente forçar a implementação de um método; • Deveremos utilizar interfaces para resolver esse problema.Orientação a Objetos com Java Pág: 184
  • 185. Interfaces • Interface = Protótipo de uma classe; • As interefaces não tem implementação, somente possuem assinatura dos métodos; • Uma interface NÃO pode ser instanciada; • Interface pode possuir métodos e constantes; • Uma classe pode implementar uma ou mais interfaces, para isso, usamos a palavra chave implements.Orientação a Objetos com Java Pág: 185
  • 186. Implementando Interfaces [public] class <nome da classe> [ extends <classe pai> ] [ implements <interface1>, <interface2>, <interfacen> ] { [ public/protected/private] [final] [static] <DADOS> [ public/protected/private] [final] [static] [abstract] <MÉTODOS> }Orientação a Objetos com Java Pág: 186
  • 187. Interfaces • Uma classe pode ao mesmo tempo herdar de uma classe e implementar uma interface; • Uma classe pode implementar mais de uma interface; • Interface x Herança Múltipla • Herança de descrições e não de implementações. • Interfaces não possuem construtores; • Ao implementar uma interface a classe se obriga a implementar todos os métodos definidos na interface.Orientação a Objetos com Java Pág: 187
  • 188. Declarando Interfaces interface <identif> [extends <identif>] { <corpo_da_interface> }Orientação a Objetos com Java Pág: 188
  • 189. Declarando classes que implementam interfaces class <identif> [extends <identif>] [implements <interf1> [, <interf2>, ...] ] { <corpo_da_classe> }Orientação a Objetos com Java Pág: 189
  • 190. Interface Sortable interface Sortable { public int compareTo( Sortable b ); } class Conta extends ContaAbstrata implements Sortable { public int compareTo( Sortable b ){} ... } }Orientação a Objetos com Java Pág: 190
  • 191. Interfaces x Classes abstratas • Classes Abstratas • Interfaces – Agrupa objetos com – Agrupa objetos com implementações implementações compartilhadas; diferentes; – Define novas classes – Define novas através de herança; interfaces através de – Só podem ter como múltiplas supertipo uma outra implementações; classe. – Várias podem ser supertipo do mesmo tipo.Orientação a Objetos com Java Pág: 191
  • 192. Interfaces Quando usar interfaces e classes abstratas? • Em geral, utilizar interfaces é mais flexível; • Classes que já herdam de outra classe podem ser facilmente redesenhadas para implementar uma nova interface sem quebrar o código existente que a utilize.Orientação a Objetos com Java Pág: 192
  • 193. Interfaces - Exemplo • Vimos na aula sobre arrays que existe uma classe que faz a ordenação de arrays; • Essa classe é a Arrays, método sort. • A assinatura do método sort é: public static void sort( Object[] a) public static void sort( Object[] a, Comparator c )Orientação a Objetos com Java Pág: 193
  • 194. Interfaces - Exemplo • A segunda implementação do método sort, public static void sort( Object[] a, Comparator c ) Deve ser utilizada quando deseja-se especificar uma forma de comparar a classe para ordená-la.Orientação a Objetos com Java Pág: 194
  • 195. Interfaces - Exemplo • Comparator é uma interface com a seguinte assinatura: public interface Comparator { public int compare( Object o1, Object o2 ); }Orientação a Objetos com Java Pág: 195
  • 196. Interfaces - Exemplo• Para ordenamos contas, deveremos fornecer uma implementação a Comparator: public class ContaComparator implements java.util.Comparator { public int compare( Object o1, Object o2 ) { double d = ((ContaCorrente)o2 ).getSaldo() – ((ContaCorrente)o1).getSaldo()); return (int)d; } }Orientação a Objetos com Java Pág: 196
  • 197. Interfaces - Exemplo • E finalmente ordená-las Arrays.sort( contas, new ContaComparator() );Orientação a Objetos com Java Pág: 197
  • 198. Polimorfismo • Perceba que o método compare pode se comportar de forma diferente dependendo da sua classe concreta; • O compare de uma conta (ordenada pelo saldo) é diferente de um compare de um cliente (possivelmente ordenado pelo nome). • O mesmo método, com a mesma assinatura, se comportando de forma diferente = polimorfismo.Orientação a Objetos com Java Pág: 198
  • 199. Exercício • Realize a implementação do ContaComparator; • Faça as devidas checagens de tipo no método compare (usando instanceof); • Implemente uma ordenação pelo número da conta; • Verifique outras possibilidades para o uso de interfaces. 45 minutos (Nome dos arquivos envolvidos – ContaComparator.java)Orientação a Objetos com Java Pág: 199
  • 200. Exercício • Crie uma interface chamada Repositorio – ela deverá disponibilizar os seguintes métodos: – adicionarConta( Conta c ) // Adicionar uma nova conta – ContaCorrente obterConta( String numConta ) // Recupera uma conta – ArrayList obterContas() // Obtém todas as contas – removerConta( String num ) // Remove uma conta • Implemente uma classe concreta chamada RepositorioLista – ela será responsável por guardar as contas em um ArrayList; • Faça as devidas chamadas na classe Banco a classe RepositorioLista, referenciando a interface Repositorio. 45 minutos (Nome dos arquivos envolvidos – Banco.java, Repositorio.java, RepositorioLista.java)Orientação a Objetos com Java Pág: 200
  • 201. Onde Pesquisar? • Livro Thinking in Java – Capítulo 7 – Capítulo 8 • Tópico: “Interfaces”Orientação a Objetos com Java Pág: 201
  • 202. Módulo IX Interface Gráfica com o UsuárioOrientação a Objetos com Java Pág: 202
  • 203. Interface Gráfica com o Usuário • Trata do desenho de janelas e componentes gráficos, como painéis, botões, edits, menus. • A GUI (Interface gráfica com o usuário) – É construída a partir de componentes. – Os componentes gráficos pertencem a dois pacotes: • AWT (java.awt) • Swing (javax.swing)Orientação a Objetos com Java Pág: 203
  • 204. AWT x Swing • AWT – Ligado aos recursos da interface gráfica com o usuário da plataforma local. • Aparência diferente para cada plataforma. – Forma de interação do usuário também pode variar. – Componentes peso-pesado. • Swing – Aparência e comportamento uniforme para todas as plataformas. – Componentes peso-leve.Orientação a Objetos com Java Pág: 204
  • 205. Passos para a criação de uma janela 1. Criar um contêiner onde os componentes da janela serão inseridos. 2. Criar os componentes (e setar seus atributos) a serem inseridos na janela. 3. Inserir os componentes no painel de conteúdo do contêiner. 4. Exibir o contêiner.Orientação a Objetos com Java Pág: 205
  • 206. Contêiners • Todo programa usando a GUI Swing deve ter pelo menos um contêiner. • Este contêiner será utilizado para a inserção dos componentes pertencentes à janela. • Principais containers: – JFrame – JDialog – JApplet (applets)Orientação a Objetos com Java Pág: 206
  • 207. Hello World Swing import javax.swing.*; public class HelloWorldSwing { public static void main(String args[]) { JFrame window = new JFrame(); window.setTitle("Hello World Swing"); window.setSize(230,60); window.show(); } }Orientação a Objetos com Java Pág: 207
  • 208. Entendendo o exemplo • No nosso exemplo, utilizamos o container JFrame, através do qual criamos uma pequena janela: JFrame window = new JFrame(); • Podemos ainda setar propriedades desta janela: window.setTitle("Hello World Swing"); window.setSize(230,60); • Por último, mostramos a janela: window.show();Orientação a Objetos com Java Pág: 208
  • 209. Alterando o exemplo • Podemos fazer algumas alterações de forma que a nossa própria classe se comporte como um contêiner: import javax.swing.*; public class HelloWorldSwing extends JFrame { public HelloWorldSwing() { setTitle("Hello World Swing"); setSize(230,60); } public static void main(String args[]) { HelloWorldSwing window = new HelloWorldSwing(); window.show(); } }Orientação a Objetos com Java Pág: 209
  • 210. Criando componentes • Vamos agora acrescentar alguns componentes à nossa janela: import javax.swing.*; public class HelloWorldSwing extends JFrame { JButton botao = new JButton("Copiar"); JTextField texto1 = new JTextField(10); JTextField texto2 = new JTextField(10); JPanel painel = new JPanel(); public HelloWorldSwing() { setTitle("Hello World Swing"); setSize(400,80); painel.add(texto1); painel.add(botao); painel.add(texto2); getContentPane().add(painel); } ... }Orientação a Objetos com Java Pág: 210
  • 211. Componentes como Variáveis • Geralmente os componentes a serem inseridos são declarados como variáveis de instância para poderem ser utilizados em outros métodos: JButton botao = new JButton("Copiar"); JTextField texto1 = new JTextField(10); JTextField texto2 = new JTextField(10); JPanel painel = new JPanel();Orientação a Objetos com Java Pág: 211
  • 212. Trabalhando com os Componentes • Para organizar componentes normalmente são utilizados painéis: painel.add(texto1); painel.add(botao); painel.add(texto2); • Após acrescentar os componentes no painel, acrescentamos ele ao painel de conteúdo do contêiner: getContentPane().add(painel);Orientação a Objetos com Java Pág: 212
  • 213. Componentes - Janelas • JFrame – O contêiner será a janela propriamente dita. – Construtores: • JFrame() • JFrame(String titulo) – Principais métodos: • add(Component componente) • setSize(int largura, int altura) • setTitle(String titulo) • show() • setLocation(int x, int y) • getContentPane()Orientação a Objetos com Java Pág: 213
  • 214. Componentes - Painéis • JPanel – Usados para adicionar/organizar componentes. – Cada painel pode ter uma forma de organização (layout) de seus componentes diferente. – Um painel pode estar contido em outro. – Construtores: • JPanel() • JPanel(String rotulo) • JPanel(LayoutManager layout) – Principais métodos: • add(Component componente) • setLayout(LayoutManager layout)Orientação a Objetos com Java Pág: 214
  • 215. Componentes - Rótulos • JLabel – Fornece informações em uma GUI. – Somente leitura. – Pode exibir textos e/ou imagens. – Construtores: • JLabel() • JLabel(String texto) • JLabel(Icon icone) – Principais métodos: • setText(String texto) • setIcon(Icon icone) • SetHorizontalTextPosition(int posicao) //SwingConstants.CENTEROrientação a Objetos com Java Pág: 215
  • 216. Componentes – Campos de Edição • JTextField – Áreas de única linha aonde o usuário pode entrar com o texto. – Construtores: • JTextField() • JTextField(int dimensao) • JTextField(String textoInicial) – Principais métodos • setText(String texto) • getText() • setEditable(boolean editavel)Orientação a Objetos com Java Pág: 216
  • 217. Componentes – Áreas de Edição • JTextArea – Fornece área de manipulação de múltiplas linhas de texto. – Construtores: • JTextArea() • JTextArea(int nLinhas, int nColunas) – Principais métodos: • setText(String texto) • setEditable(boolean editavel)Orientação a Objetos com Java Pág: 217
  • 218. Componentes - Botões • JButton – Componente em que o usuário clica para disparar uma ação específica. – Construtores: • JButton() • JButton(String rotulo) • JButton(ImageIcon icone) – Principais métodos: • setText(String rotulo) • setEnabled(boolean clicavel)Orientação a Objetos com Java Pág: 218
  • 219. Componentes - Menus • JMenuBar, JMenu, JMenuItem – Permite ao usuário realizar ações sem poluir a interface gráfica. – A JMenuBar deve ser anexada a uma janela (e não adicionada como os outros componentes) que possua o método: setJMenuBar – Passos: JMenuItem JMenu JMenuItem JMenuBar JFrame JMenu JMenuItem add add setJMenuBarOrientação a Objetos com Java Pág: 219
  • 220. Componentes – Menus (Cont.) • JMenuBar, JMenu, JMenuItem (cont.) – Construtores: – JMenu(String rotulo) – JMenuItem(String rotulo) – JMenuBar() – Principais métodos – setMnemonic(char atalho) JMenuItem – add(JMenuItem menuItem) JMenu – addSeparator() – add(JMenu menu) JMenuBarOrientação a Objetos com Java Pág: 220
  • 221. Caixa de Diálogo • JOptionPane – Oferece caixas de diálogo pré-definidas que permitem aos programas exibir mensagens para os usuários. – Principais métodos: • JOptionPane.showMessageDialog( Object objetoRelativo, String mensagem) – Ex: JOptionPane(null, “Texto da mensagem”) • String JOptionPane.showInputDialog(String mensagem) – Ex: String res = JOptionPane(“Digite alguma coisa”)Orientação a Objetos com Java Pág: 221
  • 222. Gerenciadores de Layout • Organizar componentes GUI em um contêiner. • Fornecem recursos básico para layout ao invés de determinar posição e tamanho exatos de cada componente. • Tipos: – FlowLayout – BorderLayout – GridLayout – ...Orientação a Objetos com Java Pág: 222
  • 223. FlowLayout • É o mais básico. • Componentes colocados em um contêiner da esquerda para a direita, na ordem que são adicionados ao contêiner. • Pode-se modificar o alinhamento dos componentes (o padrão é centralizado).Orientação a Objetos com Java Pág: 223
  • 224. FlowLayout • Construtor: – FlowLayout() • Principais métodos: – setAlignment(int alinhamento) //FlowLayout.CENTER • Adicionar um componente neste layout: – add(Component componente)Orientação a Objetos com Java Pág: 224
  • 225. BorderLayout • É o padrão para o painel de conteúdo. • Organiza os componentes em cinco regiões. NORTH WEST CENTER EAST SOUTHOrientação a Objetos com Java Pág: 225
  • 226. BorderLayout • Construtor: – BorderLayout() – BorderLayout(int espHoriz, int espVert) • Adicionar um componente neste layout: – add(Component componente, String locallizacao) //BorderLayout.NORTHOrientação a Objetos com Java Pág: 226
  • 227. GridLayout • Divide o contêiner em uma grade. • Os componentes são colocados nas linhas/colunas. • Os componentes terão a mesma largura e altura. • Inicia na célular mais alta à esquerda e continua para a direita descendo para a próxima linha quando a linha atual encher.Orientação a Objetos com Java Pág: 227
  • 228. GridLayout • Construtor: – GridLayout(int linhas, int, colunas) – GridLayout(int linhas, int colunas, int espHoriz, int espVert) • Adicionar um componente neste layout: – add(Component componente)Orientação a Objetos com Java Pág: 228
  • 229. Alterando o Layout do Exemplo • Vamos alterar o layout do nosso exemplo para um BorderLayout: import java.awt.*; ... JPanel painel = new JPanel(new BorderLayout()); ... painel.add(texto1, BorderLayout.NORTH); BorderLayout.NORTH painel.add(botao, BorderLayout.CENTER); BorderLayout.CENTER painel.add(texto2, BorderLayout.SOUTH); BorderLayout.SOUTH ...Orientação a Objetos com Java Pág: 229
  • 230. Tratamento de Eventos • As GUIs são baseadas em eventos, isto é, geram eventos quando o usuário interage com a GUI. • Eventos comuns: clicar no mouse, clicar em um botão, digitar um campo de texto, fechar uma janela, etc. • AWTEvent – Um evento é enviado ao programa, quando da interação do usuário. – Um objeto filho de AWTEvent armazena informações sobre o evento (ActionEvent, MouseEvent, etc).Orientação a Objetos com Java Pág: 230
  • 231. Tratamento de Eventos • Pacotes: – java.awt.event – javax.swing.event • O tratamento de eventos engloba três partes: – A origem do evento: componente GUI com o qual o usuário interage. – O objeto evento: encapsula informações sobre o evento que ocorreu. – O ouvinte do evento: objeto que é notificado, pela origem do evento, quando ocorre um evento.Orientação a Objetos com Java Pág: 231
  • 232. Passos para o Tratamento de um Evento 1. Registrar um ouvinte de evento para o componente GUI que pode gerar o evento. 2. Implementar um método de tratamento de evento (ou um conjunto de métodos).Orientação a Objetos com Java Pág: 232
  • 233. Passos para o Tratamento de um Evento – Passo 1 • Vários componentes GUI podem disparar eventos. Para definir o ouvinte de um determinado componente, basta “setar” o ouvinte em questão no método de adição de ouvinte do componente: • Ex: – Para cliques de botões: – addActionListener( ActionListener ouvinte) – Aplicado ao botão em si. – Para cliques de mouse: – addMouseListener( MouseListener ouvinte) – Aplicado à janela que sofreu o clique do mouse.Orientação a Objetos com Java Pág: 233
  • 234. Voltando ao exemplo – Passo 1 • Setando o ouvinte no nosso exemplo: import java.awt.event.*; ... setSize(200,100); botao.addActionListener(this); painel.add(texto1, BorderLayout.NORTH); ...Orientação a Objetos com Java Pág: 234
  • 235. Passos para o Tratamento de um Evento – Passo 2 • Os métodos de tratamento de eventos estão definidos dentro das interfaces listeners (ActionListener, MouseListener, WindowListener, KeyListener, etc). • Para que uma determinada classe seja ouvinte de um evento, ela deve implementar a interface listener que possui o método correspondente a este evento.Orientação a Objetos com Java Pág: 235
  • 236. Voltando ao Exemplo – Passo 2 • Implementando a interface e o método actionPerformed (responsável por tratar cliques de botão): ... public class HelloWorldSwing extends JFrame implements ActionListener { ... public void actionPerformed(ActionEvent arg0) { if (evt.getSource() == botao) { texto2.setText(texto1.getText()); } } ...Orientação a Objetos com Java Pág: 236
  • 237. Executando o ExemploOrientação a Objetos com Java Pág: 237
  • 238. Hierarquia de Classes Swing Swing JComponent AWTOrientação a Objetos com Java Pág: 238
  • 239. Exercício • Altere a classe Banco criando botões e uma área de texto para as seguintes operações: Adicionar, Obter, Remover, Exibir, RenderJuros, Debitar, Creditar. • Use o JOptionPane para obter os dados de entrada. 45 minutosOrientação a Objetos com Java Pág: 239
  • 240. Onde Pesquisar? • http://java.sun.com/docs/books/tutorial/uisw ing/index.htmlOrientação a Objetos com Java Pág: 240
  • 241. Módulo X Tratamento de ExceçõesOrientação a Objetos com Java Pág: 241
  • 242. Importância de tratamento de erros • Na maioria das linguagens, como você trata erros? • Vamos imaginar, o tratamento de erros do método ContaCorrente.debitar: public class ContaCorrente { ... public void debitar( double valor ) { if ( saldo >= valor ) { saldo -= valor; } } ...Orientação a Objetos com Java Pág: 242
  • 243. Importância de tratamento de erros • Caso o método debitar falhe, o usuário da classe não será notificado; • Poderíamos alterar essa classe para retornar um boolean indicando se a operação foi executada: ... public boolean debitar( double valor ) { if ( saldo >= valor ) saldo -= valor; else return false; return true; } ...Orientação a Objetos com Java Pág: 243
  • 244. Importância de tratamento de erros • E se o usuário da classe não tratar o erro? public void transferir() { origem.debitar( 5000 ); destino.creditar( 5000 ); } • No exemplo acima, mesmo que o debitar falhe o programa executará o creditar.Orientação a Objetos com Java Pág: 244
  • 245. Exceptions • O mecanismo de exceções em Java foi criado de forma a estruturar e pôr ordem no tratamento de erros; • O compilador obriga o usuário da classe a tratar os possíveis erros que um método pode gerar; • Palavra chave = Robustez.Orientação a Objetos com Java Pág: 245
  • 246. Exceptions • O primeiro passo é definir uma classe que represente a exceção; • Essa classe deverá herdar da classe Exception public class SaldoInsuficienteException extends Exception { }Orientação a Objetos com Java Pág: 246
  • 247. Exceptions • O segundo passo é definir os métodos que podem disparar essa exception public class ContaCorrente { ... public void debitar( double valor ) throws SaldoInsuficienteException { if ( saldo >= valor ) { saldo -= valor; } } ...Orientação a Objetos com Java Pág: 247
  • 248. Exceptions • Ainda no mesmo método, devemos disparar a exceção quando o erro acontecer public class ContaCorrente { ... public void debitar( double valor ) throws SaldoInsuficienteException { if ( saldo >= valor ) { saldo -= valor; } else throw new SaldoInsuficienteException(); } ...Orientação a Objetos com Java Pág: 248
  • 249. Exceptions • Dessa forma, o usuário da classe se obriga a tratar o erro: public void transferir() { try { origem.debitar( 5000 ); destino.creditar( 5000 ); } catch (SaldoInsuficienteException e) { System.out.println( “Erro – saldo insuficiente” ); } }Orientação a Objetos com Java Pág: 249
  • 250. Exceptions • Ou o usuário trata o erro ou repassa para o chamador do método: public void transferir() throws SaldoInsuficienteException { origem.debitar( 5000 ); destino.creditar( 5000 ); }Orientação a Objetos com Java Pág: 250
  • 251. Exceptions • Usa-se a cláusula try para informar que em determinado bloco de programa pode ocorrer uma exceção; • Usa-se a cláusula catch para tratar uma ou mais exceções que possam ocorrer no bloco definido por uma cláusula try; • A cláusula finally especifica um bloco de programa que é executado caso a exceção ocorra ou não.Orientação a Objetos com Java Pág: 251
  • 252. Exceptions try { // bloco de programa que geralmente executa corretamente mas // que às vezes pode provocar uma exceção // (Ex.: Leitura de um arquivo) } catch (Exceção e1) { // bloco de código que trata a exceção e1 caso ela ocorra } catch (Exceção e2) { // bloco de código que trata a exceção e2 caso ela ocorra } finally { // bloco que sempre é executado }Orientação a Objetos com Java Pág: 252
  • 253. Exceptions • Antes de criar uma nova classe de exceção é interessante verificar se Java já não disponibiliza essa classe; • Por exemplo, já existe uma exceção na própria linguagem chamada FileNotFoundException que indica que um determinado arquivo não foi encontrado; • É importante estudar as classes que descendem de Exception.Orientação a Objetos com Java Pág: 253
  • 254. ExceptionsOrientação a Objetos com Java Pág: 254
  • 255. Exceptions Dicas • Um método verificarArquivoExiste, não retornará uma exceção e sim um boolean; • O método abrirArquivo disparará uma exceção caso o arquivo não exista ou aconteça algum erro de I/O.Orientação a Objetos com Java Pág: 255
  • 256. Exceptions Dicas • O ideal é ter um grande bloco try/catch. Dessa forma o código fica “limpo” (sem tratamentos de erro) = Maior legibilidade;Orientação a Objetos com Java Pág: 256
  • 257. Exceptions try { try { abrirArquivo(); abrirArquivo(); } catch processarArquivo(); ( FileNotFoundException e } catch ) ( FileNotFoundException e { ) // tratar o erro // Tratar erro } { try { catch ( IOException e ) processarArquivo(); { } catch ( IOException e ) // Tratar erro { } // Tratar erro  Código mais limpo!  }Orientação a Objetos com Java Pág: 257
  • 258. Exceptions • Um bloco de código pode disparar vários tipos de exceções: try { abrirArquivo(); processarArquivo(); } catch ( FileNotFoundException e ) // Tratar erro { catch ( IOException e ) { // Tratar erro }Orientação a Objetos com Java Pág: 258
  • 259. Exceptions • Cada exceção específica é tratada no seu bloco catch e disponibiliza informações sobre a exceção. try { abrirArquivo(); processarArquivo(); } catch ( FileNotFoundException e ) // Tratar erro { catch ( IOException e ) { // Tratar erro } Mensagem original pode ser recuperada com e.getMessage()Orientação a Objetos com Java Pág: 259
  • 260. Exceptions com informações • A sua exceção pode disponibilizar informações sobre o erro; • Por exemplo, a SaldoInsuficienteException poderia informar qual o valor do saldo atual da conta; • Para fazer isso, defina um construtor na classe Exception com os devidos parâmetros.Orientação a Objetos com Java Pág: 260
  • 261. Exceptions com informações public class SaldoInsuficienteException extends Exception { private double saldo; public SaldoInsuficienteException( double saldo ) { this.saldo = saldo; } public double getSaldo() { return this.saldo; } }Orientação a Objetos com Java Pág: 261
  • 262. Exceptions com informações • O método que dispara a exceção deve fornecer o parâmetro adicional public class ContaCorrente { ... public void debitar( double valor ) throws SaldoInsuficienteException { if ( saldo >= valor ) { saldo -= valor; } else throw new SaldoInsuficienteException( saldo ); } ...Orientação a Objetos com Java Pág: 262
  • 263. Exceptions com informações • O usuário da classe pode obter as informações adicionais providas pela exceção: public void transferir() { try { origem.debitar( 5000 ); destino.creditar( 5000 ); } catch (SaldoInsuficienteException e) { System.out.println( “Erro – saldo insuficiente, o saldo atual é ” + e.getSaldo() ); } }Orientação a Objetos com Java Pág: 263
  • 264. Exceptions – ordem de tratamento • Fique atento na ordem do bloco catch try { abrirArquivo(); processarArquivo(); } catch ( FileNotFoundException e ) // Tratar erro { catch ( Exception e ) { // Tratar erro } Qualquer mensagem diferente de FileNotFoundException será tratada nesse blocoOrientação a Objetos com Java Pág: 264
  • 265. Exceptions – ordem de tratamento • Alterando a ordem: try { abrirArquivo(); processarArquivo(); } catch (Exception e ) // Tratar erro { catch (FileNotFoundException e ) { // Tratar erro } Nunca será executado – erro de compilação.Orientação a Objetos com Java Pág: 265
  • 266. Exceptions – Resumo Em resumo, os seguintes passos são necessário para trabalhar com exceções: • Definir as exceções possíveis (novas classes herdando de Exception); • Disparar as exceções nos locais devidos (throw para disparar e throws para indicar que exceção pode acontecer); • Tratar a exceção (bloco try/catch)Orientação a Objetos com Java Pág: 266
  • 267. Exercício • Altere a classe Conta para disparar a exceção SaldoInsuficienteException de acordo com as definições vistas nesse módulo; • Crie uma nova exception chamada ContaInexistenteException e dispare-a da classe Banco no método obterConta, quando a conta passada não existir. (Nome dos arquivos envolvidos – Banco.java, ContaComparator.java, 45 minutos ContaInexistenteException.java e SaldoInsuficienteException.java)Orientação a Objetos com Java Pág: 267
  • 268. Onde Pesquisar? • Livro Thinking in Java – Capítulo 9Orientação a Objetos com Java Pág: 268
  • 269. Módulo XI PackagesOrientação a Objetos com Java Pág: 269
  • 270. Classpath • Lista de diretórios onde as classes Java devem estar armazenadas para que o interpretador possa encontrá-las. • Exemplo: – .;c:jdk1.2.2lib • Observação – Em geral, o diretório local (.) sempre faz parte do CLASSPATH.Orientação a Objetos com Java Pág: 270
  • 271. Pacotes • Conjunto de classes e interfaces inter- relacionadas. • Classes de pacotes diferentes podem ter o mesmo identificador. • Classes contidas em pacotes são identificadas prefixando-se o nome do pacote ao seu nome. • Exemplo: – Classe Button faz parte do pacote java.awt – Referência completa da classe Button: • java.awt.ButtonOrientação a Objetos com Java Pág: 271
  • 272. Pacotes • Cada pacote é associado a um diretório no sistema operacional. • Os arquivos-fonte neste diretório têm o mesmo cabeçalho: package <nome_do_pacote>; • Cada arquivo define uma ou mais classes que fazem parte do pacote. • Atenção: – Subdiretórios não correspondem a “subpacotes”.Orientação a Objetos com Java Pág: 272
  • 273. Pacotes • O nome de um pacote deve ser parte do nome do seu diretório associado; • Supondo que o diretório /home/java está no CLASSPATH, as classes do pacote sistemas.banco devem estar no diretorio /home/java/sistemas/banco. • Importação: – import sistemas.banco.ContaEspecial; – import sistemas.banco.*; – import sistemas.*;Orientação a Objetos com Java Pág: 273
  • 274. Pacotes • Exemplo: package sistemas.banco; public class ContaCorrente { ... }Orientação a Objetos com Java Pág: 274
  • 275. Importando Pacotes • Para que classes contidas em pacotes possam ser utilizadas, precisam ser importadas. • Dois tipos de importação: – Implícita – Explícita • Exemplos: import java.applet.*; public class MeuApplet extends Applet {...} public class MeuApplet extends java.applet.Applet {...}Orientação a Objetos com Java Pág: 275
  • 276. Importando Pacotes • Comando import – Sintaxe: import <identif>[.<identif>]; – Exemplos: import java.awt.Color; import java.awt.*; import java.*;  Não importa subpacotesOrientação a Objetos com Java Pág: 276
  • 277. Relembrando Encapsulamento – Visibilidade • Public: permite acesso a partir de qualquer classe; • Private: permite acesso apenas na própria classe; • Protected: permite acesso apenas a objetos da mesma classe e de suas sub-classes; • Package: permite acesso a todas as classes do mesmo pacote;Orientação a Objetos com Java Pág: 277
  • 278. Pacotes • É um padrão do Java definir os pacotes como a URL da empresa invertida; • A idéia é evitar conflito entre classes de fornecedores diferentes; • Dessa forma, as classes do sistema de estoque, desenvolvidos pela SoftSite estariam no pacote: package br.com.softsite.estoque; • E estaria no diretório brcomsoftsiteestoqueOrientação a Objetos com Java Pág: 278
  • 279. Exercício • Altere todas as classes já desenvolvidas para atender a definição de pacotes; • Os pacotes deverão ser os seguintes: br.com.softsite.automacaobancaria.business  Com as classes Banco, ContaCorrente, ContaPoupanca e ContaEspecial br.com.softsite.automacaobancaria.exception  Com as classes SaldoInsuficienteException e ContaInexistenteException 45 minutos (Nome dos arquivos envolvidos – todos)Orientação a Objetos com Java Pág: 279
  • 280. Onde Pesquisar? • Livro Thinking in Java – Capítulo 5Orientação a Objetos com Java Pág: 280
  • 281. Módulo XII Acesso a banco de dados JDBCOrientação a Objetos com Java Pág: 281
  • 282. O que é JDBC? • É uma API Java para acesso a banco de dados utilizando SQL; • Permite a independência de banco de dados; • A forma de acesso a um banco de dados é exatamente igual a outro banco de dados. • A independência entre bancos de dados pode ser prejudicada pela forma como você utiliza SQL (comandos SQLOrientação a Objetos com Java Pág: 282
  • 283. O que JDBC faz? De maneira simplificada JDBC faz seis coisas: 1 – Estabelece conexão com o banco de dados. 2 – Executa consultas. 3 – Recebe o conjunto de resultados das consultas. 4 – Executa stored procedures. 5 – Obtém informações sobre o banco de dados, tabelas, índices, visões, e stored procedures. 6 – Gerencia transações.Orientação a Objetos com Java Pág: 283
  • 284. JDBC x ODBC • ODBC: Atualmente o ODBC (Open Database Conectivity) da Microsoft é a interface mais usada para acessar bancos de dados relacionais; • ODBC: possibilita conectar quase todos os bancos de dados em quase todas as plataformas ; • Por que não usar odbc a partir de java ?Orientação a Objetos com Java Pág: 284
  • 285. JDBC x ODBC • ODBC usa uma interface em C; • Chamadas de Java para códigos em C trazem desvantagens em: segurança, robustez e portabilidade; • Caso seja estritamente necessário podemos utilizar um driver ODBC a partir do Java (utilizando um driver que desvia as chamadas JDBC para chamadas ODBC).Orientação a Objetos com Java Pág: 285
  • 286. API JDBC • A API JDBC está definida no pacote java.sql – a maior parte da API são interfaces; • O J2SE – Java 2 Standard Edition disponibiliza uma única implementação JDBC chamada JDBC- ODBC Bridge (que faz a ponte entre JDBC e ODBC); • Para acessar o seu banco de dados utilizando JDBC você deverá obter um driver do fornecedor do SGBD (o caso mais comum), comprar de uma empresa fornecedora de drivers ou usar produtos de código aberto.Orientação a Objetos com Java Pág: 286
  • 287. API JDBCOrientação a Objetos com Java Pág: 287
  • 288. Tipos de driver JDBC • Existem 4 tipos de drivers JDBC: – Tipo 1  JDBC-ODBC Bridge; – Tipo 2  Java Nativo – Tipo 3  Gateway – Tipo 4  All Java DriverOrientação a Objetos com Java Pág: 288
  • 289. Tipo 1 - Ponte • Convertem chamadas JDBC em chamadas ODBC e as envia ao driver ODBC; • Possibilitam o uso indireto de drivers ODBC; • Necessidade de configurar o ODBC; • Mais apropriado para uma rede corporativa ou para aplicações usando arquitetura em três camadas; • Ex: sun jdbc-odbc bridge.Orientação a Objetos com Java Pág: 289
  • 290. Tipo 1 - Ponte JDBC-ODBC BRIDGE + ODBC DRIVER Aplicação JAVA Dados API JDBC-ODBC API Driver JDBC Bridge ODBC ODBCOrientação a Objetos com Java Pág: 290
  • 291. Tipo 2 – Java Nativo • Convertem chamadas JDBC em chamadas nativas do banco e comunicam-se diretamente com o SGBD; • Apresentam ganhos de performance; • O cliente do banco de dados é necessário; • Menor portabilidade. • Ex: IBM DB2.Orientação a Objetos com Java Pág: 291
  • 292. Tipo 2 – Java Nativo Java / Nativo Aplicação JAVA Dados API API Driver Nativa JDBC JDBC SGBDOrientação a Objetos com Java Pág: 292
  • 293. Tipo 3 – Gateway • Convertem chamadas JDBC em um protocolo de rede independente do SGBD e comunicam-se com um gateway que traduz estas requisições para o protocolo específico do SGBD; • Ex: borland datagateway.Orientação a Objetos com Java Pág: 293
  • 294. Tipo 3 – Gateway Servidor de acesso intermediário Aplicação JAVA Dados JDBC API Driver Driver JDBC Driver JDBC Nativo ServerOrientação a Objetos com Java Pág: 294
  • 295. Tipo 4 – All Java Driver • Convertem chamadas JDBC para um protocolo de rede usado diretamente pelo SGBD; • São geralmente específicos para determinada base de dados; • Ex: Sybase, SQL Server, Oracle.Orientação a Objetos com Java Pág: 295
  • 296. Tipo 4 – All Java Driver All Java Driver Aplicação API Driver JDBC Dados JAVA JDBCOrientação a Objetos com Java Pág: 296
  • 297. Tipos de driver JDBCOrientação a Objetos com Java Pág: 297
  • 298. Abrindo uma conexão com o BD • Para abrir uma conexão com o banco de dados, precisamos primeiro de um driver JDBC; • Utilizaremos o driver do MySQL nos próximos exemplos; • O driver JDBC do MySQL pode ser baixado no site www.mysql.com; • É free (sobre a licença GPL) e é um driver tipo 4.Orientação a Objetos com Java Pág: 298
  • 299. Abrindo uma conexão com o BD • O nosso primeiro passo é registrar o driver JDBC; • O driver do MySQL está disponível em “mysql-connector-java-3.0.6-stable-bin.jar”; • Você deverá consultar a documentação do seu fornecedor para saber qual é a classe e pacote do driver JDBC. Class.forName( "com.mysql.jdbc.Driver");Orientação a Objetos com Java Pág: 299
  • 300. Abrindo uma conexão com o BD • O segundo passo é abrir a conexão com o banco de dados; • Utilize a classe DriverManager para fazer isso; • Os parâmetros passados para o método getConnection variam de driver para driver – consulte a documentação do seu driver. ... java.sql.Connection conn; conn = DriverManager.getConnection( "jdbc:mysql://localhost/test? user=root&password=");Orientação a Objetos com Java Pág: 300
  • 301. Executando uma consulta • Com a conexão com o banco de dados obtida, podemos executar consultas SQL: ... java.sql.Connection conn; conn = DriverManager.getConnection( "jdbc:mysql://localhost/test? user=root&password="); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( “Select * from contas” );Orientação a Objetos com Java Pág: 301
  • 302. Executando uma consulta • O objeto ResultSet guarda os dados retornados pela consulta: ... Resultset rs = stmt.executeQuery( “Select * from contas” ); while ( rs.next() ) { String cdConta = rs.getString( “codigo” ); double sdConta = rs.getDouble( “saldo” ); }Orientação a Objetos com Java Pág: 302
  • 303. Executando uma consulta • E ao final de tudo, devemos fechar o statement e a conexão. ... stmt.close(); conn.close();Orientação a Objetos com Java Pág: 303
  • 304. Executando uma consulta try { Class.forName( "com.mysql.jdbc.Driver"); java.sql.Connection conn; conn = DriverManager.getConnection( "jdbc:mysql://localhost/test?user=root&password="); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery( “Select * from contas” ); while ( rs.next() ) { String cdConta = rs.getString( “codigo” ); double sdConta = rs.getDouble( “saldo” ); } } catch (ClassNotFoundException e){System.out.println(e);// Trate o erro! } catch (SQLException e ) {System.out.println(e); // Trate o erro! } finally { stmt.close(); conn.close(); }Orientação a Objetos com Java Pág: 304
  • 305. API JDBC • DriverManager  Utilizada para obter a conexão com o banco de dados • Principais métodos: – Connection getConnection( String url ) • Obtém uma conexão com o banco de dados; – Connection getConnection ( String url, String user, String pass ) • Obtém uma conexão com o BD passando usuário e senha;Orientação a Objetos com Java Pág: 305
  • 306. API JDBC • Connection  Representa uma conexão com o BD • Principais métodos: – Statement createStatement() • Cria um statement, que representa um comando SQL a ser enviado; – PreparedStatement prepareStatement() • Cria um statement pré-compilado (veja definições adiante) – setAutoCommit( boolean ) • Indica se deverá se trabalhar no modo AutoCommit; – commit • Confirma as alteração no banco de dados – rollback • Desfaz transações no BD – close • Fecha a conexão com o banco de dadosOrientação a Objetos com Java Pág: 306
  • 307. API JDBC • Statement  Representa um comando SQL; • Principais métodos: – ResultSet executeQuery( String ) • Executa um comando SQL e obtém o resultado; – executeUpdate( String ) • Executa um comando SQL que não retorna resultado (um update, delete ou insert); – addBatch( String ) • Adiciona um comando SQL em um bloco; – executeBatch() • Executa comandos adicionados com addBatch – getConnection • Retorna a conexão associada ao statement – setMaxRows( int ) • Especifica a quantidade de linhas máxima retornada.Orientação a Objetos com Java Pág: 307
  • 308. API JDBC • Exemplo de um executeUpdate String sql = “update conta set saldo = 1000“; Statement stmt = conn.createStatement( sql ); stmt.executeUpdate(); throws SQLExceptionOrientação a Objetos com Java Pág: 308
  • 309. API JDBC • PreparedStatement  Representa um comando SQL pré-compilado; • Principais métodos: – ResultSet executeQuery( String ) • Executa um comando SQL e obtém o resultado; – executeUpdate( String ) • Executa um comando SQL que não retorna resultado (um update, delete ou insert); – setXXXX( indice, valor ) • Passa um parâmetro para o result set, onde XXXX é o tipo do parâmetro (setInt, setDate, setLong, setString, ... );Orientação a Objetos com Java Pág: 309
  • 310. API JDBC • PreparedStatement é útil quando você irá submeter o mesmo comando diversas vezes pois o banco só faz o parse da query uma vez. String sql = "select * from conta where codigo = ? " PreparedStatement stmt = conn.prepareStatement( sql ); stmt.setInt( 1, 50 ); ResultSet rs = stmt.executeQuery(); while ( rs.next() ) { System.out.println( rs.getString(1) ); }Orientação a Objetos com Java Pág: 310
  • 311. API JDBC • ResultSet  Representa o resultado de uma consulta; • Principais métodos: – close • Fecha o resultset – ResultSetMetaData getMetaData() • Retorna informações sobre as colunas do result set. – getXXXX( String ) / getXXXX( int ) • Retorna a informação de uma coluna, onde XXXX representa o tipo da coluna (getInt, getDate, getLong, getString, ... ).Orientação a Objetos com Java Pág: 311
  • 312. ResultSet e os métodos getOrientação a Objetos com Java Pág: 312
  • 313. Exercício • Crie uma nova classe chamada RepositorioBD que implementa a interface Repositorio (definida no módulo VIII) e grava os dados em um banco de dados; • Altere a classe Banco para utilizar a classe concreta RepositorioBD. (Nome dos arquivos envolvidos – RepositorioBD.java e Banco.java) 45 minutosOrientação a Objetos com Java Pág: 313
  • 314. Onde Pesquisar? • http://java.sun.com/docs/books/tutorial/jdbc /index.htmlOrientação a Objetos com Java Pág: 314
  • 315. J2SE - TIGER Rafael Garcia Barbosa CFJ www.cfj.com.br cfj@cfj.com.brOrientação a Objetos com Java Pág: 315
  • 316. Introdução Versão 1.5 “Tiger” Beta 2. Aproximadamente 100 novas alterações. Facilitar desenvolvimento Tipos genéricos Auto-boxing Static import ...Orientação a Objetos com Java Pág: 316
  • 317. Tipos Genéricos Collections API: grande utilização. Prevenção de ClassCastException. ArrayList list = new ArrayList(); J2SE 1.4.2 list.add(0, new Integer(42)); int total = ((Integer)list.get(0)).intValue(); ArrayList<Integer> list = new ArrayList<Integer>(); J2SE 1.5 list.add(0, new Integer(42)); int total = list.get(0).intValue();Orientação a Objetos com Java Pág: 317
  • 318. Auto-Boxing Converter um tipo primitivo para sua classe Wrapper pode necessitar código extra desnecessário. Exemplo: empacotar os tipos em uma Collection. Auto-boxing: código mais simples.Orientação a Objetos com Java Pág: 318
  • 319. Auto-Boxing ArrayList<Integer> list = new ArrayList<Integer>(); J2SE 1.5 list.add(0, new Integer(42)); int total = (list.get(0)).intValue(); ArrayList<Integer> list = new ArrayList<Integer>(); J2SE 1.5 list.add(0, 42); int total = list.get(0);Orientação a Objetos com Java Pág: 319
  • 320. Loop “for” Aprimorado Classe Iterator bastante usada para Collections API. Novo loop “for” acaba com a necessidade de usar um Iterator. O compilador gera o código de laço necessário.Orientação a Objetos com Java Pág: 320
  • 321. Loop “for” Aprimorado ArrayList<Integer> list = new ArrayList<Integer>(); for (Iterator i = list.iterator(); i.hasNext();) { J2SE 1.5 Integer value=(Integer)i.next(); } ArrayList<Integer> list = new ArrayList<Integer>(); J2SE 1.5 for (Integer i : list) { ... }Orientação a Objetos com Java Pág: 321
  • 322. Tipos Enumerados Permite o uso de tipos enumerados. J2SE 1.5 public enum StopLight { red, amber, green };Orientação a Objetos com Java Pág: 322
  • 323. Static Import Permite se referir a constantes estáticas sem precisar referenciar o pacote completo. ... J2SE 1.4.2 getContentPane().add( new JPanel(), java.awt.BorderLayout.CENTER); import static java.awt.BorderLayout.*; J2SE 1.5 ... getContentPane().add(new JPanel(), CENTER);Orientação a Objetos com Java Pág: 323
  • 324. Varargs Permite passar um número flexível de argumentos como parâmetro. void argtest(Object ... args) { for (int i=0;i <args.length; i++) { } J2SE 1.5 } ... argtest("test", "data");Orientação a Objetos com Java Pág: 324
  • 325. Saída Formatada Possibilidade de formatar uma String de forma direta, usando formatadores parecidos com os da linguagem C. J2SE 1.5 System.out.printf("name count%n"); System.out.printf("%s %5d%n", user,total);Orientação a Objetos com Java Pág: 325
  • 326. Onde Pesquisar? http://java.sun.com/j2se/1.5.0/docs/relnotes/f eatures.html Revista Java Magazine Edição 12Orientação a Objetos com Java Pág: 326
  • 327. Thinking aheadOrientação a Objetos com Java Pág: 327

×