Orientação a Objetos com Java

18.057 visualizações

Publicada em

Curso de Orientação a Objetos com Java

Publicada em: Tecnologia
0 comentários
10 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
18.057
No SlideShare
0
A partir de incorporações
0
Número de incorporações
5
Ações
Compartilhamentos
0
Downloads
789
Comentários
0
Gostaram
10
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Orientação a Objetos com Java

  1. 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. 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. 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. 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. 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. 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. 7. Livro SugeridoOrientação a Objetos com Java Pág: 7
  8. 8. Módulo I IniciandoOrientação a Objetos com Java Pág: 8
  9. 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. 10. Entendendo um pouco mais • Máquinas virtuais; • Coleta de lixo; • Segurança.Orientação a Objetos com Java Pág: 10
  11. 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. 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. 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. 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. 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. 16. Coleta de LixoOrientação a Objetos com Java Pág: 16
  17. 17. Coleta de LixoOrientação a Objetos com Java Pág: 17
  18. 18. SegurançaOrientação a Objetos com Java Pág: 18
  19. 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. 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. 21. Fazendo funcionarOrientação a Objetos com Java Pág: 21
  22. 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. 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. 24. Módulo II Identificadores, Keywords e tiposOrientação a Objetos com Java Pág: 24
  25. 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. 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. 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. 28. Palavras chave no Java • A linguagem Java possui 51 palavras chave/reservadas:Orientação a Objetos com Java Pág: 28
  29. 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. 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. 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. 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. 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. 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. 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. 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. 37. Variáveis e escopo • Variáveis de classe (continuação) – São automaticamente inicializadasOrientação a Objetos com Java Pág: 37
  38. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 50. Controle Iteração • break [label]; • continue [label]; • label : código.Orientação a Objetos com Java Pág: 50
  51. 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. 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. 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. 54. Módulo III Orientação a objetosOrientação a Objetos com Java Pág: 54
  55. 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. 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. 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. 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. 59. Orientação a objetos • Exemplos de objetos: Conta Corrente Nota Fiscal Produto Cliente PedidoOrientação a Objetos com Java Pág: 59
  60. 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. 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. 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. 63. Orientação a objetos MyDate today; today ????Orientação a Objetos com Java Pág: 63
  64. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 75. EncapsulamentoOrientação a Objetos com Java Pág: 75
  76. 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. 77. Encapsulamento Encapsulamento Métodos públicos Atributos públicos Métodos privados Atributos privadosOrientação a Objetos com Java Pág: 77
  78. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 92. Módulo IV ArraysOrientação a Objetos com Java Pág: 92
  93. 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. 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. 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. 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. 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. 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. 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. 100. Onde Pesquisar? • Livro Thinking in Java – Capítulo 11 • Tópico: “Arrays”Orientação a Objetos com Java Pág: 100
  101. 101. Módulo V Ponteiros, referências e listasOrientação a Objetos com Java Pág: 101
  102. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 124. Módulo VI Herança e ligação dinâmicaOrientação a Objetos com Java Pág: 124
  125. 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. 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. 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. 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. 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. 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. 131. Herança – Representação UMLOrientação a Objetos com Java Pág: 131
  132. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 157. Módulo VII Classes AbstratasOrientação a Objetos com Java Pág: 157
  158. 158. Classes Abstratas Um exemplo: • API para enviar mensagens – Voz; – e-mail; – Texto; – Fax...Orientação a Objetos com Java Pág: 158
  159. 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. 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. 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. 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. 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. 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. 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. 166. Classes Abstratas Implementando o objeto mensagem • Classes: – TextMessage; – VoiceMessage.Orientação a Objetos com Java Pág: 166
  167. 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. 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. 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. 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. 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. 172. Módulo VIII Interfaces e PolimorfismoOrientação a Objetos com Java Pág: 172
  173. 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. 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. 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. 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. 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. 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. 179. Estudo de Caso – Ordenando Contas Qual o problema dessa implementação?Orientação a Objetos com Java Pág: 179
  180. 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. 181. Estudo de Caso – Ordenando ContasOrientação a Objetos com Java Pág: 181
  182. 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. 183. Estudo de Caso – Ordenando ContasOrientação a Objetos com Java Pág: 183
  184. 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. 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. 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. 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. 188. Declarando Interfaces interface <identif> [extends <identif>] { <corpo_da_interface> }Orientação a Objetos com Java Pág: 188
  189. 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. 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. 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. 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. 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. 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. 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. 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. 197. Interfaces - Exemplo • E finalmente ordená-las Arrays.sort( contas, new ContaComparator() );Orientação a Objetos com Java Pág: 197
  198. 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. 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. 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. 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. 202. Módulo IX Interface Gráfica com o UsuárioOrientação a Objetos com Java Pág: 202
  203. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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

×