Baixe o app para aproveitar ainda mais
Prévia do material em texto
Programação Orientada a Objetos com Java Ricardo Terra rterrabh@gmail.com Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 1 / 527 CV Nome: Ricardo Terra Email: rterrabh@gmail.com www: ricardoterra.com.br Twitter: rterrabh Lattes: lattes.cnpq.br/ 0162081093970868 Ph.D. (UFMG/UWaterloo) (a ser concluído em Julho/2013), M.Sc. (PUC Minas) Background Acadêmico: UFSJ (desde 2013), FUMEC (3 anos), UNIPAC (1 ano), FAMINAS (3 anos) Profissional: DBA Eng. (1 ano), Synos (2 anos) e Stefanini (1 ano) Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 2 / 527 1. Introdução – Conteúdo 1 Introdução 3 Visão Geral de POO 4 2 UML 22 3 Java 60 4 POO 183 5 Padrões de Projeto 356 6 Tópicos Relevantes 386 7 Materiais Complementares 417 8 Extras 498 Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 3 / 527 Introdução Visão Geral de POO Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 4 / 527 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@gmail.com) POO 11 de março de 2013 5 / 527 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@gmail.com) POO 11 de março de 2013 6 / 527 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@gmail.com) POO 11 de março de 2013 7 / 527 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@gmail.com) POO 11 de março de 2013 8 / 527 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@gmail.com) POO 11 de março de 2013 9 / 527 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@gmail.com) POO 11 de março de 2013 10 / 527 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@gmail.com) POO 11 de março de 2013 11 / 527 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@gmail.com) POO 11 de março de 2013 12 / 527 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@gmail.com) POO 11 de março de 2013 13 / 527 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@gmail.com) POO 11 de março de 2013 14 / 527 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@gmail.com) POO 11 de março de 2013 15 / 527 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@gmail.com) POO 11 de março de 2013 16 / 527 Introdução – Visão Geral de POO Repasso Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 17 / 527 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@gmail.com) POO 11 de março de 2013 18 / 527 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@gmail.com) POO 11 de março de 2013 19 / 527 Introdução – Visão Geral de POO Cavalo (como ele é) Atributos peso altura cor raça ... Operações andar comer puxar carroça relinchar ... RicardoTerra (rterrabh@gmail.com) POO 11 de março de 2013 20 / 527 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@gmail.com) POO 11 de março de 2013 21 / 527 2. UML – Conteúdo 1 Introdução 3 2 UML 22 Diagrama de Classe 23 3 Java 60 4 POO 183 5 Padrões de Projeto 356 6 Tópicos Relevantes 386 7 Materiais Complementares 417 8 Extras 498 Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 22 / 527 UML Diagrama de Classe Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 23 / 527 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@gmail.com) POO 11 de março de 2013 24 / 527 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@gmail.com) POO 11 de março de 2013 25 / 527 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@gmail.com) POO 11 de março de 2013 26 / 527 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@gmail.com) POO 11 de março de 2013 27 / 527 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@gmail.com) POO 11 de março de 2013 28 / 527 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@gmail.com) POO 11 de março de 2013 29 / 527 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@gmail.com) POO 11 de março de 2013 30 / 527 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@gmail.com) POO 11 de março de 2013 31 / 527 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@gmail.com) POO 11 de março de 2013 32 / 527 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@gmail.com) POO 11 de março de 2013 33 / 527 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@gmail.com) POO 11 de março de 2013 34 / 527 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@gmail.com) POO 11 de março de 2013 35 / 527 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@gmail.com) POO 11 de março de 2013 36 / 527 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@gmail.com) POO 11 de março de 2013 37 / 527 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@gmail.com) POO 11 de março de 2013 38 / 527 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@gmail.com) POO 11 de março de 2013 39 / 527 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 mudao projeto Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 40 / 527 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@gmail.com) POO 11 de março de 2013 41 / 527 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@gmail.com) POO 11 de março de 2013 42 / 527 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@gmail.com) POO 11 de março de 2013 43 / 527 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@gmail.com) POO 11 de março de 2013 44 / 527 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@gmail.com) POO 11 de março de 2013 45 / 527 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@gmail.com) POO 11 de março de 2013 46 / 527 UML – Diagrama de Classe Casamento Tradicional Poliginia Poliandria ??? Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 47 / 527 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@gmail.com) POO 11 de março de 2013 48 / 527 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@gmail.com) POO 11 de março de 2013 49 / 527 UML – Diagrama de Classe ContaCorrente e ContaPoupanca herdam Conta Isto é, são subclasses imediatas de Conta Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 50 / 527 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@gmail.com) POO 11 de março de 2013 51 / 527 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@gmail.com) POO 11 de março de 2013 52 / 527 UML – Diagrama de Classe Notas e comentários Como em qualquer diagrama UML, podem ser inseridos notas e comentários Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 53 / 527 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@gmail.com) POO 11 de março de 2013 54 / 527 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@gmail.com) POO 11 de março de 2013 55 / 527 UML – Diagrama de Classe Exercício de Fixação 01 – Solução Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 56 / 527 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@gmail.com) POO 11 de março de 2013 57 / 527 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@gmail.com) POO 11 de março de 2013 58 / 527 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çãoRicardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 59 / 527 3. Java – Conteúdo 1 Introdução 3 2 UML 22 3 Java 60 Introdução 61 Tipos Básicos 85 Operadores 98 Comandos condicionais 116 Comandos de repetição 135 Arranjos 154 Métodos 169 4 POO 183 5 Padrões de Projeto 356 6 Tópicos Relevantes 386 7 Materiais Complementares 417 8 Extras 498 Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 60 / 527 Java Introdução Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 61 / 527 Java – Introdução Logo Mascote – Duke Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 62 / 527 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@gmail.com) POO 11 de março de 2013 63 / 527 Java – Introdução Edições Java Java SE – Java Standard Edition (Versão Atual: 6) 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@gmail.com) POO 11 de março de 2013 64 / 527 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@gmail.com) POO 11 de março de 2013 65 / 527 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@gmail.com) POO 11 de março de 2013 66 / 527 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@gmail.com) POO 11 de março de 2013 67 / 527 Java – Introdução Java SE – Componentes – Entendimento Visual Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 68 / 527 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@gmail.com) POO 11 de março de 2013 69 / 527 Java – Introdução Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 70 / 527 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@gmail.com) POO 11 de março de 2013 71 / 527 Java – Introdução Java SE – Funcionamento – Entendimento Visual Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 72 / 527 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 6= a Método main Ponto de entrada de uma aplicação Java System.out.println (sop) Impressão em tela Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 73 / 527 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@gmail.com) POO 11 de março de 2013 74 / 527 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@gmail.com) POO 11 de março de 2013 75 / 527 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@gmail.com) POO 11 de março de 2013 76 / 527 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@gmail.com) POO 11 de março de 2013 77 / 527 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@gmail.com) POO 11 de março de 2013 78 / 527 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@gmail.com) POO 11 de março de 2013 79 / 527 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@gmail.com) POO 11 de março de 2013 80 / 527 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@gmail.com) POO 11 de março de 2013 81 / 527 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@gmail.com) POO 11 de março de 2013 82 / 527 Java – Introdução Classe Matematica – JavaDoc gerado Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 83 / 527 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@gmail.com) POO 11 de março de 2013 84 / 527 Java Tipos Básicos Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 85 / 527 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 6= de for, while, int ... Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 86 / 527 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@gmail.com) POO 11 de março de 2013 87 / 527 Java – Tipos Básicos Exemplo – Observando Limites public static void main( String[] args ) { 2 System.out.printf( "boolean: %b e %b\n", Boolean.TRUE, Boolean.FALSE ); 4 System.out.printf( "char: %d e %d\n", (int)Character.MIN_VALUE,(int)Character.MAX_VALUE ); 6 System.out.printf( "byte: %d e %d\n", Byte.MIN_VALUE, Byte.MAX_VALUE ); System.out.printf( "short: %d e %d\n", Short.MIN_VALUE, Short.MAX_VALUE ); 8 System.out.printf( "int: %d e %d\n", Integer.MIN_VALUE, Integer.MAX_VALUE ); System.out.printf( "long: %d e %d\n", Long.MIN_VALUE, Long.MAX_VALUE ); 10 System.out.printf( "float: %g e %g\n", Float.MIN_VALUE, Float.MAX_VALUE ); 12 System.out.printf( "double: %g e %g\n", Double.MIN_VALUE, Double.MAX_VALUE ); } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 88 / 527 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@gmail.com) POO 11 de março de 2013 89 / 527 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: %c\n", (int) ch, ch ); 4 } } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 90 / 527 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@gmail.com) POO 11 de março de 2013 91 / 527 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@gmail.com) POO 11 de março de 2013 92 / 527 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 gera ∞ -1/0 gera −∞ 0/0 gera NaN Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 93 / 527 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 %g\n", f, d1, d2); 7 double d3 = 1.0/0; 9 double d4 = 0.0/0; System.out.printf("%g %g\n", d3, d4); 11 } Pergunta-se Qual a saída? Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 94 / 527 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@gmail.com) POO 11 de março de 2013 95 / 527 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@gmail.com) POO 11 de março de 2013 96 / 527 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@gmail.com) POO 11 de março de 2013 97 / 527 Java Operadores Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 98 / 527 Java – Operadores Quatro classes de operadores: Aritméticos Relacionais Lógicos Bit a bit Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 99 / 527 Java – Operadores Tabela de Prioridades RicardoTerra (rterrabh@gmail.com) POO 11 de março de 2013 100 / 527 Java – Operadores Operadores Artiméticos + - ∗ / % (corresponde ao mod do Pascal) Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 101 / 527 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@gmail.com) POO 11 de março de 2013 102 / 527 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@gmail.com) POO 11 de março de 2013 103 / 527 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: 20 */ 6 valor -= 10; 8 System.out.printf("%d", valor); /* valor: 10 */ 10 valor *= 5; System.out.printf("%d", valor); /* valor: 50 */ 12 valor /= 10; 14 System.out.printf("%d", valor); /* valor: 5 */ 16 valor %= 3; System.out.printf("%d", valor); /* valor: 2 */ 18 } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 104 / 527 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@gmail.com) POO 11 de março de 2013 105 / 527 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@gmail.com) POO 11 de março de 2013 106 / 527 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@gmail.com) POO 11 de março de 2013 107 / 527 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@gmail.com) POO 11 de março de 2013 108 / 527 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@gmail.com) POO 11 de março de 2013 109 / 527 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@gmail.com) POO 11 de março de 2013 110 / 527 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@gmail.com) POO 11 de março de 2013 111 / 527 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@gmail.com) POO 11 de março de 2013 112 / 527 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@gmail.com) POO 11 de março de 2013 113 / 527 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@gmail.com) POO 11 de março de 2013 114 / 527 Java – Operadores Exercícios 10 & 13 ? 10 | 13 ? 10 ˆ 13 ? 0 ? 8 » 1 ? 2 « 2 ? Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 115 / 527 Java Comandos condicionais Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 116 / 527 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@gmail.com) POO 11 de março de 2013 117 / 527 Java – Comandos condicionais Comandos condicionais - if Sintaxe do comando if if ( condicao ) { comando1; comando2; comando3; } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 118 / 527 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@gmail.com) POO 11 de março de 2013 119 / 527 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@gmail.com) POO 11 de março de 2013 120 / 527 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@gmail.com) POO 11 de março de 2013 121 / 527 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@gmail.com) POO 11 de março de 2013 122 / 527 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@gmail.com) POO 11 de março de 2013 123 / 527 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@gmail.com) POO 11 de março de 2013 124 / 527 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@gmail.com) POO 11 de março de 2013 125 / 527 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@gmail.com) POO 11 de março de 2013 126 / 527 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@gmail.com) POO 11 de março de 2013 127 / 527 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@gmail.com) POO 11 de março de 2013 128 / 527 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@gmail.com) POO 11 de março de 2013 129 / 527 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@gmail.com) POO 11 de março de 2013 130 / 527 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@gmail.com) POO 11 de março de 2013 131 / 527 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@gmail.com) POO 11 de março de 2013 132 / 527 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@gmail.com) POO 11 de março de 2013 133 / 527 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 maior!" ); System.out.printf( "%d", (a > b) ? a : b ); Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 134 / 527 Java Comandos de repetição Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 135 / 527 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@gmail.com) POO 11 de março de 2013 136 / 527 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@gmail.com) POO 11 de março de 2013 137 / 527 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@gmail.com) POO 11 de março de 2013 138 / 527 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@gmail.com) POO 11 de março de 2013 139 / 527 Java – Comandos de repetição Sintaxe: do { comando1; comando2; comandoN; } while ( condicao ); Observe o ponto-e-vírgula após os parênteses dacondição. Não o esqueça! Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 140 / 527 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@gmail.com) POO 11 de março de 2013 141 / 527 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: %d\n", i ); Pergunta-se Qual a saída? Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 142 / 527 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@gmail.com) POO 11 de março de 2013 143 / 527 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@gmail.com) POO 11 de março de 2013 144 / 527 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@gmail.com) POO 11 de março de 2013 145 / 527 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@gmail.com) POO 11 de março de 2013 146 / 527 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 - %d\n", i, d ); } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 147 / 527 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@gmail.com) POO 11 de março de 2013 148 / 527 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@gmail.com) POO 11 de março de 2013 149 / 527 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 %d\n", i, j ); 7 break; } 9 } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 150 / 527 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@gmail.com) POO 11 de março de 2013 151 / 527 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 %d\n", i, j ); 8 } } Pergunta-se Qual a saída? E se fosse simplesmente break? Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 152 / 527 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@gmail.com) POO 11 de março de 2013 153 / 527 Java Arranjos Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 154 / 527 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@gmail.com) POO 11 de março de 2013 155 / 527 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@gmail.com) POO 11 de março de 2013 156 / 527 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@gmail.com) POO 11 de março de 2013 157 / 527 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@gmail.com) POO 11 de março de 2013 158 / 527 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@gmail.com) POO 11 de março de 2013 159 / 527 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] = %d\n", i, notas[i] ); 9 } Ricardo Terra(rterrabh@gmail.com) POO 11 de março de 2013 160 / 527 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] = %s\n", i, nomes[i] ); } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 161 / 527 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@gmail.com) POO 11 de março de 2013 162 / 527 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@gmail.com) POO 11 de março de 2013 163 / 527 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@gmail.com) POO 11 de março de 2013 164 / 527 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@gmail.com) POO 11 de março de 2013 165 / 527 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@gmail.com) POO 11 de março de 2013 166 / 527 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( "%d\t", matriz[i][j] ); 13 } System.out.println(); 15 } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 167 / 527 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@gmail.com) POO 11 de março de 2013 168 / 527 Java Métodos Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 169 / 527 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@gmail.com) POO 11 de março de 2013 170 / 527 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@gmail.com) POO 11 de março de 2013 171 / 527 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@gmail.com) POO 11 de março de 2013 172 / 527 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@gmail.com) POO 11 de março de 2013 173 / 527 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@gmail.com) POO 11 de março de 2013 174 / 527 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@gmail.com) POO 11 de março de 2013 175 / 527 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@gmail.com) POO 11 de março de 2013 176 / 527 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@gmail.com) POO11 de março de 2013 177 / 527 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@gmail.com) POO 11 de março de 2013 178 / 527 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@gmail.com) POO 11 de março de 2013 179 / 527 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@gmail.com) POO 11 de março de 2013 180 / 527 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@gmail.com) POO 11 de março de 2013 181 / 527 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@gmail.com) POO 11 de março de 2013 182 / 527 4. POO – Conteúdo 1 Introdução 3 2 UML 22 3 Java 60 4 POO 183 Conceitos Iniciais 184 Classe java.lang.Object 213 Herança 229 Modificadores 261 Interface 291 Herança Múltipla? 307 Classe Abstrata x Interface 314 Exceção 317 5 Padrões de Projeto 356 6 Tópicos Relevantes 386 7 Materiais Complementares 417 8 Extras 498Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 183 / 527 POO Conceitos Iniciais Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 184 / 527 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@gmail.com) POO 11 de março de 2013 185 / 527 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@gmail.com) POO 11 de março de 2013 186 / 527 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@gmail.com) POO 11 de março de 2013 187 / 527 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@gmail.com) POO 11 de março de 2013 188 / 527 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@gmail.com) POO 11 de março de 2013 189 / 527 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@gmail.com) POO 11 de março de 2013 190 / 527 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@gmail.com) POO 11 de março de 2013 191 / 527 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@gmail.com) POO 11 de março de 2013 192 / 527 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 ) { 32 if ( this.retirar( valor ) ) { contaDestino.depositar( valor ); 34 return true; } 36 return false; } 38 } Ricardo Terra (rterrabh@gmail.com) POO 11 de março de 2013 193 / 527 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@gmail.com) POO
Compartilhar