0

Apostila Java

2,453

Published on

Published in: Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,453
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
213
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Transcript of "Apostila Java"

  1. 1. Linguagem Java Ricardo Terra rterrabh [at] gmail.com Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 1 / 549
  2. 2. CV Nome: Ricardo Terra Email: rterrabh [at] gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868 Ph.D. (UFMG/UWaterloo), Post-Ph.D. (INRIA/Université Lille 1) Background Acadêmico : UFLA (desde 2014), UFSJ (1 ano ), FUMEC (3 anos ), UNIPAC (1 ano ), FAMINAS (3 anos ) Profissional : DBA Eng. (1 ano ), Synos (2 anos ), Stefanini (1 ano ) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 2 / 549
  3. 3. 1. Introdução – Conteúdo 1 Introdução 3 Visão Geral de POO 4 2 UML 22 3 Java 62 4 POO 186 5 Padrões de Projeto 359 6 Tópicos Relevantes 389 7 Materiais Complementares 420 8 Extras 510 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 3 / 549
  4. 4. Introdução Visão Geral de POO Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 4 / 549
  5. 5. Introdução – Visão Geral de POO Origem da POO Simula Foi a primeira linguagem de programação a introduzir os conceitos subjacentes a programação orientada a objetos (objetos, classes, subclasses, métodos virtuais, coletor de lixo etc) Mas, não foi amplamente desenvolvida Smalltalk Linguagem puramente orientada a objetos Atualmente C++ Object Pascal Java Python Eiffel Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 5 / 549
  6. 6. Introdução – Visão Geral de POO Linguagem para criação de modelos UML Padrão OMG (Object Management Group) Mais utilizada nos dias de hoje Utilizaremos bastante o Diagrama de Classe, um dos seus 14 diagramas, em nossa disciplina Booch OOSE (Object-Oriented Software Engineering) OMT (Object Modeling Technique) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 6 / 549
  7. 7. Introdução – Visão Geral de POO Paradigma de Programação Definição Conjunto de regras e/ou hipóteses que governam a definição de um modelo Aplicação na computação/informática Auxiliar na condução do processo de busca da solução (modelo conceitual) de um problema Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 7 / 549
  8. 8. Introdução – Visão Geral de POO Exemplos de paradigma de programação Procedural (imperativo) É um paradigma de programação que descreve a computação como ações (instruções) que mudam o estado (variáveis) de um programa. Muito parecido com o comportamento imperativo das linguagens naturais que expressam ordens, programas imperativos são uma sequência de comandos para o computador executar Orientado a objetos É um paradigma de programação que utiliza “objetos” e a interação entre eles para projetar aplicações e programas de computador. Suas técnicas de programação podem incluir características como encapsulamento, polimorfismo e herança. Esse paradigma não era comumente usado no desenvolvimento de aplicações de grande porte até início de 1990. Atualmente, várias linguagens modernas suportam POO Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 8 / 549
  9. 9. Introdução – Visão Geral de POO Objeto “Objeto é uma coisa, uma entidade, alguma coisa que você levanta ou chuta, qualquer coisa que você possa imaginar que tenha sua própria identidade.” (Mike O’Docherty, 2005) Possuem características (atributos) Possuem comportamentos (métodos) Assume responsabilidades no domínio do problema Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 9 / 549
  10. 10. Introdução – Visão Geral de POO Classe “Uma classe encapsula características comuns a grupos de objetos.” (Mike O’Docherty, 2005) Pode ser pensada de várias formas: Um conjunto de especificações que caracterizam como seus membros devem ser Um molde que produz objetos com a mesma forma ... Enfim Desenvolvedores utilizam classes para descrever elementos de programação que alguns tipos de objetos terão Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 10 / 549
  11. 11. Introdução – Visão Geral de POO Classe Atributos Representam as informações (características) que os objetos da classe terão Por exemplo, uma pessoa tem um nome, idade, peso etc Métodos Representam as ações (comportamentos) que os objetos da classe realizarão Por exemplo, uma pessoa respira, come, bebe etc Encapsulamento Classe é a menor unidade modular de POO, isto é, não existe nada menor que uma classe Assim, classe é definida como um grupo de atributos, métodos e outros membros que são tratado como uma única unidade modular Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 11 / 549
  12. 12. Introdução – Visão Geral de POO Herança Basicamente, é a habilidade de definir novas classes baseadas em classes existentes Suponha: Um animal Animal morre Um mamífero é um animal Mamífero morre Mamífero mama (novo) Um leão é um mamífero Leão morre Leão mama Leão ruge (novo) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 12 / 549
  13. 13. Introdução – Visão Geral de POO Herança requer o entendimento dos conceitos de superclasse e subclasses Superclasses são as classes mais genéricas em sua hierarquia Subclasses são as classes mais específicas em sua hierarquia Com base no exemplo anterior: Animal superclasse de Mamífero e Leão Mamífero superclasse de Leão subclasse de Animal Leão subclasse de Animal e Mamífero Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 13 / 549
  14. 14. Introdução – Visão Geral de POO Sobreposição Você sobrepõe uma operação quando deseja que uma operação herdada seja realizada diferentemente pela subclasse Por exemplo, uma cobra se alimenta de ratos, mas um tipo específico de cobra (subclasse) se alimenta diferentemente Assim, é necessário sobrepor o método alimentar: Classe Cobra void alimentar (Rato comida) { /* mata e come */ } Classe Cascavel @Override void alimentar (Rato comida) { /* come mesmo vivo */ } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 14 / 549
  15. 15. Introdução – Visão Geral de POO Sobrecarga Você sobrecarrega uma operação quando deseja que a mesma operação também seja realizada por entradas diferentes Por exemplo, uma cobra se alimenta de ratos, mas um tipo específico de cobra (subclasse) se alimenta também de ratazanas Assim, é necessário sobrecarregar o método alimentar: Classe Cobra void alimentar (Rato comida) { /* mata e come */ } Classe Cascavel @Override void alimentar (Rato comida) { /* come mesmo vivo */ } void alimentar (Ratazana comida) { /* come também */ } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 15 / 549
  16. 16. Introdução – Visão Geral de POO Polimorfismo Habilidade de um objeto poder ser tratado como qualquer uma de suas classes mais genéricas (superclasses) Com base no exemplo anterior: Leão pode ser visto como um animal Contudo, se for visto como animal, só poderá morrer Um leão pode ser visto como um mamífero Contudo, se for visto como mamífero, só poderá morrer e mamar Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 16 / 549
  17. 17. Introdução – Visão Geral de POO Repasso Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 17 / 549
  18. 18. Introdução – Visão Geral de POO Agenda Telefônica Atributos lista de contatos Operações inserir contato alterar contato excluir contato Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 18 / 549
  19. 19. Introdução – Visão Geral de POO Contato (para uma agenda telefônica) Atributos nome endereço telefone email Operações obter/alterar nome obter/alterar endereço obter/alterar telefone obter/alterar email Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 19 / 549
  20. 20. Introdução – Visão Geral de POO Cavalo (como ele é) Atributos peso altura cor raça ... Operações andar comer puxar carroça relinchar ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 20 / 549
  21. 21. Introdução – Visão Geral de POO Exercícios: modele as seguintes classes Conta Equação (de 2o grau) Escola Filme Telefone Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 21 / 549
  22. 22. 2. UML – Conteúdo 1 Introdução 3 2 UML 22 Diagrama de Classe 23 3 Java 62 4 POO 186 5 Padrões de Projeto 359 6 Tópicos Relevantes 389 7 Materiais Complementares 420 8 Extras 510 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 22 / 549
  23. 23. UML Diagrama de Classe Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 23 / 549
  24. 24. UML – Diagrama de Classe Classe x Objeto As classes formam o alicerce do diagrama de classes. Para trabalhar com diagrama de classes, você precisa ter uma noção clara da diferença entre classes e objetos Assim: Classe é a definição/molde para um recurso. Ela inclui informações que descrevem os recursos de uma entidade e como ela pode ser utilizada Objeto, ao contrário, é uma instância de uma classe. Pode-se dizer que um objeto é uma entidade identificável de forma exclusiva de acordo com as regras definidas pela classe Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 24 / 549
  25. 25. UML – Diagrama de Classe Importância “Se alguém chegar perto de você em um beco escuro e disser: “Psiu, quer ver um diagrama UML?”, esse provavelmente seria um diagrama de classes. A maioria dos diagramas UML que vejo são diagramas de classes.” (FOWLER, 2005) “O diagrama de classes provavelmente é o diagrama mais utilizado da UML. Na verdade, o diagrama de classes é a ferramenta de modelagem principal para descrever a própria UML.” (PENDER, 2004) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 25 / 549
  26. 26. UML – Diagrama de Classe Definição Um diagrama de classes descreve os tipos de objetos presentes no sistema e os vários tipos de relacionamento estáticos existentes entre eles Os diagramas de classe também mostram os atributos e operações de uma classe e as restrições que se aplicam à maneira como os objetos estabelecem dependência Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 26 / 549
  27. 27. UML – Diagrama de Classe Uma classe é uma descrição de um conjunto de objetos que partilham os mesmos atributos, operações, relações e semântica Por exemplo, na classe Pessoa, é dito que uma pessoa tem nome, idade, altura etc. Contudo, não diz qual é o nome, a idade, a altura etc Se algo tem um nome, uma idade, uma altura etc, esse algo é um objeto de Pessoa Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 27 / 549
  28. 28. UML – Diagrama de Classe Uma classe é descrita em seus aspectos estruturais por seus atributos e em seus aspectos comportamentais por suas operações Uma classe é representada como abaixo: Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 28 / 549
  29. 29. UML – Diagrama de Classe É errado pensar que uma classe deve corresponder a uma entidade humana, uma coisa física, algo que você vê ou toca etc Por exemplo, pode-se representar entidades mais abstratas: Venda, Saudade, Amor etc Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 29 / 549
  30. 30. UML – Diagrama de Classe Atributos São propriedades (características) semelhantes que os objetos de uma classe possuem Por exemplo, na classe Pessoa, o nome, a idade, a altura são seus atributos Um atributo pode ser de um tipo primitivo, uma coleção, um arranjo, um objeto de outra classe etc Os valores dos atributos diferenciam objetos. Por exemplo, na classe Carro, sabe-se, dentre outras propriedades, que o meu carro é prata. Como o seu é preto, não pode ser o mesmo carro Em outras palavras, o valor do atributo cor diferenciou os objetos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 30 / 549
  31. 31. UML – Diagrama de Classe Atributos e operações permitem que sejam especificados detalhes de sua visibilidade e de sua multiplicidade (abordaremos isso a frente) A sintaxe básica de um atributo é: [visibilidade] nome : [tipo] { = valor-inicial } Exemplos: + nome : String - salario : double = 1000.00 # nota : int ∼ cor : double Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 31 / 549
  32. 32. UML – Diagrama de Classe Operações São comportamentos (ações) que os objetos de uma classe possuem Por exemplo, na classe Pessoa, comer, beber, dormir são suas operações Os valores dos atributos diferenciam objetos. Contudo, eles influenciam nas operações. Por exemplo, na classe Pessoa, uma pessoa que pesa 100kg certamente vai comer mais que uma que pesa 45kg Existem operações que não sofrem influência dos atributos, mas não é comum Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 32 / 549
  33. 33. UML – Diagrama de Classe A sintaxe básica de uma operação é: [visibilidade] nome ( [parâmetros] ) : [retorno] Exemplos: - mostrar( ) : void + calcularTaxa( valorDolar : double ) : double # somar( a : int , b: int ) : int ∼ delta( ): double Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 33 / 549
  34. 34. UML – Diagrama de Classe Atributos e operações estáticos Um atributo ou operação que não pertence a uma instância da classe, mas à classe como um todo são chamados de atributo ou operação estático Atributos e operações estáticos são compartilhados por todas as instâncias da classe, não pertencendo a uma instância específica Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 34 / 549
  35. 35. UML – Diagrama de Classe Por exemplo, na classe ContaPoupanca, a taxa de rendimento é comum a todas as contas poupanças Logo, é um atributo estático Atributos ou operações estáticos são representados com um sublinhado. Observe: Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 35 / 549
  36. 36. UML – Diagrama de Classe Visibilidade É possível especificar como os atributos e operações serão vistos no sistema Eis os níveis de visibilidade: (+) PÚBLICO: Todas as classes visualizam (-) PRIVADO: Somente a própria classe visualiza (#) PROTEGIDO: Todas as classes do mesmo pacote e também as subclasses visualizam (∼) PACOTE: Todas as classes do mesmo pacote visualizam Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 36 / 549
  37. 37. UML – Diagrama de Classe Exemplo (hipotético, cunho acadêmico) Somente a própria classe tem acesso direto aos atributos Qualquer classe pode ligar ou desligar o veículo Somente classes do mesmo pacote ou subclasses podem acelerar ou frear o veículo Somente a própria classe pode ativar o ABS Somente classes do mesmo pacote podem saber o consumo do veículo Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 37 / 549
  38. 38. UML – Diagrama de Classe Associação Uma das maneiras de se criar um atributo é através de uma associação Associação é uma linha cheia entre duas classes Logo veremos navegabilidade Por exemplo, uma NotaFiscal possui pelo menos um objeto do tipo ItemNotaFiscal e um ItemNotaFiscal está vinculado a uma única NotaFiscal Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 38 / 549
  39. 39. UML – Diagrama de Classe Observe que não é necessário (nem correto) explicitar que NotaFiscal possui uma coleção de ItemNotaFiscal A própria associação diz isso Código Java correspondente public class NotaFiscal { private Collection<ItemNotaFiscal> itensNotaFiscal; ... } public class ItemNotaFiscal { ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 39 / 549
  40. 40. UML – Diagrama de Classe Navegabilidade É possível definir a navegabilidade de uma associação No exemplo anterior, a navegabilidade é só ocorre de NotaFiscal para ItemNotaFiscal Isto é, o ItemNotaFiscal não sabe a NotaFiscal em que se encontra Nos próximos slides veremos como a navegabilidade muda o projeto Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 40 / 549
  41. 41. UML – Diagrama de Classe Original: Somente a NotaFiscal conhece ItemNotaFiscal Código Java correspondente public class NotaFiscal { private Collection<ItemNotaFiscal> itensNotaFiscal; ... } public class ItemNotaFiscal { ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 41 / 549
  42. 42. UML – Diagrama de Classe Somente o ItemNotaFiscal conhece a NotaFiscal Código Java correspondente public class NotaFiscal { ... } public class ItemNotaFiscal { private NotaFiscal notaFiscal; ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 42 / 549
  43. 43. UML – Diagrama de Classe Ambas as classes se conhecem (Associação Bidirecional) Código Java correspondente public class NotaFiscal { private Collection<ItemNotaFiscal> itensNotaFiscal; ... } public class ItemNotaFiscal { private NotaFiscal notaFiscal; ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 43 / 549
  44. 44. UML – Diagrama de Classe Composição Tipo especial de associação em que se deseja indicar uma ideia de todo e parte A parte não vive sem o todo É representado por um losango preenchido ao lado da entidade que representa o todo No exemplo abaixo, seria impossível existir um ItemNotaFiscal sem estar vinculado a uma NotaFiscal Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 44 / 549
  45. 45. UML – Diagrama de Classe Agregação Tipo especial de associação em que se deseja indicar uma associação mais forte Contudo, a entidade agregada tem vida sozinha É representado por um losango vazio ao lado da entidade que representa o todo No exemplo abaixo, um Motor está agregado a um Carro, mas é possível existir um motor sem estar em um carro Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 45 / 549
  46. 46. UML – Diagrama de Classe Multiplicidade A multiplicidade em uma associação indica o número de objetos que um objeto da classe pode ter de uma outra classe Multiplicidades são números simples ou intervalos de números Tabela : Multiplicidade mais comuns 0..1 Uma instância opcional 1 Exatamente uma instância 0..* Zero ou mais instâncias 1..* Pelo menos uma instância Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 46 / 549
  47. 47. UML – Diagrama de Classe Casamento Tradicional Poliginia Poliandria ??? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 47 / 549
  48. 48. UML – Diagrama de Classe Classes Associativas Algumas associações de muitos para muitos exige a necessidade da criação de uma classe associativa entre as duas classes associadas No exemplo abaixo existe a classe Paciente com seus atributos e a classe Exame com seus atributos. Do relacionamento entre Paciente e Exame, tem-se a data da realização e o diagnóstico Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 48 / 549
  49. 49. UML – Diagrama de Classe Classes Associativas Observe que a classe Consulta que “liga” as classes Paciente e Exame Código Java correspondente public class Paciente { ... } public class Exame { ... } public class Consulta { private Paciente paciente; private Exame exame; ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 49 / 549
  50. 50. UML – Diagrama de Classe Otimização Por motivos de desempenho, talvez seja importante manter uma lista de Consulta em Paciente e em Exame Por exemplo, do modo abaixo é mais eficiente obter as consultas de um certo paciente No entanto, seja cauteloso em manter objetos sincronizados public class Paciente { private Collection<Consulta> consultas; } public class Exame { private Collection<Consulta> consultas; } public class Consulta { private Paciente paciente; private Exame exame; ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 50 / 549
  51. 51. UML – Diagrama de Classe Generalização Trata-se da ação de uma classe herdar toda a estrutura de uma outra classe Uma subclasse sempre herda de sua superclasse: Atributos Operações Relacionamentos Uma subclasse pode: Adicionar atributos e operações Adicionar relacionamentos Sobrepor (override) operações herdadas Sobrecarregar (overload) operações herdadas A herança é completa, isto é, não tem como uma classe herdar somente certos atributos ou operações Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 51 / 549
  52. 52. UML – Diagrama de Classe ContaCorrente e ContaPoupanca herdam Conta Isto é, são subclasses imediatas de Conta Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 52 / 549
  53. 53. UML – Diagrama de Classe ContaCorrente e ContaPoupanca herdam Conta Isto é, são subclasses imediatas de Conta Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 52 / 549 Algo que pode ser melhorado neste diagrama?
  54. 54. UML – Diagrama de Classe Classe Abstrata Se for um bom observador, percebeu que a classe Conta no último slide estava em itálico Isso indica que a classe é abstrata Uma classe abstrata é uma classe que não tem instâncias É utilizada somente como mecanismo de reúso e para provêr a capacidade polimórfica Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 53 / 549
  55. 55. UML – Diagrama de Classe Pacotes Os pacotes em um diagrama de classes são altamente utilizados, pois, na implementação do sistema, a organização das classes são sempre feitas utilizando pacotes Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 54 / 549
  56. 56. UML – Diagrama de Classe Notas e comentários Como em qualquer diagrama UML, podem ser inseridos notas e comentários Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 55 / 549
  57. 57. UML – Diagrama de Classe Cuidado Diagrama de Classes não é um modelo ER O maior perigo com os diagramas de classes é que você pode focar exclusivamente na estrutura e ignorar o comportamento Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 56 / 549
  58. 58. UML – Diagrama de Classe Exercício de Fixação 01 A gráfica ABC trabalha com diversos autores que escrevem os livros que ela publica. Alguns autores escreveram apenas um livro, enquanto outros já escreveram vários. Além disso, alguns livros foram escritos por vários autores, porém um livro deve possuir pelo menos um autor. A gráfica ABC trabalha também com diversas impressoras, porém um livro só pode ser impresso em uma única impressora. Deve ser possível buscar os livros de um autor, saber qual foi a impressora em que o livro foi impresso, saber a quantidade de páginas que uma impressora já imprimiu e a quantidade de páginas que ela imprimiu de um determinado livro, entre outros. Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 57 / 549
  59. 59. UML – Diagrama de Classe Exercício de Fixação 01 – Solução Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 58 / 549
  60. 60. UML – Diagrama de Classe Exercício de Fixação 02 Um veículo tem chassi, modelo, peso, ano de fabricação. Um veículo não existe por si só, ele deve ser um avião ou um carro. Todo veículo liga e desliga. Um carro acelera e frea e um avião decola, voa e pousa. Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 59 / 549
  61. 61. UML – Diagrama de Classe Exercício de Fixação 03 Um imóvel possui um endereço, área (em m2 ) e um proprietário. O imóvel pode ser uma casa ou um apartamento. Caso seja casa, possuirá também o número do registro do lote e, caso seja apartamento, possuirá o número do andar e um flag indicando se possui ou não elevador. Um proprietário possui cpf, nome e telefone. Pelo menos, as seguintes operações devem existir: Alterar a área de um imóvel Alterar o proprietário de um imóvel Alterar o flag se possui ou não elevador do apartamento Recuperar a quantidade de imóveis de um proprietário Alterar o telefone de um proprietário PS: Atenção com os parâmetros e com o tipo de retorno das operações Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 60 / 549
  62. 62. UML – Diagrama de Classe Exercício de Fixação 04 Uma pessoa possui cpf e nome. Um professor é uma pessoa que também possui uma titulação e a IES (Instituição de Ensino Superior) vinculada. Um aluno também é uma pessoa e possui a informação de qual período se encontra e qual o seu curso (um curso possui um registro do MEC, um nome e sua área de concentração). Uma palestra possui um nome e um assunto e pode ser ministrada por diversos professores. Para cada professor ministrando cada palestra, deve constar a data e a localização (rua, número, bairro, cidade, estado e telefone) deste evento e, um aluno, pode assistir vários eventos. Pelo menos as seguintes operações devem existir: Alterar a área de um imóvel Alterar o nome de uma pessoa Alterar a titulação de um professor Alterar a IES de um professor Alterar o período em curso de um aluno Alterar o curso de um aluno Alterar o registro do MEC de um curso Alterar o nome de uma palestra Alterar a data de um evento Alterar a localização de um evento Alterar o telefone de uma localização Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 61 / 549
  63. 63. 3. Java – Conteúdo 1 Introdução 3 2 UML 22 3 Java 62 Introdução 63 Tipos Básicos 87 Operadores 101 Comandos condicionais 119 Comandos de repetição 138 Arranjos 157 Métodos 172 4 POO 186 5 Padrões de Projeto 359 6 Tópicos Relevantes 389 7 Materiais Complementares 420 8 Extras 510 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 62 / 549
  64. 64. Java Introdução Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 63 / 549
  65. 65. Java – Introdução Logo Mascote – Duke Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 64 / 549
  66. 66. Java – Introdução Objetivos Apaixonar-se por Java Diferenciar: Programação Estruturada (Pascal, C...) Programação Orientada a Objetos (Java, C++...) Pré-requisitos Lógica de Programação Linguagem C Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 65 / 549
  67. 67. Java – Introdução Edições Java Java SE – Java Standard Edition (Versão Atual: 7) www.oracle.com/technetwork/java/javase Java EE – Java Enterprise Edition www.oracle.com/technetwork/java/javaee Java ME – Java Micro Edition www.oracle.com/technetwork/java/javame Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 66 / 549
  68. 68. Java – Introdução Tipos de Aplicações Applets Aplicação que normalmente utiliza o navegador do cliente para prover a interface do usuário Processamento realizado no servidor Applications Dispensa explicação Servlets Execução em servidores web Exemplos: JSP, JSF, Struts etc Midlets Execução em pequenos dispositivos Portlets Execução em portais Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 67 / 549
  69. 69. Java – Introdução Falácias sobre Java Java é muito fácil de aprender Java é muito difícil de aprender Java é um ambiente de programação Todos os programas Java executam em páginas web JavaScript é uma versão mais simples de Java Java é interpretado e, portanto, muito lerdo para aplicações sérias em uma plataforma específica Leia artigo “Análise Comparativa do Código Gerado por Compiladores Java e C++” publicado no SBLP 2010 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 68 / 549
  70. 70. Java – Introdução Principais Características da Linguagem Java Compilação para bytecodes Provê portabilidade (saberemos logo o porquê) Suporte a multi-programação Suporte a threads OO Segura Não existe ponteiros Gerência automática de memória (não existe mais malloc, free etc) Eficiente JIT Compiler, otimizações dinâmicas etc Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 69 / 549
  71. 71. Java – Introdução Java SE – Componentes – Entendimento Visual Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 70 / 549
  72. 72. Java – Introdução Java SE – Componentes API – Application Programming Interface Biblioteca com diversas classe e funções úteis para ser utilizada no desenvolvimento de aplicações JVM – Java Virtual Machine Máquina virtual em que a aplicação Java é executada Contém implementação de toda API Java JRE – Java Runtime Environment Ambiente de execução de aplicativos Java Contém a JVM JDK – Java Development Kit Ambiente de desenvolvimento de aplicativos Java (compilação, depuração etc) Contém o JRE Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 71 / 549
  73. 73. Java – Introdução Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 72 / 549
  74. 74. Java – Introdução Funcionamento Compilador Entrada: código fonte Saída: bytecodes Bytecodes Código intermediário a ser interpretado pela JVM Independente de plataforma JVM Class Loader: carrega o bytecode para a memória Bytecode Verifier: confere a consistência do bytecode Interpreter: interpreta os bytecodes para código de máquina Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 73 / 549
  75. 75. Java – Introdução Java SE – Funcionamento – Entendimento Visual Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 74 / 549
  76. 76. Java – Introdução Hello Terra – Código 1 public class HelloTerra { 3 public static void main( String[] args ) { System.out.println( "Hello Terra!" ); 5 } 7 } Hello Terra – Explicação Superficial Case-sensitive Todo o programa sensível a caixa: A = a Método main Ponto de entrada de uma aplicação Java System.out.println (sop) Impressão em tela Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 75 / 549
  77. 77. Java – Introdução Compilação e Execução Compilar: javac HelloTerra.java Executar: java HelloTerra No entanto, o Eclipse faz tudo para você sem que perceba =) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 76 / 549
  78. 78. Java – Introdução Java e outras linguagens Linguagem realmente orientada por objetos Menos que Eiffel Sintaxe muito baseada na sintaxe de C if, switch, while, do..while, for ... Tipos de dados básicos similares ao da linguagem C Remoção de várias características perigosas de C Ponteiros Aritmética de ponteiros Gerenciamento automático de memória (não existe mais malloc, free etc) API bem completa Web, GUI (Graphical User Interface), Networking etc Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 77 / 549
  79. 79. Java – Introdução Classes Uma vez que vimos Diagrama de Classes, o entendimento fica fácil Define um TAD (Tipo Abstrato de Dados) Contém: atributos (propriedades) métodos (comportamento) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 78 / 549
  80. 80. Java – Introdução Classe Pessoa – Exemplo Simples 1 public class Pessoa { private String nome; 3 public String getNome() { 5 return this.nome; } 7 public void setNome( String nome ) { 9 this.nome = nome; } 11 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 79 / 549
  81. 81. Java – Introdução Estrutura de um Arquivo Java Pacote onde o arquivo se encontra Imports do que o arquivo necessita Classe Pública Apenas uma por arquivo Deve ter o mesmo nome do arquivo Classes Não Públicas Conceito Avançado (não veremos) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 80 / 549
  82. 82. Java – Introdução Estrutura de uma Classe Java Atributos propriedades estáticos depois dinâmicos Construtores como seus objetos são criados ordenados pela quantidade de parâmetros Métodos comportamentos estáticos depois dinâmicos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 81 / 549
  83. 83. Java – Introdução Classe Pessoa – Exemplo Mais Completo package pojo; 2 import java.util.Date; 4 public class Pessoa { 6 public final static String ESPECIE = "Homo Sapiens"; private String nome; 8 private Date dataNascimento; 10 public Pessoa() { } 12 public Pessoa(String nome, Date dataNascimento) { this.nome = nome; 14 this.dataNascimento = dataNascimento; } 16 public String getNome() { 18 return this.nome; } 20 public void setNome( String nome ) { this.nome = nome; 22 } public Date getDataNascimento() { 24 return this.dataNascimento; } 26 public void setDataNascimento( Date dataNascimento ) { this.dataNascimento = dataNascimento; 28 } } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 82 / 549
  84. 84. Java – Introdução Comentários Algumas vezes se deseja explicar um código, explicitar uma informação em linguagem natural Eles não deixam o programa mais lento e seu uso é altamente recomendável Três tipos: Comentário para bloco de linha (semelhante a C) /* blablabla */ Comentário até final de linha (semelhante a C) // blablabla Comentário JavaDoc (gera manual do sistema) /* @author Ricardo Terra */ Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 83 / 549
  85. 85. Java – Introdução Classe Matematica – Exemplo Comentário 1 /** * Classe com atributos e operacoes matematicas 3 * @author Ricardo Terra */ 5 public class Matematica { /** 7 * Atributo PI com apenas 6 casas decimais */ 9 public static final double PI = 3.141569; // Constante PI 11 /** * Metodo que calcula a area de uma circunferencia 13 * @param raio Raio da circunferencia * @return Area da Circunferencia 15 */ public static double areaCircunferencia( double raio ) { 17 /* * A funcao pow da classe Math eleva a uma potencia, 19 * no caso ao quadrado */ 21 return PI * Math.pow( raio, 2 ); } 23 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 84 / 549
  86. 86. Java – Introdução Classe Matematica – JavaDoc gerado Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 85 / 549
  87. 87. Java – Introdução Padrões BluePrints Nomes de classes CamelCase com primeira letra em caixa alta Ex: Animal, AnimalSelvagem, GuardaChuva ... Nome de identificadores, atributos ou métodos CamelCase com primeira letra em caixa baixa Ex: nome, nomeCompleto, comer(), comerMuito() ... Nome de pacotes Sempre em caixa baixa Ex: com.terra.pojo, com.terra.dataaccessobject ... Evitem caracteres especiais: _, -, ç, ã, á, ê, é ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 86 / 549
  88. 88. Java Tipos Básicos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 87 / 549
  89. 89. Java – Tipos Básicos Identificadores Atribuição como em C int valor; double saldo = 324.20; Declaração de uma variável pode ocorrer em qualquer local, evidentemente, antes do uso Diferentemente de C, Pascal, Object Pascal ... Regras de identificador Primeiro caracter deve ser letra, _ ou $ São case-sensitive Logicamente, identificadores deve ser diferente das palavras reservadas da linguagem = de for, while, int ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 88 / 549
  90. 90. Java – Tipos Básicos Tipos Primitivos boolean (1 bit) → true e false char (16 bits sem sinal) → 0 a 65535 byte (8 bits) → -128 a 127 short (16 bits) → -32768 a 32767 int (32 bits) → −231 a 231 − 1 long (64 bits) → −263 a 263 − 1 float (32 bits) → −1.40239846e−46 a 3.40282347e38 double (64 bits) → −4.94065645841246544e−324 a 1.7976931348623157e308 Qualquer outro tipo não citado acima são classes Por exemplo, String, Date são classes Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 89 / 549
  91. 91. Java – Tipos Básicos Exemplo – Observando Limites public static void main( String[] args ) { 2 System.out.printf( "boolean: %b e %bn", Boolean.TRUE, Boolean.FALSE ); 4 System.out.printf( "char: %d e %dn", (int)Character.MIN_VALUE,(int)Character.MAX_VALUE ); 6 System.out.printf( "byte: %d e %dn", Byte.MIN_VALUE, Byte.MAX_VALUE ); System.out.printf( "short: %d e %dn", Short.MIN_VALUE, Short.MAX_VALUE ); 8 System.out.printf( "int: %d e %dn", Integer.MIN_VALUE, Integer.MAX_VALUE ); System.out.printf( "long: %d e %dn", Long.MIN_VALUE, Long.MAX_VALUE ); 10 System.out.printf( "float: %g e %gn", Float.MIN_VALUE, Float.MAX_VALUE ); 12 System.out.printf( "double: %g e %gn", Double.MIN_VALUE, Double.MAX_VALUE ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 90 / 549
  92. 92. Java – Tipos Básicos Tipo char Representa um caractere UNICODE http://www.tamasoft.co.jp/en/general-info/unicode.html Intervalo de 0 a 255 semelhante à tabela ASCII Atribuição: ‘a’, ‘u0040’ ou número Exemplo 1 public static void main( String[] args ) { char ch = ’a’; 3 System.out.println( ch ); /* a */ 5 ch = ’u0040’; System.out.println( ch ); /* @ */ 7 ch = 98; 9 System.out.println( ch ); /* b */ } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 91 / 549
  93. 93. Java – Tipos Básicos Tabela UNICODE (parcial) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 92 / 549
  94. 94. Java – Tipos Básicos Exemplo – Imprimindo Tabela ASCII public static void main( String[] args ) { 2 for ( char ch = 0; ch < 255; ch++ ) { System.out.printf( "%d: %cn", (int) ch, ch ); 4 } } Exemplo – Imprimindo Tabela UNICODE 1 public static void main( String[] args ) { for ( char ch = 0; ch < 65535; ch++ ) { 3 System.out.printf( "%d: %cn", (int) ch, ch ); } 5 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 93 / 549
  95. 95. Java – Tipos Básicos Tipos inteiros – byte, short, int e long Por que não simplificar e utilizar somente long? Modo octal e hexadecimal de atribuição: Quando se insere 0 antes do número indica base octal Ex: 011 equivale a 9 Quando se insere 0x antes do número indica base hexadecimal Ex: 0x18 equivale a 24 Atribuir valores fora do limite requer cast, contudo não ativa exceção (nomenclatura de Java para erro) Ex: byte b = (byte) 128 atribui -128 a b Divisão por 0 ativa exceção (ArithmeticException) Ex: int i = 2/0 ativa exceção em tempo de execução (não em compilação) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 94 / 549
  96. 96. Java – Tipos Básicos Exemplo – Atribuição 1 public static void main( String[] args ) { int i1 = 17; 3 int i2 = 021; int i3 = 0x11; 5 System.out.printf( "%d %d %d", i1, i2, i3 ); 7 } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 95 / 549
  97. 97. Java – Tipos Básicos Tipos de Ponto Flutuante – float e double float → precisão simples Número deverá conter o pós-fixo f ou F Ex: float f = 9.02f ou float f = 9.02F double → precisão dupla Atribuição normal: double d = 9.02 Se desejar, número pode conter o pós-fixo g ou G Ex: double d = 9.02g ou double d = 9.02G Pode-se utilizar notação exponecial Ex: double d = 3.02e2 ou double d = 2.56E-3 Não gera exceção em caso de divisão por 0 1.0 / 0.0 gera ∞ -1.0 / 0.0 gera −∞ 0.0 / 0.0 gera NaN Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 96 / 549
  98. 98. Java – Tipos Básicos Exemplo – Atribuição 1 public static void main( String[] args ) { float f = 3.01f; 3 double d1 = -3.01; double d2 = 3.564e+2; 5 System.out.printf("%g %g %gn", f, d1, d2); 7 double d3 = 1.0/0; 9 double d4 = 0.0/0; System.out.printf("%g %gn", d3, d4); 11 } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 97 / 549
  99. 99. Java – Tipos Básicos Conversão e Promoção Promoção implícita (feita automaticamente) Por exemplo, de int para float Conversão explícita (feita via cast) Por exemplo, de double para int Quando se trabalha com operações com diversos tipos de variáveis, o valor é promovido para a de maior complexidade Exceto, em operações entre variáveis inteiras inferiores ao int em que todos os valores são promovidos para int automaticamente Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 98 / 549
  100. 100. Java – Tipos Básicos Exemplo 1 public static void main( String[] args ) { byte b = (byte) 264; /* Conversao Forcada */ 3 System.out.println( b ); 5 short s = (short) 3.5; /* Conversao Forcada */ System.out.println( s ); 7 int i = b + s; /* b e s se promovem para operar */ 9 System.out.println( i ); 11 float f = 3; /* Promocao Implicita */ System.out.println( f ); 13 double d = 3 / 2; /* Promocao Implicita do Resultado */ 15 System.out.println( d ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 99 / 549
  101. 101. Java – Tipos Básicos Constantes caractere de barra invertida Para a maioria dos caracteres, as aspas simples funcionam bem, porém para enter, tab, esc seria bem complicado representá-los, uma vez que são teclas de ação. Por isto, Java definiu as constantes especiais de barra invertida Constantes especiais mais utilizadas n Nova Linha r Retorno de Carro (CR) t Tabulação horizontal ’ Aspas Simples " Aspas Duplas Barra Invertida Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 100 / 549
  102. 102. Java Operadores Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 101 / 549
  103. 103. Java – Operadores Quatro classes de operadores: Aritméticos Relacionais Lógicos Bit a bit Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 102 / 549
  104. 104. Java – Operadores Tabela de Prioridades Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 103 / 549
  105. 105. Java – Operadores Operadores Artiméticos + - ∗ / % (corresponde ao mod do Pascal) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 104 / 549
  106. 106. Java – Operadores Prioridades e Associatividades normais Parênteses mudam as prioridades 2 + 2 * 4 != (2 + 2) * 4 Operador / Operando inteiros: Divisão Inteira: (7 / 2 = 3) Pelo menos um ponto flutuante: Divisão Fracionária: 7.0 / 2.0 = 3.5 7.0 / 2 = 3.5 7 / 2.0 = 3.5 Operador % Resto de divisão inteira Ex: 4 % 2 = 0 e 5 % 2 = 1 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 105 / 549
  107. 107. Java – Operadores Operadores Aritméticos em Atribuições Compostas Em geral, os operadores aritméticos possuem um operador de atribuição correspondente: Exemplo: A = A + 2 ↔ A += 2 Outros: -= *= /= %= Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 106 / 549
  108. 108. Java – Operadores Exemplo de operadores de atribuição compostos public static void main( String[] args ) { 2 int valor = 10; 4 valor += 10; System.out.printf("%d", valor); /* valor: ? */ 6 valor -= 10; 8 System.out.printf("%d", valor); /* valor: ? */ 10 valor *= 5; System.out.printf("%d", valor); /* valor: ? */ 12 valor /= 10; 14 System.out.printf("%d", valor); /* valor: ? */ 16 valor %= 3; System.out.printf("%d", valor); /* valor: ? */ 18 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 107 / 549
  109. 109. Java – Operadores Operadores Aritméticos de incremento e decremento ++ (incrementa 1) -- (decrementa 1) Exemplos: A = A + 1 ↔ A += 1 ↔ A++ ↔ ++A A = A - 1 ↔ A -= 1 ↔ A-- ↔ --A Posicionamento (vale para ++ e para --) ++ após a variável: pós-incremento (retorna e incrementa) ++ antes da variável: pré-incremento (incrementa e retorna) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 108 / 549
  110. 110. Java – Operadores Exemplos 1 int i = 0; System.out.printf("%d", i++); System.out.printf("%d", i); System.out.printf("%d", --i); 2 int i = 0; System.out.printf("%d", ++i); System.out.printf("%d", i); System.out.printf("%d", i--); System.out.printf("%d", i); Pergunta-se Qual a saída de cada printf? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 109 / 549
  111. 111. Java – Operadores Entendeu mesmo? 1 public static void main( String[] args ) { int i = 0; 3 System.out.printf( "%d", i++ ); System.out.printf( "%d", i-- ); 5 System.out.printf( "%d", --i ); System.out.printf( "%d", i ); 7 i = 6; 9 System.out.printf( "%g", ++i / 2.0 ); } Pergunta-se Qual a saída de cada printf? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 110 / 549
  112. 112. Java – Operadores Operadores Relacionais: == (comparação) != (diferença) < > <= >= Operadores Lógicos: São eles: & (and), | (or) e ! (not) Normalmente, para and e or, utiliza-se operadores de curto circuito que fazem com que a expressão só seja analisada até que seja possível determinar o resultado São eles: && (and) e || (or) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 111 / 549
  113. 113. Java – Operadores Operadores Lógicos de Curto Circuito Ao encontrarem um valor que determine seu resultado, não testam mais as outras condições, isto é, a expressão só será analisada até que seja possível determinar o resultado Exemplo: considere que os métodos a e b retornem booleano a() & b() → executa os dois métodos para obter o resultado a() | b() → executa os dois métodos para obter o resultado a() && b() → se o método a retornar false, o resultado será false e o método b nem será executado a() || b() → se o método a retornar true, o resultado será true e o método b nem será executado Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 112 / 549
  114. 114. Java – Operadores Entendeu mesmo? private static boolean a() { return false; } 2 private static boolean b() { return true; } 4 private static boolean c() { return false; } 6 private static boolean d() { return true; } 8 public static void main( String[] args ) { 10 System.out.printf( "%d", a() & b() & c() & d() ); System.out.printf( "%d", a() && b() && c() && d() ); 12 System.out.printf( "%d", a() || b() || c() || d() ); } Pergunta-se Quais métodos serão executados e qual o retorno dos printf’s das linhas 10, 11 e 12? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 113 / 549
  115. 115. Java – Operadores Tiro no pé! 1 public static void main( String[] args ) { int a = 0; 3 if ( a != 0 & 2 / a > 5 ) { System.out.println( "OK" ); 5 } else { System.out.println( "NOK" ); 7 } } Pergunta-se O programa acima apresenta um erro fatal. Como evitá-lo? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 114 / 549
  116. 116. Java – Operadores Operadores bit a bit: & (and) Ex: 3 & 1 ↔ 0011 & 0001 ↔ 0001 ↔ 1 | (or) Ex: 3 | 1 ↔ 0011 | 0001 ↔ 0011 ↔ 3 ˆ (xor) Ex: 3 ˆ 1 ↔ 0011 ˆ 0001 ↔ 0010 ↔ 2 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 115 / 549
  117. 117. Java – Operadores Operadores bit a bit: ~ (complemento de um) Ex: 3 ↔ ˜0011 ↔ 1100 ↔ 12 << (deslocamento à esquerda) Ex: 4 << 1 ↔ 0100 << 1 ↔ 1000 ↔ 8 >> (deslocamento à direita) Ex: 4 >> 1 ↔ 0100 >> 1 ↔ 0010 ↔ 2 >>> (deslocamento à direita com sinal) Ex: -127 >>> 1 ↔ 2147483584 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 116 / 549
  118. 118. Java – Operadores Desafio public static void main( String[] args ) { 2 int x = 10, y = -2; 4 System.out.println( (-2 * -1) << 3 ); 6 System.out.println( ++x - --y + ((x >> 3) << 2) ); 8 System.out.println( (x % 5) << ((4 % 2) + 4) ); } Pergunta-se Qual a saída de cada printf? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 117 / 549
  119. 119. Java – Operadores Exercícios 10 & 13 ? 10 | 13 ? 10 ˆ 13 ? 0 ? 8 » 1 ? 2 « 2 ? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 118 / 549
  120. 120. Java Comandos condicionais Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 119 / 549
  121. 121. Java – Comandos condicionais Comandos condicionais (if, switch e operador ternário) Comando condicionais são aqueles que dependendo de uma condição executam um bloco, caso a condição não seja atendida, o bloco não será executado Java provê suporte a três comandos condicionais: if switch operador ternário (? :) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 120 / 549
  122. 122. Java – Comandos condicionais Comandos condicionais - if Sintaxe do comando if if ( condicao ) { comando1; comando2; comando3; } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 121 / 549
  123. 123. Java – Comandos condicionais Observações: Os parênteses que envolvem a condição são OBRIGATÓRIOS Diferentemente de Pascal, Delphi (Object Pascal) etc A condição deverá retornar um tipo booleano Os comandos somente serão executados se a condição for verdadeira Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 122 / 549
  124. 124. Java – Comandos condicionais Comandos condicionais - if O uso dos braços NÃO é obrigatório caso seja apenas um único comando Porém, a boa prática recomenda a utilização de braços independente do número de comandos Melhor indentação do código if ( true ) comando; equivale a: if ( true ) { comando; } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 123 / 549
  125. 125. Java – Comandos condicionais Comandos condicionais - if Como faço o conhecido: se verdade então . . . senão . . . if ( condicao ) { comando1; comando2; comando3; } else { comando4; comando5; comando6; } Pergunta-se Quais comandos serão executados se a condição for verdadeira? E se for falsa? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 124 / 549
  126. 126. Java – Comandos condicionais Comandos condicionais - if 1 int a = Teclado.lerInteger( "Digite a" ); int b = Teclado.lerInteger( "Digite b" ); 3 if ( a >= b ) { 5 System.out.printf( "%d e maior ou igual a %d!", a, b ); } else { 7 System.out.printf( "%d e menor que %d!", a, b ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 125 / 549
  127. 127. Java – Comandos condicionais Comandos condicionais - if Comando if podem ser aninhados 1 int nota = Teclado.lerInteger( "Digite uma nota de 0 a 100" ); 3 if ( nota >= 90 ) { System.out.println( "Nota A" ); 5 } else if ( nota >= 80 ) { System.out.println( "Nota B" ); 7 } else if ( nota >= 70 ) { System.out.println( "Nota C" ); 9 } else { System.out.println( "Reprovado" ); 11 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 126 / 549
  128. 128. Java – Comandos condicionais Exemplo if char op = Teclado.lerChar( "Digite um operador (+-/*)" ); 2 if ( op == ’+’ || op == ’-’ ) { 4 System.out.println( "Op. Baixa Prioridade.n" ); } else if ( op == ’/’ || op == ’*’ ) { 6 System.out.println( "Op. Alta Prioridade.n" ); } else { 8 System.out.println( "Caractere Invalido!n" ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 127 / 549
  129. 129. Java – Comandos condicionais Comandos condicionais - switch Na instrução switch, uma variável de tipo primitivo char ou int é comparada com cada valor em questão. Se um valor coincidente é achado, a instrução (ou instruções) depois do teste é executada Sintaxe: switch( variavel ){ case 1: comandoA; break; case 2: comandoB; break; case 3: comandoC; break; default: comandoPadrao; } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 128 / 549
  130. 130. Java – Comandos condicionais Comandos condicionais - switch Se nenhum valor for encontrado, a instrução default é executada O comando break é necessário para quebrar o switch, pois assim que encontrada a opção correta, é executado tudo em seguida Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 129 / 549
  131. 131. Java – Comandos condicionais Comandos condicionais - switch char letra = ’B’; 2 switch ( letra ) { 4 case ’A’: System.out.println( "Entrou em A" ); break; case ’B’: System.out.println( "Entrou em B" ); 6 case ’C’: System.out.println( "Entrou em C" ); break; case ’D’: System.out.println( "Entrou em D" ); break; 8 default: System.out.println( "Entrou em Default" ); } Pergunta-se Qual a saída? E se o valor de letra fosse ’C’? E se fosse ’a’? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 130 / 549
  132. 132. Java – Comandos condicionais Comandos condicionais - switch char letra = ’B’; 2 switch ( letra ) { 4 default: System.out.println( "Entrou em Default"); case ’A’: System.out.println( "Entrou em A" ); break; 6 case ’B’: System.out.println( "Entrou em B" ); break; case ’C’: System.out.println( "Entrou em C" ); break; 8 case ’D’: System.out.println( "Entrou em D" ); break; } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 131 / 549
  133. 133. Java – Comandos condicionais Comandos condicionais - switch char letra = ’b’; 2 switch ( letra ) { 4 case ’A’: System.out.println( "Entrou em A" ); break; case ’B’: System.out.println( "Entrou em B" ); break; 6 default: System.out.println( "Entrou em Default"); case ’C’: System.out.println( "Entrou em C" ); break; 8 case ’D’: System.out.println( "Entrou em D" ); break; } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 132 / 549
  134. 134. Java – Comandos condicionais Exemplo switch char op = Teclado.lerChar( "Digite um operador (+-/*)" ); 2 switch (op){ 4 case ’+’: case ’-’: System.out.println( "Op. Baixa Prioridade.n" ); break; 6 case ’*’: case ’/’: System.out.println( "Op. Alta Prioridade.n" ); break; 8 default: System.out.println( "Caractere Invalido!n" ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 133 / 549
  135. 135. Java – Comandos condicionais Comandos condicionais - Operador Ternário Existem situações cujo uso do if não é “elegante” Por exemplo, suponha que a função max retorne o maior número dentre os dois passados via parâmetros formais private static int max( int a, int b ) { 2 if ( a > b ) { return a; 4 } else { return b; 6 } } 8 public static void main( String[] args ) { 10 System.out.printf( "%d", max( 3, 7 ) ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 134 / 549
  136. 136. Java – Comandos condicionais Comandos condicionais - Operador Ternário O operador ternário é uma expressão, significando que ele devolve um valor O operador ternário é muito útil para condicionais (curtas e simples) e tem o seguinte formato: variável = <condição> ? seTrue : seFalse; A condição pode estar envolvida entre parênteses para facilitar a leitura, contudo não é obrigatório Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 135 / 549
  137. 137. Java – Comandos condicionais Exemplos: int a = 2; int b = 3; int c = ( a > b ) ? a : b; Indica que se a for maior que b, c recebe o valor de a, caso contrário, c recebe o valor de b, isto é, c recebe o maior valor (a ou b) Pergunta-se Qual o valor das variáveis abaixo: int peso = ( 2 != 2 ) ? 80 : 63; char letra = ( 1 == 1 ) ? ’R’ : ’T’; String result = ( max( a, b ) > 10 ) ? "a ou b > 10" : "a e b < 10"; Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 136 / 549
  138. 138. Java – Comandos condicionais Comandos condicionais - Operador Ternário Não necessariamente o retorno do operador ternário deve ser atribuído a uma variável Por exemplo, seu retorno pode ser o retorno de uma função como faz a função max com operador ternário: private static int max( int a, int b ) { return (a > b) ? a : b; } Ou mesmo o retorno pode servir como parâmetro de chamada de uma função: System.out.println( (a > b) ? "a maior!" : "b igual ou menor!" ); System.out.printf( "%d", (a > b) ? a : b ); Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 137 / 549
  139. 139. Java Comandos de repetição Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 138 / 549
  140. 140. Java – Comandos de repetição Comandos repetição (while, do...while e for) Comandos de repetição são utilizados para repetir um bloco de código Java provê suporte a três comandos de repetição: while (enquanto) do...while (faça...enquanto) for (para) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 139 / 549
  141. 141. Java – Comandos de repetição Comandos repetição - while O comando while é utilizado para repetir um bloco de acordo com uma condição É considerado um loop de pré-teste Isto é, testa a condição antes de executar o bloco Sintaxe: while ( condicao ) { comando1; comando2; comandoN; } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 140 / 549
  142. 142. Java – Comandos de repetição Comandos repetição - while int i = 0; while ( i < 10 ) { System.out.printf( "%d", ++i ); } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 141 / 549
  143. 143. Java – Comandos de repetição Comandos repetição - do...while O comando do...while é semelhante ao while, contudo é um comando de repetição de pós-teste Isto é, somente ao final da execução do bloco que se verifica a condição Geralmente, é utilizado quando se deseja testar a condição somente a partir da segunda iteração Por exemplo, uma leitura da opção de um menu. Pede para digitar uma primeira vez. Somente se não digitar uma opção válida que pede para digitar novamente Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 142 / 549
  144. 144. Java – Comandos de repetição Sintaxe: do { comando1; comando2; comandoN; } while ( condicao ); Observe o ponto-e-vírgula após os parênteses da condição. Não o esqueça! Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 143 / 549
  145. 145. Java – Comandos de repetição Comandos repetição - do...while 1 int i = 0; 3 do { System.out.printf( "%d", ++i ); 5 } while ( 1 != 1 ); Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 144 / 549
  146. 146. Java – Comandos de repetição Exemplo int i; 2 do { 4 i = Teclado.lerInteger( "Digite um numero entre 0 e 10: " ); } while ( i < 0 || i > 10 ); 6 System.out.printf( "Numero digitado: %dn", i ); Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 145 / 549
  147. 147. Java – Comandos de repetição Comandos de repetição - for Comando de repetição mais poderoso da linguagem É composta por: Inicialização: executado uma única vez no início do loop Condição: executado sempre antes de cada iteração. Se verdadeira, o bloco é executado. Se falsa, é finalizado Operação : executado sempre ao término de cada iteração Sintaxe for ( inicializacao ; condicao ; operacao ) { comando1; comando2; ... comandoN; } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 146 / 549
  148. 148. Java – Comandos de repetição Exemplo for ( int i = 0; i < 10; i++ ) { 2 System.out.printf( "%d", i ); } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 147 / 549
  149. 149. Java – Comandos de repetição Sintaxe No laço for, a inicialização, condição e operação são todas opcionais Exemplo int i = 0; 2 for ( ; ; ) { /* Sem condicao, admite-se sempre verdade */ 4 System.out.printf( "%d", ++i ); } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 148 / 549
  150. 150. Java – Comandos de repetição Comandos de repetição - for Podemos ter um for dentro de outro, e outro dentro de outro, e outro dentro de outro... for ( int i = 0; i <= 2; i++ ) { 2 for ( int j = 0; j < 2; j++ ) { System.out.printf( "%d %d", i, j ); 4 } } Pergunta-se Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 149 / 549
  151. 151. Java – Comandos de repetição Comandos de repetição - for Um comando for pode ter várias inicializações, uma condição complexa e várias operações Exemplo for ( int i = 1, d = 2 * i; i <= 10 || d == 22; i++, d = i * 2 ) { 2 System.out.printf( "%d - %dn", i, d ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 150 / 549
  152. 152. Java – Comandos de repetição Comando break Inserido dentro de um bloco de repetição (pode também ser while ou do...while) Caso seja executado, o bloco de repetição é finalizado Exemplo int i = 0; 2 for ( ; i < 10; i++ ) { 4 if ( i == 3 ) { break; 6 } System.out.printf( "%d", i ); 8 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 151 / 549
  153. 153. Java – Comandos de repetição Comando continue Inserido dentro de um bloco de repetição Caso seja executado, a iteração atual do bloco de repetição é interrompida e parte para a próxima iteração Exemplo 1 for ( int i = 0; i < 10; i++ ) { if ( i == 3 || i == 5 ) { 3 continue; } 5 System.out.printf( "%d", i ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 152 / 549
  154. 154. Java – Comandos de repetição Comando de repetição - for Logicamente, pode-se utilizar break e continue conjuntamente Exemplo 1 for ( int i = 0; i < 3; i++ ) { if ( i == 1 ) { 3 continue; } 5 for ( int j = 0; j < 2; j++ ) { System.out.printf( "%d %dn", i, j ); 7 break; } 9 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 153 / 549
  155. 155. Java – Comandos de repetição Comando de repetição rotulados Como Java não possui a instrução goto, ele permite que rotule um loop com um nome e assim aplique operações como break e continue sobre um loop específico, isto é, que não seja o mais interno Por exemplo, dependendo uma certa condição de um bloco mais interno, você quer quebrar ou continuar a partir do bloco mais externo Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 154 / 549
  156. 156. Java – Comandos de repetição Exemplo externo: 2 for (int i = 0; i < 3; i++ ) { for (int j = 0; j < 3; j++ ) { 4 if ( i == 1 && j == 1 ) { break externo; 6 } System.out.printf( "%d %dn", i, j ); 8 } } Pergunta-se Qual a saída? E se fosse simplesmente break? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 155 / 549
  157. 157. Java – Comandos de repetição Comandos de repetição – foreach Existe uma sintaxe para o comando for específica para iteração de arranjos, coleções etc Esse for é conhecido como foreach e é abordado logo que falarmos sobre arranjos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 156 / 549
  158. 158. Java Arranjos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 157 / 549
  159. 159. Java – Arranjos Arranjos - Conceito Arranjos – também conhecidos como vetor, array etc – são coleções de um mesmo tipo em sequência Arranjos podem ser de tipos primitivos (char, int, float, double), de objetos, de um outro arranjo, de enumeração... Pode se ter um arranjo de inteiros ou um arranjo de caracteres ou um arranjo de arranjo de pontos flutuantes Contudo, não se pode ter um arranjo que contenha inteiros e pontos flutuantes Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 158 / 549
  160. 160. Java – Arranjos Arranjos - Declaração Declaração: int notas[]; /* Arranjo de inteiros */ char letras[]; /* Arranjo de caracteres */ String nomes[]; /* Arranjo de strings */ A ordem dos colchetes não importa, só não pode ser antes do tipo: String nomes[]; String []nomes; String[] nomes; []String nomes; /* ERRADO */ Observe que isso é só a declaração, isto é, não é alocado espaço algum para os elementos do arranjo Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 159 / 549
  161. 161. Java – Arranjos Arranjos - Instanciação Instanciação utilizando o operador new: int notas[] = new int[5]; /* Alocado 5 inteiros */ char letras[] = new char[10]; /* Alocado 10 caracteres */ String nomes[] = new String[100]; /* Alocado 100 strings */ Ao contrário de linguagens como C, os elementos do arranjo SÃO inicializados automaticamente como a seguir: Inteiros Flutuantes Boolean Objetos Inicializados com: 0 0.0 false null Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 160 / 549
  162. 162. Java – Arranjos Arranjos - Instanciação Pode-se inicializar um arranjo já inserindo valores: int notas[] = { 1, 2, 3, 4, 5 }; char letras[] = { ’A’, ’B’, ’C’ }; String nomes[] = { "Ricardo", "Virgílio", "Ralph" }; A notação acima é mais simples, contudo pode ser mais formal: int notas[] = new int[] { 1, 2, 3, 4, 5 }; char letras[] = new char[] { ’A’, ’B’, ’C’ }; String nomes[] = new String[] { "Ricardo", "Virgílio", "Ralph" }; Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 161 / 549
  163. 163. Java – Arranjos Arranjos - Declaração Um arranjo de tamanho n, tem suas posições indexadas de 0 a n-1. Exemplo: int notas[] = {8,7,8,9,3}; notas[3] = 7; System.out.printf("%d",notas[4]); Para obter o tamanho de um arranjo, basta utilizar o atributo lenght. Exemplo: int tam = notas.length; Caso se indexe uma posição não válida, uma exceção em tempo de execução (ArrayIndexOutOfBoundsException) é ativada e possivelmente o aplicativo será abruptamente encerrado Veremos exceções mais a frente Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 162 / 549
  164. 164. Java – Arranjos Declarando, inicializando e iterando um arranjo de inteiros 1 int notas[] = new int[5]; 3 for ( int i = 0; i < notas.length; i++ ) { notas[i] = Teclado.lerInteger( "Digite notas[" + i + "]" ); 5 } 7 for ( int i = 0; i < notas.length; i++ ) { System.out.printf( "notas[%d] = %dn", i, notas[i] ); 9 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 163 / 549
  165. 165. Java – Arranjos Declarando, inicializando e iterando um arranjo de strings String nomes[] = new String[5]; 2 for ( int i = 0; i < nomes.length; i++ ) { 4 nomes[i] = Teclado.lerString( "Digite nomes[" + i + "]" ); } 6 for ( int i = 0; i < nomes.length; i++ ) { 8 System.out.printf( "nomes[%d] = %sn", i, nomes[i] ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 164 / 549
  166. 166. Java – Arranjos Arranjos - Acesso aos elementos Arranjos permite recuperar ou alterar qualquer um de seus elementos Os arranjos em Java sempre iniciam-se na posição 0 Isto indica que ele termina em uma posição inferior ao tamanho (n-1) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 165 / 549
  167. 167. Java – Arranjos Exemplo char letras[] = new char[10]; 2 letras[0] = ’A’; /* Atribui a 1a posicao do arranjo */ 4 System.out.printf( "%c", letras[0] ); /* Imprime a 1a posicao */ 6 letras[1] = ’B’; letras[2] = ’C’; 8 /* ... */ letras[9] = ’H’; 10 letras[10] = ’I’; /* ERRO */ O erro acima ativa uma exceção do tipo ArrayIndexOutOfBoundsException. Isso pode alterar o funcionamento normal do programa ou até mesmo “derrubá-lo” Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 166 / 549
  168. 168. Java – Arranjos Arranjos Multidimensionais Pode-se criar um arranjo de arranjos O mais comum é o bidimensional que vemos como uma matriz A declaração é somente acrescentar o número de colunas Por exemplo: int matriz[][] = new int[4][3] declara-se uma matriz de 4 linhas e 3 colunas int matriz[][] = {{1,0,0}, {0,1,2}, {2,3,4}, {0,6,7}}; Representação: 1 0 0 0 1 2 2 3 4 0 6 7 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 167 / 549
  169. 169. Java – Arranjos Arranjo Bidimensional - Exemplo Criando uma matriz 3x2, zerando e setando valores 1 int matriz[][] = new int[3][2]; /* Declara uma matriz 3x2 */ 3 for ( int i = 0; i < matriz.length; i++ ) { for ( int j = 0; j < matriz[i].length; j++ ) { 5 matriz[i][j] = 0; } 7 } 9 matriz[0][0] = 1; /* Atribui o valor 1 ao canto superior esquerdo */ matriz[2][1] = 7; /* Atribui o valor 7 ao canto inferior direito */ matriz 1 0 0 0 0 7 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 168 / 549
  170. 170. Java – Arranjos Arranjo Bidimensional – Curiosidade Pode-se criar uma matriz com cada linha de um tamanho 1 int matriz[][]= new int[3][]; /* Cria uma matriz com 3 linhas */ matriz[0]= new int[4]; /* Atribui 4 colunas a linha 0 */ 3 matriz[1]= new int[1]; /* Atribui 1 colunas a linha 1 */ matriz[2]= new int[2]; /* Atribui 2 colunas a linha 2 */ matriz 0 0 0 0 0 0 0 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 169 / 549
  171. 171. Java – Arranjos Exemplo Completo Leitura de cada elemento de uma matriz 2x3 e posterior impressão 1 int matriz[][] = new int[2][3]; 3 for ( int i = 0; i < matriz.length; i++ ) { for ( int j = 0; j < matriz[i].length; j++ ) { 5 matriz[i][j] = Teclado.lerInteger( "Digite matriz[ " + i + "]" + "[" + j + "]" ); 7 } } 9 for ( int i = 0; i < matriz.length; i++ ) { 11 for ( int j = 0; j < matriz[i].length; j++ ) { System.out.printf( "%dt", matriz[i][j] ); 13 } System.out.println(); 15 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 170 / 549
  172. 172. Java – Arranjos Comandos de repetição – foreach Para iterar um arranjo ou uma coleção, geralmente fazemos um for bem conhecido: String nomes[] = { "Ricardo", "Virgilio", "Ralph" }; for ( int i = 0; i < nomes.length; i++ ) { String nomeAtual = nomes[i]; System.out.println( nomeAtual ); } Como esse era um for bem comum, Java provê o foreach que é um for com sintaxe simplificada: String nomes[] = { "Ricardo", "Virgilio", "Ralph" }; for ( String nomeAtual : nomes ) { System.out.println( nomeAtual ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 171 / 549
  173. 173. Java Métodos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 172 / 549
  174. 174. Java – Métodos Até agora, estamos trabalhando com a linguagem Java como se fosse uma linguagem estruturada, isto é, sem a orientação a objetos Criamos uma classe com o método main e fazemos tudo dentro desse método No entanto, mesmo sem termos aprofundado nos conceitos de POO, seria interessante para a familiarização com a linguagem que o método main chamasse outros métodos a fim de deixar o código fonte mais claro e organizado Convém salientar que essa é só uma visão aplicada de métodos quando se trabalha com Java como uma linguagem estruturada Quando abordarmos os conceitos de POO, vamos aprofundar bem mais Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 173 / 549
  175. 175. Java – Métodos Método Sintaxe: [visib] [mod] retorno nome ( < param {, param} > ) { corpo } visib = visibilidade (private, protected ou public) mod = modificadores (static, final, · · · ) Exemplos private static void imprimir() { ... } protected int dobro(int x) { ... } public double somar(double a, double b) { ... } private void listar(int notas[]) { ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 174 / 549
  176. 176. Java – Métodos Diretrizes (por enquanto) Modificador static Como o método main é um método estático, todos os métodos que iremos criar, por enquanto, serão estáticos Lembrem-se que um membro (atributo ou método) estático só acessa membros estáticos Visibilidade private O método main é público, justamente porque a JVM deve ter permissão para acessá-lo e iniciar a aplicação Por enquanto, os métodos que vocês criarem somente serão visíveis pela própria classe Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 175 / 549
  177. 177. Java – Métodos Exemplo 1 public class Bhaskara { 3 public static void main( String[] args ) { ... 5 double d = Math.pow( b, 2 ) - 4 * a * c; ... 7 } } Pergunta-se Porque o cálculo de delta não pode ser um método separado para deixar o código mais legível? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 176 / 549
  178. 178. Java – Métodos Exemplo public class Bhaskara { 2 public static void main( String[] args ) { 4 ... double d = delta( a, b, c ); 6 ... } 8 private static double delta( double a, double b, double c ) { 10 return Math.pow( b, 2 ) - 4 * a * c; } 12 } Resumo Agora, delta é um método privado e estático que pode ser invocada por qualquer método da classe Bhaskara Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 177 / 549
  179. 179. Java – Métodos Um programa Java é uma coleção de classes Classes podem conter diversos métodos A ordem de declaração não importa (ao contrário da linguagem C) Pelo menos uma classe deve possuir o método estático main É a partir dele que a aplicação se inicia Um método pode: receber parâmetros declarar variáveis locais conter instruções executáveis retornar um valor ativar exceção Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 178 / 549
  180. 180. Java – Métodos Exemplo public class Soma { 2 public static void main( String args[] ) { 4 int a = 2, b = 3, total; total = soma( a, b ); 6 System.out.printf( "Soma: %d", total ); 8 } 10 private static int soma( int x, int y ) { return x + y; 12 } 14 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 179 / 549
  181. 181. Java – Métodos Retorno de métodos Um método pode retornar valores de qualquer tipo, exceto outros métodos Um método que retorna nada, deve ter seu retorno declarado como void A expressão que segue o return é o valor retornado não se deve colocar parênteses return x+y; e não return (x+y); O valor de retorno pode ser ignorado Término de métodos Ao encontrar a chave de fechamento Ao ser retornado (return) Ao ativar uma exceção Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 180 / 549
  182. 182. Java – Métodos Exemplo public class ImprimeNome { 2 public static void main( String args[] ) { 4 String nome = "Ricardo"; imprimeRetornandoTamanho( nome ); 6 } 8 private static int imprimeRetornandoTamanho( String nome ) { System.out.println( nome ); 10 return nome.length(); } 12 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 181 / 549
  183. 183. Java – Métodos Exercícios fatorial escreveMaior Recebe n e imprime: n > n-1 > n-2 > · · · > 1 > 0 retornaMenorElemento retornaMaiorElemento retornaMedia Fazer com for e com foreach Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 182 / 549
  184. 184. Java – Métodos Solução fatorial 1 public class Fatorial { 3 public static void main( String args[] ) { int n = Teclado.lerInteger( "Digite n" ); 5 System.out.printf( "%d! = %d", n, fat( n ) ); } 7 private static long fat( int n ) { 9 long res = 1; if ( n == 0 || n == 1 ) { 11 return 1; } 13 for ( int i = 2; i <= n; i++ ) { res *= i; 15 } return res; 17 } 19 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 183 / 549
  185. 185. Java – Métodos Solução escreveMaior public class EscreveMaior { 2 public static void main( String args[] ) { 4 int n = Teclado.lerInteger( "Digite n" ); escreveMaior( n ); 6 } 8 private static void escreveMaior( int n ) { for ( int i = n; i >= 0; i-- ) { 10 System.out.printf( "%d ", i ); System.out.printf( (i > 0) ? "> " : "n" ); 12 } } 14 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 184 / 549
  186. 186. Java – Métodos Solução retornaMenor public class MenorElemento { 2 public static void main( String args[] ) { 4 int v[] = { 2, 4, 5, 1, 3 }; System.out.printf( "Menor el.: %d", retornaMenor( v ) ); 6 } 8 private static int retornaMenor( int v[] ) { int menor = v[0]; 10 int tam = v.length; for ( int i = 1; i < tam; i++ ) { 12 if ( v[i] < menor ) { menor = v[i]; 14 } } 16 return menor; } 18 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 185 / 549
  187. 187. 4. POO – Conteúdo 1 Introdução 3 2 UML 22 3 Java 62 4 POO 186 Conceitos Iniciais 187 Classe java.lang.Object 216 Herança 232 Modificadores 264 Interface 294 Herança Múltipla? 310 Classe Abstrata x Interface 317 Exceção 320 5 Padrões de Projeto 359 6 Tópicos Relevantes 389 7 Materiais Complementares 420 8 Extras 510Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 186 / 549
  188. 188. POO Conceitos Iniciais Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 187 / 549
  189. 189. POO – Conceitos Iniciais Classe Como já foi abordado, “uma classe encapsula características comuns a grupos de objetos.” (Mike O’Docherty, 2005) Pode ser pensada como uma “receita de bolo” Ela diz que tem tamanho, sabor e recheio. O que realmente é pequeno, de chocolate e recheado de morango é um objeto da classe (ou instância da classe) Em OO, uma classe é a menor unidade modular, isto é, tudo deve estar inserido em uma classe Uma classe possui: Atributos (propriedades) Construtores (um tipo especial de método para criação de objetos) Métodos (comportamentos) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 188 / 549
  190. 190. POO – Conceitos Iniciais Declaração de uma Classe public class Conta { ... } Padrão BluePrints Classes sempre devem iniciar com a 1a letra em caixa alta. Por exemplo: Conta, Bhaskara ... Demais palavras em caixa baixa salvo início de novas palavras. Por exemplo: GuardaChuva, ContaCorrente ... Sempre evitem (não usem) caracteres especiais ao programar: _, -, ç, ã, á, ê, é ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 189 / 549
  191. 191. POO – Conceitos Iniciais Atributo Sintaxe: [visib] [mod] tipo nome { = valor-inicial } visib = visibilidade (private, protected ou public) mod = modificadores (static, final, ...) Exemplos public String nome; private double salario = 1000.00; protected int nota; double cor; Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 190 / 549
  192. 192. POO – Conceitos Iniciais Modificadores final Torna o atributo imutável static Torna o atributo estático, isto é, pertence à classe Exemplos /* O cpf nunca será alterado */ private final long cpf; /* Taxa de rendimento compartilhada entre todos os objetos do tipo ContaPoupanca */ private static double taxaRendimento; Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 191 / 549
  193. 193. POO – Conceitos Iniciais Declaração de atributos na classe Conta public class Conta { 2 private static int autoIncremento = 1; private final int numero; 4 private double saldo; private Correntista correntista; 6 ... } Padrão BluePrints Atributos sempre devem iniciar com a 1a letra em caixa baixa. Por exemplo: saldo, nome ... Demais letras em caixa baixa salvo início de novas palavras. Por exemplo: nomeCompleto, registroGeral ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 192 / 549
  194. 194. POO – Conceitos Iniciais Método Sintaxe: [visib] [mod] retorno nome ( < param {, param} > ) { corpo } visib = visibilidade (private, protected ou public) mod = modificadores (static, final, · · · ) Exemplos private static void imprimir() { ... } public double somar(double a, double b) { ... } private void listar(int notas[]) { ... } Padrão BluePrints Mesma regra de atributos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 193 / 549
  195. 195. POO – Conceitos Iniciais Declaração de métodos na classe Conta 1 public class Conta { ... 3 public int getNumero() { return this.numero; 5 } 7 public Correntista getCorrentista() { return this.correntista; 9 } 11 public void setCorrentista( Correntista correntista ) { this.correntista = correntista; 13 } 15 public double getSaldo() { return this.saldo; 17 } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 194 / 549
  196. 196. POO – Conceitos Iniciais Declaração de métodos na classe Conta 1 public boolean retirar( double valor ) { if ( valor <= this.saldo ) { 3 this.saldo -= valor; return true; 5 } return false; 7 } 9 public void depositar( double valor ) { this.saldo += valor; 11 } 13 public boolean transferir( Conta contaDestino, double valor ) { if ( this.retirar( valor ) ) { 15 contaDestino.depositar( valor ); return true; 17 } return false; 19 } } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 195 / 549
  197. 197. POO – Conceitos Iniciais Declaração de métodos na classe Conta public class Conta { 2 ... public int getNumero() { 4 return this.numero; } 6 public Correntista getCorrentista() { 8 return this.correntista; } 10 public void setCorrentista( Correntista correntista ) { 12 this.correntista = correntista; } 14 public double getSaldo() { 16 return this.saldo; } 18 public boolean retirar( double valor ) { 20 if ( valor <= this.saldo ) { this.saldo -= valor; 22 return true; } 24 return false; } 26 public void depositar( double valor ) { 28 this.saldo += valor; } 30 public boolean transferir( Conta contaDestino, double valor ) { Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 196 / 549
  198. 198. POO – Conceitos Iniciais Construtor Tipo especial de método responsável pela criação de objetos Por exemplo, como eu crio uma conta? Como eu crio um correntista? Se você não cria um construtor, Java cria um vazio para você. Esse construtor somente permite que você crie objetos daquela classe utilizando o operador new Contudo, se você cria um construtor, Java não mais cria um vazio para você Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 197 / 549
  199. 199. POO – Conceitos Iniciais Construtor Sintaxe: [visib] nome-da-classe ( < param {, param} > ) { corpo } Diretrizes SOMENTE é chamado na criação de um novo objeto SEMPRE possui o mesmo nome da classe NÃO possui tipo de retorno GERALMENTE é público Observação Atributos final devem SEMPRE ser inicializado em um construtor Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 198 / 549
  200. 200. POO – Conceitos Iniciais Declaração de construtores na classe Conta 1 public class Conta { ... 3 public Conta(Correntista correntista) { this( correntista, 0.0 ); 5 } 7 public Conta(Correntista correntista, double saldo) { this.correntista = correntista; 9 this.numero = autoIncremento++; this.saldo = saldo; 11 } ... 13 } Observação A instrução this( correntista, 0.0 ) invoca o outro construtor passando o correntista e 0.0 Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 199 / 549
  201. 201. POO – Conceitos Iniciais Declaração de construtores na classe Correntista public class Correntista { 2 private final long cpf; private String nome; 4 public Correntista(long cpf, String nome) { 6 this.cpf = cpf; this.nome = nome; 8 } 10 public long getCpf() { return this.cpf; 12 } 14 public String getNome() { return this.nome; 16 } 18 public void setNome( String nome ) { this.nome = nome; 20 } } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 200 / 549
  202. 202. POO – Conceitos Iniciais Criando objetos Um objeto é a concretização de uma classe Em outras palavras, é a instanciação de uma classe O operador new permite que objetos sejam criados a partir de uma classe. Por exemplo: String s = new String("Java é doido demais!"); Date data = new Date( ); Animal girafa = new Girafa("Melman", new Mania("Doença")); O operador new aloca memória no heap da JVM e cria a estrutura básica de um objeto da classe Bem mais fácil que em C Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 201 / 549
  203. 203. POO – Conceitos Iniciais Pergunta-se Suponha uma classe hipotética X em que não foi definido nenhum construtor Como criar um objeto dessa classe? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 202 / 549
  204. 204. POO – Conceitos Iniciais Pergunta-se Suponha uma classe hipotética X em que não foi definido nenhum construtor Como criar um objeto dessa classe? Responde-se new X() Pois, como não foi criado nenhum construtor, Java cria um vazio automaticamente Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 202 / 549
  205. 205. POO – Conceitos Iniciais Como criar um objeto da classe Correntista? A classe Correntista só tem um construtor, logo o único modo é: new Correntista( 123, "Ricardo Terra" ) /* valores hipotéticos */ Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 203 / 549
  206. 206. POO – Conceitos Iniciais Como criar um objeto da classe Conta? Inicialmente, qualquer construtor da classe Conta requer um objeto da classe Correntista. Logo: Correntista c = new Correntista( 123, "Ricardo Terra" ) Assim: new Conta( c ) new Conta( c, 1000.00 ); Caso não tenha um objeto da classe Correntista, você pode ser um pouco “ousado”: new Conta( new Correntista( 456, "Maria" ) ) new Conta( new Correntista( 456, "Maria" ), 1000.00 ) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 204 / 549
  207. 207. POO – Conceitos Iniciais Métodos Acessores Na maioria das vezes, opta-se por criar atributos privados e para modificá-los criam-se métodos acessores (getters e setters) Isto faz com que não se tenha acesso direto aos atributos, mas conseguindo obtê-los e modificá-los Esses métodos acessores seguem o seguinte padrão: Método setter se chama setNomeAtributo. Além disso, retorna void e possui um único parâmetro formal do mesmo tipo do atributo Método getter se chama getNomeAtributo. Além disso, retorna o mesmo tipo do atributo e não possui parâmetro formal Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 205 / 549
  208. 208. POO – Conceitos Iniciais Exemplo – Métodos Acessores em Correntista 1 public class Correntista { private final long cpf; 3 private String nome; 5 public Correntista(long cpf, String nome) { this.cpf = cpf; 7 this.nome = nome; } 9 public long getCpf() { 11 return this.cpf; } 13 public String getNome() { 15 return this.nome; } 17 public void setNome( String nome ) { 19 this.nome = nome; } 21 } Pergunta-se Onde está o setCpf? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 206 / 549
  209. 209. POO – Conceitos Iniciais Referência this this é uma referência ao objeto corrente É um boa prática, logo deve SEMPRE ser utilizado Além de boa prática, resolve problema de escopos: 1 public class ExemploThis { private int x = 2; 3 public void m() { 5 int x = 4; System.out.printf( "%d", x ); 7 System.out.printf( "%d", this.x ); } 9 } Qual a saída? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 207 / 549
  210. 210. POO – Conceitos Iniciais Exemplo Completo 1 public static void main( String[] args ) { Correntista eu = new Correntista( 123, "Ricardo" ); 3 Conta minhaConta = new Conta( eu, 2000 ); 5 Conta contaDela = new Conta( new Correntista( 456, "Maria" ) ); 7 System.out.printf( "%d %s %.2fn", minhaConta.getNumero(), minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() ); 9 System.out.printf( "%d %s %.2fn", contaDela.getNumero(), contaDela.getCorrentista().getNome(), contaDela.getSaldo() ); 11 contaDela.depositar( 500.00 ); 13 if ( !contaDela.retirar( 600 ) ) { 15 contaDela.retirar( contaDela.getSaldo() ); } 17 minhaConta.transferir( contaDela, 0.5 * minhaConta.getSaldo()); 19 System.out.printf( "%d %s %.2fn", minhaConta.getNumero(), 21 minhaConta.getCorrentista().getNome(), minhaConta.getSaldo() ); System.out.printf( "%d %s %.2fn", contaDela.getNumero(), 23 contaDela.getCorrentista().getNome(), contaDela.getSaldo() ); } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 208 / 549
  211. 211. POO – Conceitos Iniciais Problemas Comuns (merecem atenção redobrada) Um atributo final deve ser iniciado uma única vez e deve ser feito em um construtor Por isso, é importante utilizar this para chamar um outro construtor dentro de um construtor Não se utiliza this para acessar um membro (atributo ou método) estático (static) Por exemplo, o atributo estático autoIncremento ou é utilizado sem this ou Conta.autoIncremento Um membro estático não pode utilizar this Como ele não faz parte de nenhum objeto, um membro estático só pode utilizar membros estáticos Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 209 / 549
  212. 212. POO – Conceitos Iniciais Problemas Comuns (merecem atenção redobrada) Suponha que a classe Pessoa não tenha construtor algum definido. Para criar um objeto do tipo Pessoa, basta: new Pessoa() No entanto, suponha que tenha criado um construtor dizendo que pessoa deve ter um nome. Então, o único modo de criar pessoa agora é passando o nome: new Pessoa( "Ricardo Terra" ) new Pessoa() /* não funciona mais */ Lembre-se, Java só cria o construtor vazio se você não criar construtor algum Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 210 / 549
  213. 213. POO – Conceitos Iniciais Problemas Comuns (merecem atenção redobrada) E se eu quiser que uma pessoa possa ser criada sem nada ou com o nome? 1 public class Pessoa { private String nome; 3 public Pessoa() { 5 } 7 public Pessoa(String nome) { this.nome = nome; 9 } 11 public String getNome() { return nome; 13 } 15 public void setNome( String nome ) { this.nome = nome; 17 } } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 211 / 549
  214. 214. POO – Conceitos Iniciais Dicas para evitar problemas Não crie método acessor setter para atributos final Não funcionará, eles não mudam É importante inicializar todos os atributos no construtor Pode gerar problemas como valores indesejados ou exceções (futuro) Siga a ordem de declaração na classe Primeiro atributos, depois construtores e depois métodos Siga o padrão de nomenclatura Faça comentários a todo momento Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 212 / 549
  215. 215. POO – Conceitos Iniciais Exercício de Fixação 01 Pratique os conceitos de OO aprendidos no BlueJ implementando o seguinte modelo UML: Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 213 / 549
  216. 216. POO – Conceitos Iniciais Exercício de Fixação 02 Pratique os conceitos de OO aprendidos no BlueJ implementando o seguinte modelo UML: Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 214 / 549
  217. 217. POO – Conceitos Iniciais Resumo Classe e Objeto Declaração de atributos, métodos e construtores Associação de classes Modificadores de visibilidade Modificador static Modificador final (em atributos) Reúso Referência this Encapsulamento (métodos acessores) Instanciação (operador new) Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 215 / 549
  218. 218. POO Classe java.lang.Object Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 216 / 549
  219. 219. POO – Classe java.lang.Object Em Java, todas as classes são subclasses de java.lang.Object Logo, as seguintes declarações da classe A são equivalentes: public class A { ... } public class A extends Object { ... } Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 217 / 549
  220. 220. POO – Classe java.lang.Object Capacidade Polimórfica Isto proporciona a capacidade polimórfica de qualquer classe Java, uma vez que qualquer objeto pode ser tratado como Object Na verdade, a capacidade polimórfica se dá pela herança Exemplo 1 Object v[] = new Object[] { "String", 2, new A(), new Date() }; 3 for ( Object o : v ) { System.out.println( o ); 5 } Pergunta-se 2 é objeto? Qual será a saída do programa? Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 218 / 549
  221. 221. POO – Classe java.lang.Object Herança Toda classe Java já possui implementados diversos métodos herdados da classe Object Os seguintes métodos são os mais relevantes: equals hashCode toString finalize Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 219 / 549
  222. 222. POO – Classe java.lang.Object Método toString Assinatura: public String toString () Ao imprimir um objeto, é impresso o string retornado por esse método Pessoa p = new Pessoa ("Ricardo", 21); System.out.println( p ); Se esse método não for sobrescrito, ele imprime o nome qualificado1 da classe, @ e hashcode Por exemplo: com.terra.pojo.Pessoa@19821f No entanto, se sobrescrito, pode retornar o que desejar Por exemplo: Ricardo tem 21 anos 1 pacote + nome da classe Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 220 / 549
  223. 223. POO – Classe java.lang.Object Método equals Assinatura: public boolean equals (Object o) Basicamente, compara a igualdade de dois objetos Pessoa p1 = new Pessoa ("Ricardo", 21); Pessoa p2 = new Pessoa ("Ricardo", 21); System.out.println( p1.equals( p2 ) ); Se esse método não for sobrescrito, ele verifica se ambos objetos ocupam a mesma posição de memória. Logo, no exemplo, retornará false No entanto, se sobrescrito para comparar os valores de seus atributos, no exemplo, possivelmente retornará true Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 221 / 549
  224. 224. POO – Classe java.lang.Object Método hashCode Assinatura: public int hashCode () Esse método retorna código hash. Um código hash pode ser um número inteiro, positivo ou negativo. Objetos iguais têm de retornar códigos hash idênticos Indicações: Se o método equals é sobrescrito, o método hash também deve ser Uso: Tabela de Hash Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 222 / 549
  225. 225. POO – Classe java.lang.Object Coletor de Lixo (GC) Em Java, o gerenciamento de memória é realizado automaticamente por um processo chamado Coletor de Lixo (Garbage Colletor – GC) que é executado dentro da JVM Você pode forçar a ativação do GC com System.gc() No entanto, Java poderá ignorar Exemplo String str = "casa"; str = "carta"; System.gc( ); /* talvez ative */ ... Ricardo Terra (rterrabh [at] gmail.com) Linguagem Java Janeiro, 2014 223 / 549
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×