Introdução a Linguagem Java

654 visualizações

Publicada em

Material introdutorio sobre a linguagem Java

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

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
654
No SlideShare
0
A partir de incorporações
0
Número de incorporações
11
Ações
Compartilhamentos
0
Downloads
21
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Introdução a Linguagem Java

  1. 1. www.labes.ufpa.br Programação Orientada a Objetos na Linguagem Java Prof. Adailton Magalhães Lima adailton@ufpa.br
  2. 2. www.labes.ufpa.br Parte I Introdução
  3. 3. www.labes.ufpa.br 3 JAVA TIMELINE
  4. 4. www.labes.ufpa.br 4 •  1991 - Criado projeto ‘Oak’, linguagem precedente do Java criada para o mercado de sistemas embarcados •  1994 - Depois de frustradas tentativas de embutir ‘Oak’ em Set-top box de TV, a linguagem é revisada e têm seu compilador mudado de C para ‘Oak’ •  1995 - ‘Oak’ é rebatizada para Java e tem o lançamento oficial •  1998 - Lançado o Java 2: versão 1.2 batizada de Java 2 •  1999 - Lançada versão beta de J2EE •  2000 - Lançado o J2SE 1.3 Cronologia
  5. 5. www.labes.ufpa.br 5 •  2001 - Lançamento do projeto Eclipse e do J2EE 1.3 •  2002 - Lançado Hibernate 1.0 •  2004 - Lançamento do Java 1.5 (Tiger) •  2006 – Lançado o Java 6 •  2007 – Lançado JDK completo como Open Source •  2008 – Java 7 •  2014 – Java 8 Cronologia
  6. 6. www.labes.ufpa.br 6 •  A motivação inicial para Java –  “A necessidade de uma plataforma independente de linguagem que possa ser embutida em vários produtos eletrônicos de consumo como torradeiras e refrigeradores” –  Um dos primeiros projetos utilizando Java foi um controle remoto pessoal para hand-held chamado Star 7. –  Nesta mesma época a World Wide Web e a Internet vinham ganhando popularidade. –  James Gosling e companhia “sacaram” que Java poderia ser também utilizada para programação na Internet. –  Lançaram aí a tecnologia dos Applets Java. Motivação
  7. 7. www.labes.ufpa.br 7 •  JavaScript é uma versão simplificada de Java? Não!! –  JavaScript é uma linguagem de script que pode ser inserida dentro de páginas web –  Foi inventada pela Netscape e originalmente chamada de LiveScript, que tem uma sintaxe parecida (mas que no fundo não tem relação direta com Java) –  Em particular, um programa JavaScript pode modificar um documento no qual está exibido (a página web). Java VS JavaScript
  8. 8. www.labes.ufpa.br 8 •  Com a API Java Advanced Imaging são capturadas as imagens panorâmicas para fotografar a superfície marciana •  Em várias partes do sistema de controle existem aplicações Java que ajudam a comunicação e controle do robô da NASA em Marte •  Em várias partes existem dispositivos embarcados utilizando Java •  Em http://mars.telascience.org pode-se baixar o software Maestro (versão free de parte do código Java em Marte) Java em Marte
  9. 9. www.labes.ufpa.br 9 PLATAFORMA JAVA • O  que  é  Java?   1   • Distribuições   2   • Ambiente  de  Desenvolvimento   3   • Funcionalidades  Java   4   • Fases  de  um  programa  Java   5  
  10. 10. www.labes.ufpa.br 10 •  A tecnologia Java pode ser vista como : – Uma linguagem de programação – Um ambiente de desenvolvimento – Um ambiente para aplicações – Um ambiente de implantação O que é Java?
  11. 11. www.labes.ufpa.br 11 •  Java é uma linguagem de programação Orientada a Objetos com uma sintaxe semelhante a C/C++ e que gera programas multiplataformas. •  Java pode criar qualquer tipo de aplicação que se pode criar com uma linguagem de programação convencional. O que é Java?
  12. 12. www.labes.ufpa.br 12 •  Java permite o desenvolvimento de aplicações para uma série de plataformas. •  É possível ter software Java desde de dispositivos como telefones celulares, até computadores de grande porte, como os mainframes. •  Devido a essa característica, a linguagem Java conta com três conhecidas distribuições para ambientes de desenvolvimento: –  JSE (antigamente J2SE) –  JEE (antigamente J2EE) –  JME (antigamente J2ME) Distribuições
  13. 13. www.labes.ufpa.br 13 JSE (Java Standard Edition) •  É o ambiente de desenvolvimento com uso voltado a micros e servidores •  Essa é a plataforma principal, já que, de uma forma ou de outra, o JEE e o JME têm no JSE sua base. •  Assim, os outros ambientes de desenvolvimento são versões aprimoradas do JSE para as aplicações a que se propõem. •  Por ser a plataforma mais abrangente do Java, o JSE é a mais indicada para quem quer aprender a linguagem. Distribuições
  14. 14. www.labes.ufpa.br 14 JEE (Java Enterprise Edition) •  Contém bibliotecas especialmente desenvolvidas para o acesso a servidores, a sistemas de e-mail, a banco de dados, etc. •  Contém uma série de especificações, cada uma com funcionalidades distintas. Entre elas, tem-se: –  JDBC (Java Database Connectivity), utilizado no acesso a banco de dados; –  Servlets, uma API para o desenvolvimento de aplicações Web. Este recurso "estende" o funcionamento dos servidores Web, permitindo a geração de conteúdo dinâmico nos sites. –  JSP (Java Server Pages), permite script para criação de páginas dinâmicas como uma abstração sobre a tecnologia de Servlets Distribuições
  15. 15. www.labes.ufpa.br 15 JME (Java Micro Edition) •  É o ambiente de desenvolvimento para dispositivos móveis ou portáteis, como telefones celulares e palmtops. •  Como a linguagem Java já era conhecida e a adaptação ao JME não é complicada, logo surgiram diversos tipos de aplicativos para tais dispositivos, como jogos e agendas eletrônicas. •  As empresas saíram ganhando com isso porque, desde que seus dispositivos tenham uma JVM (Máquina Virtual Java), é possível, com poucas modificações, implementar os aplicativos em qualquer aparelho, sendo o único limite a capacidade do hardware. Distribuições
  16. 16. www.labes.ufpa.br 16 •  Em seu ambiente de desenvolvimento, Java provê algumas ferramentas: – Um compilador (javac) – Um interpretador (java) – Um gerador de documentação (javadoc) – Um aplicativo para empacotamento de classes (jar) – Um registro e compilador para aplicações distribuídas (rmiregistry e rmic) – Entre outras funcionalidades Ambiente de Desenvolvimento
  17. 17. www.labes.ufpa.br 17 •  Tecnologias de aplicação Java são tipicamente programas de propósito geral que executam em qualquer máquina onde haja uma ambiente de execução Java (JRE- Java Runtime Environment) •  Existem dois ambientes principais de instalação: 1.  A JRE contém todos os arquivos de classes para os pacotes Java, incluindo classes básicas da linguagem, componentes de GUI, entre outras. 2.  O Web Browser, onde muitos provêem um interpretador Java e um ambiente de execução. Ambiente de Desenvolvimento
  18. 18. www.labes.ufpa.br 18 •  Algumas funcionalidades do Java: – Máquina Virtual – Coletor de Lixo (Garbage Collection) – Segurança de Código Funcionalidades Java
  19. 19. www.labes.ufpa.br 19 •  Máquina Virtual ou Java Virtual Machine (JVM) –  É uma máquina abstrata que é implementada pela emulação de software em tempo real –  Provê a especificação da plataforma de hardware para compilação do código Java •  A JVM interpreta Bytecode –  Bytecode é uma linguagem de máquina especial que pode ser entendida pela JVM –  Esta linguagem é independente de qualquer hardware particular de computador, de tal forma que qualquer computador com um interpretador Java possa executar o programa não importando a máquina em que o código foi compilado. Funcionalidades Java
  20. 20. www.labes.ufpa.br 20 •  Coletor de Lixo ou Garbage Collector (GC): –  A linha de execução do GC é responsável pela liberação de qualquer memória não mais utilizada por programas Java. –  Isto acontece automaticamente durante o tempo de execução do programa Java » VANTAGEM: O programador fica livre da tarefa de alocar e desalocar memória manualmente Funcionalidades Java
  21. 21. www.labes.ufpa.br 21 •  Segurança de Código: •  Segurança de código é provida na implementação da JRE. •  Desta forma, para executar o código, a JRE utiliza o ClassLoader para carregar o código e verifica o código(através do verificador de bytecode) •  O ClassLoader carrega todas as classes, onde determina o layout de memória em tempo de execução, para protegê-la de acesso desautorizado. •  O Verificador de Bytecode procura no formato dos fragmentos do código acessos ilegais que possam violar direitos de acesso aos objetos Funcionalidades Java
  22. 22. www.labes.ufpa.br 22 Editor disco Programa é criado em um editor e armazenado no disco Compilador disco Compilador gera os bytecodes e os armazena no disco Carregador de classes disco O carregador de classes – Class Loader – coloca os bytecodes na memória _______ _______ _______ _______ __ memória Verificador de bytecodes O verificador de bytecodes – Bytecodes Verifier – confirma se todos os bytecodes estão corretos e não violam as restrições de segurança da linguagem Java ________ ________ ________ ______ memória Interpretador O interpretador lê os bytecodes e executa o programa ________ ________ ________ ______ memória FasesdeumprogramaJava Tempo +
  23. 23. www.labes.ufpa.br 23 INSTALAÇÃO E CONFIGURAÇÃO
  24. 24. www.labes.ufpa.br 24 O procedimento de instalação do Java consiste em 3 passos principais: Instalação Instalação  do  JDK   Configuração  do  PATH   Teste  usando  linha  de   comando  
  25. 25. www.labes.ufpa.br 25 •  Instalação do JDK –  Execute o instalador e siga os passos até o fim Instalação
  26. 26. www.labes.ufpa.br 26 Instalação
  27. 27. www.labes.ufpa.br 27 •  Configuração do PATH •  Após a instalação do JDK, é preciso realizar as seguintes etapas adicionais: – Adicionar o diretório bin do jdk no PATH de execução do SO (Sistema Operacional) – Tais etapas variam de acordo com o SO •  A seguir serão apresentados os passos nos sistemas Windows® e Linux Instalação
  28. 28. www.labes.ufpa.br 28 •  Configuração do PATH (LINUX) •  Em Linux, o procedimento para edição do PATH de execução depende do shell que está usando. •  Se está utilizando o Bourne Again shell (que é o default do Linux), adicione a seguinte linha ao final do arquivo ~/.bashrc ou ~/.bash_profile: –  export PATH=/usr/local/jdk/bin:$PATH –  onde ”/usr/local/jdk” pode variar de acordo com a opção de instalação –  DICA: Se está no MacOSX, edite o arquivo ~/.profile com o mesmo comando Linux Instalação
  29. 29. www.labes.ufpa.br 29 •  Configuração do PATH (Windows) •  No Windows, é preciso fazer login como administrador. •  Basta: 1 - iniciar o “Painel de Controle”; 2 - selecionar o ícone “Sistema”; 3 – selecionar a aba “Avançado” Instalação
  30. 30. www.labes.ufpa.br 30 •  Configuração do PATH (Windows)(cont.) 4 - clique no botão “Variáveis de Ambiente”; 5 - navegue até encontrar a propriedade PATH, onde deve-se editar e adicionar o caminho completo do diretório; 6- salvar as configurações. Instalação Editar Para editar o path, basta colocar um “;” ao final do conteúdo e adicionar o caminho do diretório bin do jdk Exemplo: “; C:Arquivos de programasJava jdk1.6.0_03bin” Obs: Sem as aspas
  31. 31. www.labes.ufpa.br 31 •  Teste usando linha de comando •  Independente do SO, em um shell aberto digite: –  java -version •  Pressione ENTER. Você deve visualizar algo parecido com: Instalação
  32. 32. www.labes.ufpa.br 32 PROGRAMA JAVA “HELLO WORLD”
  33. 33. www.labes.ufpa.br 33 Programa “Hello World” public class Hello { /** * Meu primeiro programa Java */ public static void main(String[]args){ //escreve a string “Hello World” na tela System.out.println(“Hello world”); } }
  34. 34. www.labes.ufpa.br 34 ●  Indica o nome da classe que é Hello ●  Em Java, todo código deve ser colocado dentro de uma declaração de classe ●  A classe utiliza o identificador de acesso public, que indica que esta classe é acessível a outras classes de outros pacotes. Definição de Classe public class Hello { /** * Meu primeiro programa Java */
  35. 35. www.labes.ufpa.br 35 ●  As linhas destacadas indicam comentários Java ●  Um comentário: -  U)lizado  para  documentar  uma  parte  de  código   -  É  uma  boa  prá)ca  de  programação  adicionar  comentários  ao   código.   Comentários public class Hello { /** * Meu primeiro programa Java */ … //escreve a string “Hello world” na tela
  36. 36. www.labes.ufpa.br 36 ●  Indica o nome do método Hello que é o principal de um programa Java. ●  O método main é o ponto de partida de um programa Java ●  Todos os programas, exceto pelos Applets, iniciam a partir de um método main. ●  É necessário que a assinatura esteja correta (com um array de string passado como parâmetro). Método main public class Hello { /** * Meu primeiro programa Java */ public static void main( String[] args ){
  37. 37. www.labes.ufpa.br 37 ● O comando System.out.println() escreve o texto passado como parâmetro entre aspas. Comando de escrita public class Hello { /** * My first Java program */ public static void main( String[] args ){ //prints the string “Hello world” on screen System.out.println(“Hello world”);
  38. 38. www.labes.ufpa.br 38 INSTALAÇÃO DE UMA IDE
  39. 39. www.labes.ufpa.br 39 Definição de IDE IDE vem do inglês Integrated Development Environment ou Ambiente Integrado de Desenvolvimento É um programa de computador que reúne características e ferramentas de apoio ao desenvolvimento de software com o objetivo de agilizar este processo. Geralmente facilitam a técnica RAD (de Rapid Application Development, ou "Desenvolvimento Rápido de Aplicativos"), que visa a maior produtividade dos desenvolvedores.
  40. 40. www.labes.ufpa.br 40 •  As características e ferramentas mais comuns encontradas nos IDEs são: –  Editor –  Compilador –  Linker –  Depurador (debugger) –  Modelagem (modelling) –  Geração de código –  Distribuição (deploy) –  Testes Automatizados (automated tests) –  Refatoração (refactoring) Definição de IDE
  41. 41. www.labes.ufpa.br 41 •  Dentre as várias IDES existentes, pode-se destacar as seguintes IDEs que dão apoio ao desenvolvimento em Java: •  IntelliJ IDEA - paga •  Eclipse - livre •  NetBeans - livre •  JBuilder - paga •  Sun Java Studio Enterprise •  Jedit •  BlueJ •  OptimalJ IDEs Java Existentes
  42. 42. www.labes.ufpa.br 42 •  De forma resumida: •  Em geral comparar IDEs é algo polêmico, pois depende muito da necessidade atual de cada desenvolvedor •  Dentre as IDEs pagas, IntelliJ e JBuilder se destacam por oferecer diversos componentes “pré-fabricados” para apoio ao desenvolvimento RAD. •  Dentre as IDEs livres, Eclipse e NetBeans são líderes de mercado IDEs Java Existentes
  43. 43. www.labes.ufpa.br 43 •  A seguir neste curso serão apresentados de forma resumida o processo de instalação do NetBeans e do Eclipse. •  Neste curso, a utilização de uma IDE é necessária para simplificar o processo de c o m p i l a ç ã o e t e s t e d o s c ó d i g o s desenvolvidos IDEs Java Existentes
  44. 44. www.labes.ufpa.br 44 Instalando NetBeans 1- execute o instalador 2- defina componentes 4- confirme instalação 3- confirmar local de instalação 5- feche instalador
  45. 45. www.labes.ufpa.br 45 •  Após instalar, basta executar o aplicativo e terá acesso à interface do usuário: Instalando NetBeans
  46. 46. www.labes.ufpa.br 46 Instalando Eclipse 1- inicie instalação 2- defina local de instalação 3- Aguarde e finalize
  47. 47. www.labes.ufpa.br 47 Instalando Eclipse Após instalar, basta executar o aplicativo e terá acesso à interface do usuário:
  48. 48. www.labes.ufpa.br Parte II Programação Básica
  49. 49. www.labes.ufpa.br 49 Partes básicas de um programa Java • Sentenças  e  Blocos  1   • IdenHficadores  2   • Palavras  Reservadas  3   • Variáveis  4   • Literais  5   • Tipos  PrimiHvos  6  
  50. 50. www.labes.ufpa.br 50 •  Sentença – Uma ou mais linhas de código terminado por um ponto e vírgula – Exemplo: System.out.println(“Hello world”); Sentenças e Blocos
  51. 51. www.labes.ufpa.br 51 •  Bloco –  É uma ou mais sentenças circundada por uma abertura e fechamento de chaves que agrupam as sentenças como uma unidade. –  Blocos de sentenças podem ser encadeados infinitamente. –  É permitida qualquer quantidade de espaços em branco. –  Exemplo: public static void main( String[] args ){ System.out.println("Hello"); System.out.println("world”); } Sentenças e Blocos
  52. 52. www.labes.ufpa.br 52 1. Na criação de blocos, é permitido colocar a chave junto com a sentença. Por exemplo: public static void main( String[] args ){ ou é permitida a chave na próxima linha, como, public static void main( String[] args )‫‏‬ { 2. É recomendada a identacão das sentenças após o início de um bloco. Por exemplo: public static void main( String[] Sentenças e Blocos
  53. 53. www.labes.ufpa.br 53 •  Identificadores –  São tokens que representam nomes de variáveis, métodos, classes, etc. –  Exemplos de identificadores são: Hello, main, System, out. •  Da mesma forma que C e C++, identificadores Java são sensíveis ao caso. –  Isto significa que o identificador Hello não é o mesmo que hello. Identificadores
  54. 54. www.labes.ufpa.br 54 •  Identificadores podem iniciar com uma letra, underscore “_”, ou um sinal de “$”. •  Letras podem ser minúsculas ou MAIUSCULAS •  Caracteres subseqüentes podem ser números de 0 a 9. •  Identificadores não podem utilizar palavras chave do Java, como class, public, void, etc. Identificadores
  55. 55. www.labes.ufpa.br 55 1. Para nomes de classes, recomenda-se por a primeira letra da palavra como maiúsculo: ExemploDeNomeParaClasse 2. Para nomes de métodos e variáveis, a primeira letra deve ser minúscula: esteNomeDeMetodoExemplo Identificadores
  56. 56. www.labes.ufpa.br 56 3. No caso de identificadores com várias palavras, use maiúsculo para iniciar cada palavra exceto a primeira: charArray, fileNumber, ClassName. 4. Evite o uso de underscores no início de identificador como em _read ou _write. Identificadores
  57. 57. www.labes.ufpa.br 57 •  Palavras reservadas são identificadores pré- definidos reservados pelo Java para um propósito específico. •  Não é permitido utilizar palavras chave como nomes de variáveis, classes, métodos, etc. •  A seguir é mostrada uma tabelas com as palavras reservadas do Java Palavras Reservadas
  58. 58. www.labes.ufpa.br 58 Palavras Reservadas *- const e goto são palavras reservadas, mas não são utilizadas atualmente pelo Java
  59. 59. www.labes.ufpa.br 59 •  Uma variável representa um item de dado que é utilizado para armazenar estado de objetos. •  Uma variável contém: –  Tipo de dado •  O tipo de dado indica o tipo de valores que a variável pode possuir. –  Nome •  O nome da variável segue as regras para identificadores. Variáveis
  60. 60. www.labes.ufpa.br 60 •  A declaração de variáveis segue a seguinte estrutura: <tipo de dado> <nome> [=valor inicial]; •  Nota: Valores entre <> são obrigatórios, enquanto valores entre [] são opcionais. Variáveis
  61. 61. www.labes.ufpa.br 61 Variáveis package br.eln.java; public class ExemploDeVariaveis {   public static void main( String[] args ){ //declara um tipo de dado com o nome da variável // result é do tipo de dado boolean boolean result;   //declara um tipo de dado com o nome da variável // option é do tipo de dado char char option; option = 'C'; //atribui 'C' em option   //declara um tipo de dado com o nome da variável /*grade é do tipo de dado double que é inicializado para 0.0 */ double grade = 0.0; } }
  62. 62. www.labes.ufpa.br 62 1. É sempre bom inicializar variáveis na sua declaração. 2. Declare uma variável por linha de código. Por exemplos, a declaração de variáveis a seguir double exam=0; double quiz=10; double grade = 0; é preferível ao invés da seguinte, double exam=0, quiz=10, grade=0; Variáveis
  63. 63. www.labes.ufpa.br 63 Variáveis Tipo de dado Valor Default byte/short/int 0 long 0L float 0.0F double 0.0 boolean false char ‘u0000’ Object null Tabela que mostra os valores default de tipos de variáveis Java:
  64. 64. www.labes.ufpa.br 64 •  Literais são tokens que não são modificados, ou seja, são constantes. •  Diferentes tipos de literais em Java são: –  Literais Inteiros –  Literais de Ponto Flutuante –  Literais Booleanos –  Literais Caracteres –  Literais String Literais
  65. 65. www.labes.ufpa.br 65 Literais Inteiros •  Podem ser definidos em diferentes formatos: –  Decimal (base 10) •  Sem notação especial •  exemplo: 12 –  Hexadecimal (base 16) •  Precedido por 0x ou 0X (zero) •  Exemplo: –  Octal (base 8) •  Precedido por 0 (zero) •  Exemplo: Literais int octal = 014; int octal2= 08; int hexadecimal = 0XC; int hexadecimal2 = 0xD; valor excede escala octal que vai até “07”
  66. 66. www.labes.ufpa.br 66 Literais de Ponto Flutuante •  Representam decimais com partes fracionárias: –  Exemplo: 3.1416 •  Podem ser expressados segundo duas notações: –  Padrão –  Científica‫‏‬ Literais double pFlutuante1 = 583.45; double pFlutuante2 = 58345e-2; // 583.45 double pFlutuante3 = 58345E-2; // 583.45 long pFlutuante4 = 583.45; Java não permite literal de ponto flutuante para long, que não possui ponto flutuantes O uso de “e” e “E” na notação não muda o resultad double ou float
  67. 67. www.labes.ufpa.br 67 Literais Booleanos •  Podem possuir somente dois valores: –  true ou false. Literais boolean bool1 = true; boolean bool2 = false; boolean bool3 = 1; Diferente de outras linguagens, como C/C++, variáveis booleanas podem receber apenas valores booleanos(true/ false), não sendo permitida a utilização de atribuição e testes utilizando números inteiros
  68. 68. www.labes.ufpa.br 68 Literais Caracteres •  No Java, literais caracteres representam um único código Unico de caracteres Caracter Unicode: –  Um caracter com conjunto de 16-bits que substitui o antigo conjunto ASCII de 8-bits –  O Unicode permite a inclusão de símbolos e caracteres especiais de outras linguagens além do inglês. Literais
  69. 69. www.labes.ufpa.br 69 Literais Caracteres •  Por exemplo: –  A letra a é representada como ‘a’. •  Caracteres Especiais Literais Função Caracter Line break ‘n’ Carriage return ‘r’ Backspace ‘b’
  70. 70. www.labes.ufpa.br 70 Literais String •  Literais String representam múltipos caracteres e são cercados por aspas duplas (“ ”) •  Um exemplo de literal string podem ser “Hello World”. Literais
  71. 71. www.labes.ufpa.br 71 •  A linguagem Java define 8 tipos de dados primitivos: –  boolean –  char –  byte –  short –  int –  long ‫‏‬ –  double –  float Tipos Primitivos
  72. 72. www.labes.ufpa.br 72 Booleano •  Um tipo de dado booleano representa dois estados: verdadeiro e falso (true e false). •  Um exemplo é : boolean result = true; •  O exemplo acima declara uma variável chamada result como boolean e atribui o valor true. Tipos Primitivos
  73. 73. www.labes.ufpa.br 73 Caracter •  Um tipo de dado caracter (char) representa um único código de caracter Unicode. •  Seus literais devem estar entre aspas simples (’ ’). •  Por exemplo, ‘a’ //Uma letra a ‘t’ //Tab •  Para representar caracteres especial como ' (aspas simples) ou " (aspas duplas), utilize o caracter (barra invertida). Por exemplo: ''' //Para aspas simples '"' //Para aspas duplas Tipos Primitivos
  74. 74. www.labes.ufpa.br 74 Caracter – Caso String •  Apesar da String não ser um tipo de dado primitivo (é uma Classe), alguns comentários podem ser feitos: –  Uma String representa um tipo de dado que contém múltiplos caracteres. No Java, String é representado por uma classe, não é um tipo de dado primitivo. –  Possui seus literais dentro de aspas duplas (“ ”). –  Por exemplo, String message=“Hello world!”; Tipos Primitivos
  75. 75. www.labes.ufpa.br 75 •  Inteiros – byte, short, int e long •  Tipos de dados inteiros em Java são de 3 formas: 2 //Valor Decimal 2 077 // 0 (zero) indica um valor octal 0xBACC //O 0x (zero e x) indica um valor hexadecimal Tipos inteiros possuem int como tipo de dado default. •  É possível atribuir um valor long adicionando a letra l ou L. •  Por exemplo: 10L Tipos Primitivos Na definição de um valor long, é preferível utilizar L (maiúsculo) ao invés de l (minúsculo), para não confundir com o dígito 1
  76. 76. www.labes.ufpa.br 76 •  Tipos inteiros tem as seguintes escalas de valores: Tipos Primitivos Tipo Tamanho Range byte 8 bits - até -1 short 16 bits - até -1 int 32 bits - até -1 long 64 bits - até -1 7 2 7 2 15 2 15 2 31 2 31 2 63 2 63 2
  77. 77. www.labes.ufpa.br 77 Ponto Flutuante: float e double •  Tipos de ponto flutuante possuem double como tipo de dado default. •  Literais de ponto flutuante incluem decimais: E ou e //(adiciona valor exponencial) F ou f //(atribui valor para float) D ou d //(atribuir valor para double) •  Exemplos são, 3.14 //A simples valor de ponto flutuante (double) 6.02E23 //um grande valor de ponto flutuante 2.718F //um valor float simples 123.4E+306D//um grande valor double com o D redundante Tipos Primitivos
  78. 78. www.labes.ufpa.br 78 Ponto Flutuante: float e double •  Valores de ponto flutuante possuem as seguintes escalas de valores: Tipos Primitivos Tipo Tamanho Range float 32 bits - até -1 double 64 bits - até -1 31 2 63 2 31 2 63 2
  79. 79. www.labes.ufpa.br 79 CLASSES, PACOTES, ATRIBUTOS E MÉTODOS • Definição  de  Classes  1   • Atributos  2   • Métodos  3   • Construtores  4   • Referência  “this”  5   • Modificadores  de  Acesso  6   • Pacotes  7  
  80. 80. www.labes.ufpa.br 80 •  Para definir uma classe, escreve-se: <modificador> class <nome> { <declaracaoDeAtributo>* <declaracaoConstrutor>* <declaracaoMetodo>* } –  Onde: •  <modificador> é um modificador de acesso, onde pode ser combinado com outros tipos de modificadores. Definição de Classes
  81. 81. www.labes.ufpa.br 81 public class RegistroCompra { //mais códigos serão adicionados depois } –  Onde: •  public – significa que a classe é acessível por outras classes fora do mesmo pacote •  class - usado para definir uma classe em Java •  RegistroCompra – um identificador único que descreve a classe Definição de Classes
  82. 82. www.labes.ufpa.br 82 • Pense em um nome apropriado para a classe. Nunca defina nomes como XYZ ou outro nome aleatório. • Recomenda-se que nomes de classes iniciem com uma letra maiúscula • O nome do arquivo da classe deve ter o mesmo nome da classe Java. • Defina um arquivo para cada classe Java definida Definição de Classes
  83. 83. www.labes.ufpa.br 83 •  Atributos em classes Java podem ser de representados por variáveis de 2 tipos: – Tipos de dados primitivos (long, char, int,...) – Referencias para Objetos (String, Pessoa, Carro, etc.) •  Os atributos de uma classe podem ser especificados como: – Variáveis de instância – Variáveis de classe Atributos
  84. 84. www.labes.ufpa.br 84 •  Variáveis de Instância – Pertencem a uma instância de objeto – Valor de um atributo para um objeto é diferente das instâncias para outros objetos •  Variáveis de classes (também chamadas de variáveis membros estáticas)‫‏‬ – Variáveis que pertencem a toda a classe. – Isto significa que eles possuem o mesmo valor para todas as instâncias da mesma classe Atributos
  85. 85. www.labes.ufpa.br 85 Variáveis de Instância public class RegistroCompra { // variáveis de instância private String nomeProduto; private long codigo; private Date validade; private double precoCusto; private double precoVenda; } –  Onde: •  private agora significa que as variáveis são acessadas somente dentro da classe. Outros objetos não podem acessar as variáveis diretamente. Atributos
  86. 86. www.labes.ufpa.br 86 Variáveis de classes (estáticas) public class RegistroCompra { // variáveis de instância private String nomeProduto; private long codigo; private Date validade; private double precoCusto; private double precoVenda; private static int quantidaComprasFechadas; } –  É utilizado o modificador static para indicar que a variável é estática. Atributos
  87. 87. www.labes.ufpa.br 87 • Declare todas as variáveis de instância logo no início da definição da classe • Declare uma variável em cada linha • Use tipos de dados adequados para cada variável • Declare variáveis de instância como privadas e defina métodos de acesso para cada. •  Conceito de encapsulamento Atributos
  88. 88. www.labes.ufpa.br 88 •  Para declarar métodos em Java: <modificador> <tipoDeRetorno> <nome>(<parametros>*) { <sentencas>* } –  onde, •  <modificador> pode assumir diferentes modificadores •  <tipoDeRetorno> pode ser de qualquer tipo (incluindo void)‫‏‬ •  <nome> pode ser qualquer identificador válido •  <parametro> ::= <tipo_parametro> <nome_parametro>[,] Métodos
  89. 89. www.labes.ufpa.br 89 public static int getQuantidaComprasFechadas() { return quantidaComprasFechadas; }   public static void setQuantidaComprasFechadas(int quantidaComprasFechadas) { RegistroCompra.quantidaComprasFechadas = quantidaComprasFechadas; }   public long getCodigo() { return codigo; } public void setCodigo(long codigo) { Métodos
  90. 90. www.labes.ufpa.br 90 • Recomenda-se que nomes de métodos devem iniciar com minúsculo. • Recomenda-se que nomes de métodos representem ações Métodos
  91. 91. www.labes.ufpa.br 91 •  Sobrescrevendo métodos –  Permite um método com mesmo nome mas com parâmetros diferentes, para ter implementação e retorno diferentes –  Pode ser utilizado quando diferentes operações possuem diferentes implementações. •  Sempre lembre que sobrescrever métodos tem as seguintes propriedades: –  O mesmo nome de método –  Diferentes para ou diferente número de parâmetros –  Tipo de retorno pode ser diferente ou o mesmo Métodos
  92. 92. www.labes.ufpa.br 92 •  Construtores são chamados na instanciação de um objeto. •  Os construtores possuem as seguintes propriedades: –  Possuem o mesmo nome da classe –  Aceita modificador de acesso –  Não possuem tipo de retorno –  Não se pode acessar o construtor diretamente, somente através do operador new. Construtores
  93. 93. www.labes.ufpa.br 93 public class RegistroCompra { ..... public RegistroCompra() { //adicionar codigo de inicializacao } ………. Construtores
  94. 94. www.labes.ufpa.br 94 •  A referência this –  refere-se à instância do objeto corrente –  utilizado para acessar variáveis de instância. –  Só é permitido acesso para variáveis de instância e NÃO para variáveis de classe (estáticas) Referência “this”
  95. 95. www.labes.ufpa.br 95 public class RegistroCompra { ..... private long codigo; public void setCodigo(long codigo) { this.codigo = codigo; } ………. Referência “this”
  96. 96. www.labes.ufpa.br 96 •  Existem quatro diferentes tipos de modificadores de acesso em Java: –  public (Menos restritivo)‫‏‬ –  protected –  private (Mais restritivo)‫‏‬ –  default •  Os três primeiros modificadores de acesso são explicitamente escritos em código para indicar o tipo de acesso, o quarto que é default não necessita ser utilizado obrigatoriamente. Modificadores de Acesso
  97. 97. www.labes.ufpa.br 97 Modificadores de Acesso private default/package protected public Mesma Classe Sim Sim Sim Sim Mesmo Pacote Não Sim Sim Sim Pacote diferente (sub-classe) Não Não Sim Sim Pacote diferente (não é sub-classe) Não Não Não Sim
  98. 98. www.labes.ufpa.br 98 •  Um pacote é um agrupamento de tipos relacionados provendo gerência de proteção de acesso e espaço de nomes – Note que tipos refere-se a classes, interfaces, enumerações e tipos de anotações (os dois últimos são novos recursos a partir de Java 5). Pacotes
  99. 99. www.labes.ufpa.br 99 Benefícios: •  Facilita a identificação de classes e interfaces relacionados. •  Os nomes de pacotes devem ser diferentes de existentes, para evitar conflito de espaços de nomes. •  É possível permitir dentro do pacote acesso irrestrito de fora assim como restringir acesso de outros pacotes externos. Pacotes
  100. 100. www.labes.ufpa.br 100 •  Para definir uma classe em um pacote, basta escrever o seguinte na primeira linha do código: package br.java.meupacote; public class MinhaClasse{ ……. } Pacotes
  101. 101. www.labes.ufpa.br 101 Importando Pacotes: •  Para estar habilitado a utilizar classes fora do mesmo pacote que a classe atual pertence é necessário importar explicitamente o pacote das classes. •  Por default, todos os programas Java importam o pacote java.lang.*, o que permite a utilização de String e Integer dentro do programa sem ter importado qualquer pacote. •  A sintaxe de import é: import br.java.meuPacote.*; import br.java.novoPacote.UmaClasse; Pacotes
  102. 102. www.labes.ufpa.br 102 • O pacote java.lang.* é composto por aquelas classes que encapsulam os tipos primitivos da linguagem (Wrapper Classes) Pacotes Boolean - encapsula um primitivo boolean Character - encapsula um primitivo char Double - encapsula um primitivo double Float - encapsula um primitivo float Integer - encapsula um primitivo int Long - encapsula um primitivo long String - encapsula uma cadeia de caracteres
  103. 103. www.labes.ufpa.br 103 HERANÇA, INTERFACES E CASTING • Herança  1   • Classes  Abstratas  2   • Interfaces  3   • CasHng  de  Tipos  4  
  104. 104. www.labes.ufpa.br 104 •  Herança é o conceito aplicado quando um filho para uma classe (também chamado de sub classe) automaticamente herda variáveis e métodos da classe pai (super classe). •  É uma das funcionalidades principais da programação orientada a objetos •  Como benefício, permite o reuso de métodos e atributos, que são automaticamente compartilhados entre classes e subclasses •  Cada subclasse fica responsável por estender e modificar o comportamento herdado Herança
  105. 105. www.labes.ufpa.br 105 •  A palavra chave extends permite a herança em Java •  A sub classe herda todos os membros “public” e “protected” (atributos e métodos) do pai, não importando a qual pacote a sub classe pertence •  Se a sub classe está no mesmo pacote que o pai, ela também herda os membros ”private” (atributos e métodos) do pai Herança public class Funcionario extends Pessoa { private String nomeEmpresa; protected int cargaHoraria; . . . . }
  106. 106. www.labes.ufpa.br 106 •  Os atributos herdados podem ser utilizados diretamente, assim como qualquer atributo. •  É permitido declarar novos atributos na sub classe que não existam na super classe •  É permitido declarar um atributo com o mesmo nome do que existe na super classe, dessa forma escondendo o atributo original (não recomendado). •  A sub classe não tem acesso aos membros privados da classe pai. Mesmo assim, se a super classe tem método público ou protegido para acessar o atributo privados a sub classe poderá ter acesso aos dados. Herança
  107. 107. www.labes.ufpa.br 107 •  Em Java , a classe Object é a “mãe” de todas as classes –  Todas as classes estendem da super classe Object –  A classe Object é a única classe que não tem super classe •  Object define e implementa comportamento comum para todas as classes: –  getClass()‫‏‬ –  equals()‫‏‬ –  toString()‫‏‬ –  … Herança Object   ClasseA   ClasseB   ClasseC  
  108. 108. www.labes.ufpa.br 108 Classes Final –  Classes que não podem ser estendidas –  Para declarar uma classe final: public final NomeClasse { . . . } Métodos Final –  Métodos que não podem ser sobrescritos –  Basta colocar o termo final na definição do método •  Métodos static são automaticamente final Herança
  109. 109. www.labes.ufpa.br 109 •  Uma classe abstrata é uma classe que contém um ou mais métodos abtsratos •  Uma classe abstrata não pode ser instanciada // O seguinte código vai dar erro de compilação MinhaClasseAbstrata a1 = new MinhaClasseAbstrata(); •  Qualquer outra classe (classe concreta) deve prover a implementação dos métodos abstratos Classes Abstratas
  110. 110. www.labes.ufpa.br 110 Classes Abstratas public abstract class SerVivo { public void respira() { System.out.println("Ser vivo respirando..."); } public void come() { System.out.println("Ser vivo comendo..."); } /** * Método abstrato anda() * Este método deve ser implementado por uma classe concreta */ public abstract void anda(); }
  111. 111. www.labes.ufpa.br 111 •  Quando uma classe concreta estende a classe abstrata SerVivo, deve implementar o método abstrato anda(), ou então a subclasse também deve ser uma classe abstrata (e não poderá ser instanciada) Classes Abstratas public class Homem extends SerVivo {   @Override public void anda() { System.out.println("Homem andando ... "); }   }
  112. 112. www.labes.ufpa.br 112 •  Define um modo padrão e público de especificar o comportamento de classes (como um contrato) •  Todos os métodos de uma interface são abstratos •  Uma classe concreta deve implementar a interface •  Isto permite que diferentes classes implementam um comportamento em comum Interfaces
  113. 113. www.labes.ufpa.br CapacitaçãoEletronorte–2007-2008 113 l  Como exemplo, a interface Relacao é definida para representar os métodos que representam a relação natural entre objetos Interfaces public interface Relacao { public boolean maior(Object a, Object b);   public boolean menor(Object a, Object b);   public boolean igual(Object a, Object b); }
  114. 114. www.labes.ufpa.br CapacitaçãoEletronorte–2007-2008 114 Interfaces public boolean igual(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen == bLen); }   public boolean maior(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen > bLen); }   public boolean menor(Object a, Object b) { double aLen = ((Linha) a).getTamanho(); double bLen = ((Linha) b).getTamanho(); return (aLen < bLen); } } public class Linha implements Relacao {   private double x1; private double x2; private double y1; private double y2;   public Linha(double x1, double x2, double y1, double y2) { this.x1 = x1; this.x2 = x2; this.y1 = y1; this.y2 = y2; }   public double getTamanho() { double length = Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); return length; }  
  115. 115. www.labes.ufpa.br CapacitaçãoEletronorte–2007-2008 115 Relacionamento com Classes l  Uma classe concreta pode ter somente uma super classe, mas por outro lado pode implementar várias interfaces -  Java não permite herança múltipla, mas interfaces fornecem uma alternativa. l  Todos os métodos abstratos de todas as interfaces devem ser implementados por uma classe concreta Interfaces
  116. 116. www.labes.ufpa.br 116 Herança entre Interfaces •  Interfaces não fazem parte da hierarquia de classes •  Porém, interface podem ter relacionamentos de herança entre si Interfaces public interface RelacaoAmpliada extends Relacao{ public boolean diferenca(Object a, Object b);   }
  117. 117. www.labes.ufpa.br 117 •  Quando uma instância de objeto é criada de uma classe, pode-se afirmar que o objeto é do “tipo”da classe e das super classes •  Uma instância de objeto de um tipo em particular pode ser utilizada em qualquer lugar onde seu tipo e os super tipos são invocados (incluindo interfaces implementadas) Casting de Tipos
  118. 118. www.labes.ufpa.br 118 •  Exemplo: –  contaCorrente1 é um objeto do tipo de ContaBancaria –  O objeto contaCorrente1 pode ser chamado em qualquer lugar onde uma instância de ContaBancaria é chamada •  Isto permite o chamado polimorfismo Casting de Tipos
  119. 119. www.labes.ufpa.br 119 Casting Implícito •  Uma instância de uma sub classe pode ser atribuída a uma variável de uma super classe através do casting implícito •  Exemple ContaCorrente contCorrente = new ContaCorrente(); Poupanca poupanca = new Poupanca(); ContaBancaria conta = contCorrente; // Casting implícito ContaBancaria conta2 = poupanca; // Casting implícito Object objeto = poupanca; // Casting implícito Casting de Tipos
  120. 120. www.labes.ufpa.br 120 Casting Explícito •  Uma instância de objeto de uma super classe deve ser atribuída a uma variável de uma classe filha através do casting explícito (se não fizer isso é lançado erro de compilação) •  Exemplo: Casting de Tipos ContaBancaria conta = new ContaCorrente(); ContaCorrente contaCorrente = (ContaCorrente) conta; ContaBancaria conta = new Poupanca(); ContaCorrente contaCorrente = (ContaCorrente) conta; Não lança erro de compilação, mas lança erro em tempo de execução
  121. 121. www.labes.ufpa.br 121 Operador instanceof •  É possível checar o tipo de uma instância de objeto utilizando instanceof antes do casting de tipos •  Exemplo ContaBancaria conta1 = new ContaCorrente(); ContaBancaria conta2 = new Poupanca(); if( conta2 instanceof ContaCorrente ) { ContaCorrente contaCorrente = (ContaCorrente) conta2; } Casting de Tipos
  122. 122. www.labes.ufpa.br 122 Exercício
  123. 123. www.labes.ufpa.br 123 – Dado o modelo UML anterior: – Crie classes Java e Atributos • Quando necessário, considere classes abstratas e herança • Diferencie varáveis de instância e de classe • Organize as classes em pacotes Java Exercício
  124. 124. www.labes.ufpa.br 124 ESTRUTURAS DE CONTROLE •  Estruturas  de  Decisão   1   •  Estruturas  de  RepeHção   2   •  Estruturas  de   Redirecionamento  3  
  125. 125. www.labes.ufpa.br 125 •  Em Java existem 3 tipos de estruturas de controle –  Estruturas de controle de decisão •  Permitem selecionar seções específicas do código para serem executadas (if-then-else, swicth) –  Estruturas de controle de repetição •  Permitem executar seções específicas um número repetido de vezes (while, for, do-while) –  Estruturas de controle de redirecionamento •  Permitem redirecionar o fluxo de execução de comandos (break, continue, return ); Estruturas de Controle
  126. 126. www.labes.ufpa.br 126 •  Estruturas de Decisão podem ser dos seguintes tipos: – Sentenças if – Sentenças if-else – Sentenças If-else-if – Sentenças switch Estruturas de Decisão
  127. 127. www.labes.ufpa.br 127 ●  Sentenças if –  Especificam que a sentença (ou bloco de código) será executada somente se uma certa expressão booleana for verdadeira. if( expre_booleana ) sentença; ou if( expre_booleana ){ sentença; sentença; } –  Onde, •  expre_booleana representa uma expressão Estruturas de Decisão
  128. 128. www.labes.ufpa.br 128 Estruturas de Decisão Sentença true false ●  Sentenças if
  129. 129. www.labes.ufpa.br 129 Sentenças if-else –  Utilizadas quando se deseja executar algo quando a sentença é verdadeira, e algo diferentes quando é falsa. if( expre_booleana ){ sentença; } else{ sentença; } Estruturas de Decisão
  130. 130. www.labes.ufpa.br 130 Estruturas de Decisão Sentença true false ●  Sentenças if-else Sentença
  131. 131. www.labes.ufpa.br 131 ●  Sentenças If-else-If •  A sentença em uma cláusula else pode ser outra estrutura if- else. •  Este encadeamento de estruturas permite a criação de seleções mais complexas. if( expre_booleana ){ sentença; } else if( expre_booleana ) { sentença; } else if( expre_booleana ) { sentença; } else { sentença; Estruturas de Decisão
  132. 132. www.labes.ufpa.br 132 Estruturas de Decisão Sentença true false ●  Sentenças if-else-if Sentença true false
  133. 133. www.labes.ufpa.br 133 Erros Comuns 1. Não utilizar uma expressão booelana no if. Por exemplo //ERRADO int number = 0; if( number ){ //alguma sentença } A variável number não possui um valor booleano (Este caso difere Java de C/C++, onde este exemplo acima estaria correto). 2. Escrever elseif (junto) ao invés de else if (separado). Estruturas de Decisão
  134. 134. www.labes.ufpa.br 134 Erros Comuns 3. Utilizar = ao invés de == para comparação. O correto é utilizar: int number = 0; if( number == 0 ){ //alguma sentença } Estruturas de Decisão
  135. 135. www.labes.ufpa.br 135 Sentenças switch –  Permitem múltiplos testes simultâneos. •  Setenças switch possuem a seguite forma: switch( expres_switch){ case seletor1: sentença; break; case seletor2: sentença; break; ..... default: sentença; } Estruturas de Decisão Onde: express_switch: pode ser um valor inteiro ou caracter seletor1..n: um valor inteiro único ou uma constante caracter
  136. 136. www.labes.ufpa.br 136 Estruturas de Decisão break true Sentença false break true Sentença false break true Sentença false Bloco default
  137. 137. www.labes.ufpa.br 137 •  Estruturas de decisão podem ser dos seguintes tipos: – Loop while – Loop do-while – Loop for Estruturas de Repetição
  138. 138. www.labes.ufpa.br 138 Loop while –  É uma sentença ou bloco que é repetido enquanto alguma condição é satisfeita. while( expre_booleana ){ sentença1; sentença2; . . . } –  Enquanto expre_booleana é verdadeira as sentenças do loop são executadas. Estruturas de Repetição
  139. 139. www.labes.ufpa.br 139 Loop do-while –  similar ao loop while –  A principal diferença é: •  Os comandos dentro do loop do-while são executados no mínimo uma vez. do{ sentença1; sentença2; . . . }while( boolean_expression ); Estruturas de Repetição
  140. 140. www.labes.ufpa.br 140 Loop for –  Permite a execução do mesmo código um número específico de vezes. for(expressaoDeInicializacao;condLoop;expressaoEmCadaPasso) { sentença1; sentença2; . . . } Onde: •  expressaoDeInicializacao –inicializa variável de loop. •  condLoop – compara a variável de loop com algum valor limite. •  expressaoEmCadaPasso - atualiza a variável de loop. Estruturas de Repetição
  141. 141. www.labes.ufpa.br 141 •  O código acima é equivalente ao seguinte loop while Estruturas de Repetição int i; for( i = 0; i < 10; i++ ){ System.out.println(i); } int i = 0; while( i < 10 ){ System.out.print(i); i++; } Loop for: Exemplo
  142. 142. www.labes.ufpa.br 142 •  Java possui 3 tipo de estruturas de redirecionamento: – break – continue – return Estruturas de Redirecionamento
  143. 143. www.labes.ufpa.br 143 Break sem marcador –  Finaliza o comando switch atual, e segue o fluxo de controle para a sentença imediatamente posterior ao switch. –  Isto pode também ser aplicado para finalizar um loop for, while ou do-while Estruturas de Redirecionamento for (int i = 0; i < nomes.length; i++) { if (nomeBusca.equals(nomes[i]) { achou=true break; } }
  144. 144. www.labes.ufpa.br 144 •  Break com marcador –  Finalizar um comando externo ao contexto atual, que é identificado por um marcador no comando break. –  O fluxo de controle é transferido para a sentença imediatamente após a sentença marcada. –  O trecho de programa a seguir representa uma busca em um array de duas dimensões. Dois loops encadeados varrem o array. Quando o valor é encontrado o break com marcador finaliza o comando “marcacaoBusca”, que é um loop externo Estruturas de Redirecionamento
  145. 145. www.labes.ufpa.br 145 int[][] numeros = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; int numeroBusca = 5; boolean encontrouNumero = false; marcacaoBusca: for (int i = 0; i < numeros.length; i++) { for (int j = 0; j < numeros[i].length; j++) { if (numeroBusca == numeros[i][j]) { encontrouNumero = true; break marcacaoBusca; } } } if (encontrouNumero) Estruturas de Redirecionamento Break com marcador: Exemplo Finaliza o for externo marcado
  146. 146. www.labes.ufpa.br 146 •  Continue sem marcador –  Simplesmente pula a iteração atual de um loop Estruturas de Redirecionamento String  nomes[]  =  {  "Java",  "C",  "C++",  "Java"  };      int  quan)dade  =  0;          for  (int  i  =  0;  i  <  nomes.length;  i++)  {        if  (nomes[i].equals("Java"))  {          conHnue;  //  pula  o  proximo  comando        }        quan)dade++;      }    System.out.println("Existem  "  +  quan)dade  +  "  nomes  Java  na  lista");  
  147. 147. www.labes.ufpa.br 147 •  Continue com marcador –  Pula a iteração corrente e continua o fluxo para um loop externo devidamente marcado Estruturas de Redirecionamento loopExterno: for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { System.out.println("Dentro do for j"); // mensagem1 if (j == 2) continue loopExterno; } System.out.println("Dentro do for i"); // mensagem2 } Nunca chega exibir a mensagem2 Quantas vezes a mensagem1 é exibida?
  148. 148. www.labes.ufpa.br 148 Return –  Utilizado para sair do método corrente –  Fluxo de controle retorna ao comando que invocou o método originalmente. Estruturas de Redirecionamento public String ComandoReturn(){ return "TextoQualquer"; } Em método void, basta colocar return;
  149. 149. www.labes.ufpa.br 149 TRATAMENTO DE EXCEÇÕES • O  que  é  uma  Exceção?   1   • Tratamento  de  exceções   com  try/catch  2   • Criando  e  Lançando   Exceções  3   • Asserções   4  
  150. 150. www.labes.ufpa.br 150 •  Evento não esperado •  Erro que ocorre em tempo de execução •  Causa ruptura do fluxo normal do programa •  Exemplos –  Erros de divisão por zero –  Acessar elementos de um array além do tamanho –  Entrada inválida –  Pane no disco rígido –  Abertura de arquivo não existente –  Estouro do Heap de memória O que é uma Exceção?
  151. 151. www.labes.ufpa.br 151 O que é uma Exceção? class DivisaoPorZero { public static void main(String args[]) { System.out.println(3/0); System.out.println("me escreva"); } } O código abaixo Gera a seguinte saída:
  152. 152. www.labes.ufpa.br 152 •  Tratador default de exceções: –  Provido pelo runtime Java –  Imprime uma descrição da exceção –  Imprime a pilha de exceções •  Hierarquia de métodos onde a exceção ocorreu –  Faz o programa finalizar •  Quando uma exceção ocorre em um método, o método cria um objeto exceção e lança ao sistema de execução –  Criar um objeto exceção e lançar no sistema de execução é chamado “throwing an exception” –  Objetos de exceção contém informações sobre o erro, incluindo o tipo e o estado do programa quando o erro ocorreu O que é uma Exceção?
  153. 153. www.labes.ufpa.br 153 •  O sistema de execução busca pela pila de chamadas um método que trate a exceção O que é uma Exceção? Método  onde   ocorreu  erro   Método  sem  um   tratador  de  exceção   Método  com  um   tratador  de  exceção   main   Chamada de método Chamada de método Chamada de método
  154. 154. www.labes.ufpa.br 154 •  Buscando um tratador de exceção O que é uma Exceção? Método  onde   ocorreu  erro   Método  sem  um   tratador  de   exceção   Método  com  um   tratador  de   exceção   main   Procura tratador apropriado Procura tratador apropriado Lança exceção Encaminha exceção Captura exceção
  155. 155. www.labes.ufpa.br 155 Tratamento de exceções com try/catch •  U m m é t o d o p o d e organizar suas exceções lançando-as para que um método posterior possa tratá-las. •  Assim, somente métodos que “se importam” com os erros precisam tratá- los •  Q u a l q u e r e x c e ç ã o lançada deve estar explicitamente estar na assinatura do método (utilizando o throws). metodo1 (){ try { metodo2(); } catch (exception e) { processaErro(); } } metodo2 () throws exception { metodo3(); } metodo3 () throws exception { leituraArquivo(); }
  156. 156. www.labes.ufpa.br 156 Tratamento de exceções com try/catch class  DivisaoPorZeroComTry  {        public  staHc  void  main(String  args[])  {        try  {          System.out.println(3  /  0);        System.out.println("me  escreva");      }  catch  (Arithme)cExcep)on  exc)  {        //  Divissao  por  zero  é  uma  Arithme)cExcep)on        System.out.println(exc);      }  finally{        //  Codigo  a  ser  excutado  antes  do  bloco  try  terminar        System.out.println(“passou  pelo  finally  ");      }      System.out.println("Apos  excecao.");    }   }   ●  Exemplo
  157. 157. www.labes.ufpa.br 157 •  Java permite ao programador lançar exceções throw <ObjetoExcecao>; •  Um exceção é um objeto –  É necessário criar uma objeto exceção da mesma forma como se cria qualquer objeto Java •  Exemplo: throw new ArithmeticException(“teste...”); Criando e Lançando Exceções
  158. 158. www.labes.ufpa.br 158 Criando Exceções Próprias •  Criar exceções próprias para um programa cria um mecanismo específico para tratar as exceções no escopo do próprio sistema •  Passos para seguir –  Criar uma classe que estenda a RuntimeException ou a classe Exception –  Customize a classe •  Membros e construtores podem ser adicionados à classe •  Exemplo: class ExcecaoExemplo extends RuntimeException { /* algum codigo */ } Criando e Lançando Exceções
  159. 159. www.labes.ufpa.br 159 Criando e Lançando Exceções class TesteNegaString { public static void main(String args[]) { String input = "entrada invalida"; try { if (input.equals("entrada invalida")) { throw new ExcecaoExemplo(); } System.out.println("Aceitou string."); } catch (ExcecaoExemplo e) { System.out.println("Negou string!"); } } } Lança exceção Captura exceção
  160. 160. www.labes.ufpa.br 160 •  Permitem que o programador verifique se uma condição foi alcançada na execução do programa •  Estende os comentários de tal forma que uma asserção indica ao leitor do código que uma condição particular deve sempre acontecer –  O programa informa se as asserções são verdadeiras ou falsas –  Se uma asserção não é verdadeira, uma AssertionError é lançada •  O usuário tem a opção de desligar a execução da checagem de asserções Asserções
  161. 161. www.labes.ufpa.br 161 Habilitando e Desabilitando Asserções •  Programa com asserções não funciona corretamente em clientes que não habilitam tal propriedade •  Compilação –  Código deve ser compilado com java 1.4 ou superior •  Habilitando asserções: –  Ao invocar o interpretador, utilize a tag ”–enableassertions” ou “–ea”. java –enableassertions MeuPrograma Asserções
  162. 162. www.labes.ufpa.br 162 •  Habilitando e Desabilitando Asserções Asserções Eclipse NetBeans Propriedades
  163. 163. www.labes.ufpa.br 163 Asserções Sintaxe: class AssercaoDeIdade { public static void main(String args[]) { int idade= 0; assert (idade > 0); // : String de saida /* se idade é válida (i.e., idade>0) */ if (idade >= 18) { System.out.println("Você é um adulto! =)"); } } }
  164. 164. www.labes.ufpa.br 164 Exercício
  165. 165. www.labes.ufpa.br 165 – Dado o modelo UML anterior, considere uma operação que lê dados de entrada do usuário e cadastra em banco os dados: – Defina e codifique no mínimo 3 exceções Java que tenha significado ao contexto citado Exercício
  166. 166. www.labes.ufpa.br 166 OPERAÇÕES MATEMÁTICAS E OPERADORES
  167. 167. www.labes.ufpa.br 167 •  Provê constantes e métodos pré-definidos para realizar diferentes operações matemáticas •  Métodos e Constantes são variáveis de classe (estáticas), permitindo o acesso sem necessidade de instanciar a classe •  Constantes: •  Math.E à 2.718281828459045 •  Math.PI à 3.141592653589793 java.lang.Math
  168. 168. www.labes.ufpa.br 168 •  Métodos: •  Absoluto de -5 = Math.abs(-5) •  Número randômico (máximo é 10) = Math.random() * 10 •  Número máximo e mínimo entre 3.5 e 1.2 = Math.max(3.5,1.2),Math.min(3.5,1.2) •  Funções teto e piso = Math.ceil(3.5), Math.floor(3.5) •  Número de Euler elevado a 1 = Math.exp(1) •  log 10 = Math.log(10) •  10 elevado a 3 = Math.pow(10, 3) •  Arrondamento do PI = Math.round(Math.PI) •  Raiz quadrada de 5 = Math.sqrt(5) •  10 radianos transformados em graus = Math.toDegrees(10) + " graus") •  Seno de 90 = Math.sin(Math.toRadians(90)) java.lang.Math
  169. 169. www.labes.ufpa.br 169 Operadores Aritméticos Operador Uso Descrição + op1+op2 Soma op1 e op2 * op1*op2 Multiplica op1 por op2 / op1/op2 Divide op1 por op2 % op1%op2 Computa o resto da divisão de op1 por op2 - op1-op2 Subtrai op1 por op2
  170. 170. www.labes.ufpa.br 170 Operadores Aritméticos Operador Uso Descrição ++ op++ Incrementa op em 1; avalia o valor de op antes de ser incrementado ++ ++op Incrementa op em 1; avalia o valor de op depois de ser incrementado -- op-- Subtrai op em 1; avalia o valor de op antes de ser incrementado -- --op1 Subtrai op em 1; avalia o valor de op depois de ser incrementado Operadores de incremento e decremento
  171. 171. www.labes.ufpa.br 171 Operadores Aritméticos int i = 10; int j = 3; int k = 0; k = ++j + i; //resulta em k = 4+10 = 14 Operadores de incremento e decremento int i = 10; int j = 3; int k = 0; k = j++ + i; //resulta em k = 3+10 = 13
  172. 172. www.labes.ufpa.br 172 •  Comparam dois valores e determinam o relacionamento entre estes valores •  A saída da avaliação é true ou false. Operadores Relacionais Operador Uso Descrição > op1>op2 op1 é maior que op2 >= op1>=op2 op1 é maior ou igual a op2 < op1<op2 op1 é menor que op2 <= pp1<=op2 op1 é menor ou igual a op2 == op1==op2 op1 é igual a op2 != op1!=op2 op1 é diferente de op2
  173. 173. www.labes.ufpa.br 173 •  Possuem um ou dois operandos booleanos que produzem um resultado booleano. •  Estes são os 6 operadores lógicos: –  && (AND lógico)‫‏‬ –  & (AND lógico booleano)‫‏‬ –  || (OR lógico) ‫‏‬ –  | (OR lógico booleano inclusivo)‫‏‬ –  ^ (OR lógico booleano exclusivo)‫‏‬ –  ! (NOT lógico)‫‏‬ Operadores Lógicos
  174. 174. www.labes.ufpa.br 174 ● Operadores Lógicos && e & ●  Diferença básica: -  &&  permite  avaliações  de  curto-­‐circuito  (ou  avaliações  parciais),  enquanto  &   não.     ●  Dada a expressão: exp1 && exp2 -  &&   irá   avaliar   a   expressão   exp1,   e   imediatamente   retornar  false  se  o  valor  de  exp1  for  falso.     -  Em  contraste,  o  operador  &  sempre  avaliar  ambos  exp1   e  exp2  antes  de  retornar  a  resposta.     Operadores Lógicos
  175. 175. www.labes.ufpa.br 175 public class TestAND { public static void main( String[] args ){ int i = 0; int j = 10; boolean test= false; //demonstra && test = (i > 10) && (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test); //demonstra & test = (i > 10) & (j++ > 9); System.out.println(i); System.out.println(j); System.out.println(test); } } Operadores Lógicos ●  Operadores Lógicos && e & Qual saída este programa gera no console?
  176. 176. www.labes.ufpa.br 176 ● Operadores Lógicos || e | ●  Seguem a mesma lógica dos operadores && e &, ou seja: -  ||  permite  avaliações  de  curto-­‐circuito  (ou  avaliações  parciais),  enquanto  |   não.   ●  Dada a expressão: exp1 || exp2 -  ||  irá  avaliar  a  expressão  exp1,  e  imediatamente   retornar  true  se  exp1  é  verdadeiro   -  Em  contrastes,  o  operador  |  sempre  avaliar  as  duas   expressões  antes  de  retornar  a  resposta.       Operadores Lógicos
  177. 177. www.labes.ufpa.br 177 •  O resultado de uma operação de OU exclusivo é verdadeiro, se e um dos operandos é verdadeiro e o outro é falso •  Sempre os dois operandos serão avaliadospara calcular o resultado. Operadores Lógicos ●  Operador Lógico ^ (OU exclusivo) ●  Operador Lógico ! (NÃO lógico) ●  O resultado de uma operação de NÃO lógico é a negação do valor avaliada ●  Se é verdadeiro o resultado é falso, se é falso o resultado é verdadeiro
  178. 178. www.labes.ufpa.br 178 •  Operador Lógico condicional ? : –  É uma operador ternário. •  Isto significa que recebe três argumentos de expressão condicional. –  A estrutura de uma expressão utilizando o operador condicional é: exp1?exp2:exp3 onde, exp1 – é um expressão booleana que pode resultar em true ou false –  Resultado: Se exp1 é true, exp2 é o valor retornado. Se for false, então exp3 é retornada. Operadores Lógicos
  179. 179. www.labes.ufpa.br 179 Operadores Lógicos ●  Operador Lógico condicional ? : public class OperadorCondicional { public static void main( String[] args ){ String status = ""; int grade = 80; //pega status do estudante status = (grade >= 60)?"Passou":"Falhou"; //escreve status System.out.println( status ); } }  
  180. 180. www.labes.ufpa.br 180 Precedência de Operadores Posição Operador 1 [] . () 2 ! ~ ++ - +(unario) –(unario) () (cast) new 3 * / % 4 + - 5 < <= > >= instanceof 6 == != 7 & 8 ^ 9 | 10 && 11 || 12 ?:
  181. 181. www.labes.ufpa.br 181 •  Dada a seguinte expressão, 6%2*5+4/2+88-10 Pode-se re-escrever com alguns parentes baseado na precedência de operadores, ((6%2)*5)+(4/2)+88-10 Precedência de Operadores
  182. 182. www.labes.ufpa.br Parte III Programação Avançada
  183. 183. www.labes.ufpa.br 183 COLEÇÕES JAVA
  184. 184. www.labes.ufpa.br 184 O que é uma Coleção? •  Um objeto coleção — algumas vezes chamados de “container” — é simplesmente um objeto que agrupa múltiplos elementos em uma unidade •  Coleções são utilizadas para armazenar, recuperar, manipular e comunicar dados agregados –  Tipicamente, representam itens de dados que formam um grupo natural, como uma pasta de email (uma coleção de cartas), ou um diretório de telefones (um mapeamento entre nomes e números de telefones). Framework de Coleções
  185. 185. www.labes.ufpa.br 185 •  O framework de coleções é uma arquitetura unificada para representar e manipular coleções •  O framework de coleções possui: –  Interfaces –  Implementações –  Algoritmos Framework de Coleções
  186. 186. www.labes.ufpa.br 186 Benefícios: •  Reduz esforço de programação •  Incrementa velocidade e qualidade dos programas •  Permite interoperabilidade entre APIS não relacionadas –  As interfaces de coleções são padrão na troca de dados entre APIS •  Reduz tempo de aprendizagem de novas APIS •  Reduz esforço para projetar novas APIS •  Promove o reuso de software –  Novas estruturas de dados que esteja de acordo com as interfaces padrão de coleção são naturalmente reutilizáveis Framework de Coleções
  187. 187. www.labes.ufpa.br 187 •  Interfaces Collection são tipos de dados abstratos que estão definidas na forma de interfaces Java •  Interfaces definem como coleções são manipuladas independentemente dos seus detalhes de implementação internos –  Comportamento polimórfico •  Em Java (e em outras linguagens orientadas a objetos), interfaces genericamente formam uma hierarquia Interfaces e Implementações
  188. 188. www.labes.ufpa.br 188 •  Hierarquia Básica de Interfaces Interfaces e Implementações
  189. 189. www.labes.ufpa.br 189 •  Implementações são objetos utilizados para armazenar coleções, implementando as interfaces do framework •  Cada implementação de propósito geral provê os operadores das interfaces que implementam •  O framework de coleções Java também provê várias implementações para situações específicas Interfaces e Implementações
  190. 190. www.labes.ufpa.br 190 Interfaces Implementações HashTable ResizableArray Árvore Linked List HashTable + LinkedList Set HashSet TreeSet LinkedHashSet List ArrayList LinkedList Map HashMap TreeMap LinkedHashMa p ●  Implementações de Propósito geral Interfaces e Implementações
  191. 191. www.labes.ufpa.br 191 •  Nas últimas versões do Java, algumas classes que tratam de coleções foram consideradas “legadas”: –  Vector –  Stack –  Hashtable –  Properties Interfaces e Implementações
  192. 192. www.labes.ufpa.br 192 •  É a raiz para a hierarquia de coleções •  É o último denominador comum que as coleções implementam –  Todo objeto coleção é um tipo da interface Collection •  É utilizado para passar objetos de coleção e manipular quando generalização máxima é desejada –  Utilize a interface Collection como um tipo •  JDK não provê implementação direta desta interface, mas prove implementações mais específicos como Set e List Interface Collection
  193. 193. www.labes.ufpa.br 193 public interface Collection { boolean add(Object o); boolean addAll(Collection c); void clear(); boolean contains(Object o); boolean containsAll(Collection c); boolean equals(Object o); int hashCode(); boolean isEmpty(); Iterator iterator(); boolean remove(Object o); boolean removeAll(Collection c); boolean retainAll(Collection c); int size(); Object[] toArray(); Object[] toArray(Object[] a); } Interface Collection
  194. 194. www.labes.ufpa.br 194 Métodos de adição e remoção •  O método add() é definido genericamente o suficiente para admitir a adição de itens duplicados ou não, o que depende das implementações da interface Collection •  Isto garante que a coleção irá conter o elemento passado como parâmetro após a invocação do método. add(Object obj) e remove(Object obj) Operações em Coleções … conjuntoA.add(new Integer(1)); conjuntoA.remove(new Integer(1)); … Adiciona objeto Remove objeto
  195. 195. www.labes.ufpa.br 195 Navegação Para navegar entre os elementos de uma coleção existem o for each e Iterator: •  for each (a partir do Java 5) –  O construtor for each permite que se navegue por um array ou collection de forma concisa Operações em Coleções … Collection<String> nomes = new ArrayList<String>(); nomes.add("a"); nomes.add("b"); nomes.add("c"); for (String umNome: nomes) System.out.println(umNome.charAt(0)); …
  196. 196. www.labes.ufpa.br 196 Navegação •  Iterator –  Um Iterator é um objeto que permite a navegação em uma coleção e remover elementos da coleção de forma seletiva, caso desejado Operações em Coleções … Collection<String> nomes = new ArrayList<String>(); nomes.add("a"); nomes.add("b"); nomes.add("c"); for (Iterator it=nomes.iterator();it.hasNext();) System.out.println(String(it.next())s); … Obtém iterator Testa se ainda existem elementos Obtém a referência do próximo objeto
  197. 197. www.labes.ufpa.br 197 … for (Iterator it=nomes.iterator();it.hasNext(); if(it.next()!=null){ it.remove(); } … •  Iterator e for each –  O construtor do for each escondo o Iterator, o que não permite invocar o método remove(); –  Use explicitamente o Iterator caso queira navegar e filtrar os dados da coleção Operações em Coleções Remove o objeto atual na navegação da coleção
  198. 198. www.labes.ufpa.br 198 Outras operações •  containsAll(Collection entrada) — retorna true se a coleção alvo contém todos os elementos da coleção passada como parâmetro. •  addAll(Collection entrada) — adiciona todos os elementos da coleção passada como parâmetro na coleção alvo. •  removeAll(Collection entrada) — remove todos os elementos da coleção passada como parâmetro que também pertençam à coleção alvo. •  retainAll(Collection entrada) — contrário do anterior, pois remove todos os elementos que não estejam em comum na coleção passada como parâmetro •  clear() — remove todos os elementos da coleção Operações em Coleções
  199. 199. www.labes.ufpa.br 199 •  Representa uma coleção que não pode ter elementos duplicados •  Modela a abstração matemática de conjunto: –  Matérias de um curso de graduação –  Conjunto de pessoas em uma sala •  Esta interface possui apenas os mesmos métodos herdados da interface Collection. •  Apenas nas implementações desta interface são adicionadas operações para garantir que não conterá elementos repetidos •  Não existe restrição nenhuma em relação a ordem em que os elementos são agrupados Interface Set
  200. 200. www.labes.ufpa.br 200 Implementações da Interface Set •  HashSet – conjunto genérico e não ordenado que armazena por valor hash •  TreeSet – árvore não balanceada cujos elementos estão ordenados (garante tempo log(n) para operações básicas - add, remove and contains) •  LinkedHashSet – um conjunto HashSet que amazena também a ordem de inserção Interface Set HashSet 1 3 2 LinkedHashSet
  201. 201. www.labes.ufpa.br 201 HashSet, TreeSet e LinkedHashSet •  HashSet é mais rápido que TreeSet em várias operações (tempo constante versus tempo log para as operações), mas não oferece nenhuma garantia de ordenamento •  HashSet é a implementação mais comumente utilizada •  LinkedHashSet provê quase o mesmo tempo de acesso de HashSet e não possui o custo de log como TreeSet. Interface Set
  202. 202. www.labes.ufpa.br 202 •  Representa uma coleção ordenada (algumas vezes chamada de seqüência )‫‏‬ •  Lista pode conter elementos duplicados em sua definição •  O usuário da lista geralmente tem controle preciso sobre a posição onde está cada elemento da lista •  Pode acessar os elementos pelo valor inteiro de sua posição •  Provê operações adicionais à interface Collection, que possuem as seguintes funções: acesso pela posição, busca, iteração e listagens por range Interface List
  203. 203. www.labes.ufpa.br 203 public interface List<E> extends Collection<E> {   E get(int index); E set(int index, E element); void add(int index, E element); E remove(int index); boolean addAll(int index, Collection c); int indexOf(Object o); int lastIndexOf(Object o); ListIterator<E> listIterator(); ListIterator<E> listIterator(int index); List<E> subList(int from, int to); }   Interface List
  204. 204. www.labes.ufpa.br 204 Implementações •  ArrayList –  Oferece tempo constante de acesso, utiliza um array como representação interna e é a implementação de lista mais utilizada •  LinkedList –  Utilizado para freqüentemente adicionar elementos ao topo da lista, navegar e apagar elementos no interior da lista Interface List ArrayList remove LinkedList
  205. 205. www.labes.ufpa.br 205 •  Em relacionamentos entre objetos onde pode haver mais de um objeto envolvido, podem ser utilizados arrays ou coleções •  Pela flexibilidade e facilidade de uso, naturalmente utilizam-se coleções Java para representar relacionamentos do lado “n”. Coleção como Atributo Relacionamentos n-ários
  206. 206. www.labes.ufpa.br 206 •  Codificação Coleção como Atributo public class Funcionario { private String nome; private String cpf; private Date dataAdmissao; private String tipo; private Date dataNascimento;   private Funcionario chefe; private Collection subordinados;   private Divisao lotacao; }
  207. 207. www.labes.ufpa.br 207 •  Codificação Coleção como Atributo public class Regional { private String nome; private String sigla; private String endereco;   private Collection divisoe }
  208. 208. www.labes.ufpa.br 208 – Dado o modelo de súmulas de futebol: – Codifique os relacionamentos entre as classes – Considere a cardinalidade e a direção – Quando determinado, defina o tipo de ordenação (List ou Set) Exercício
  209. 209. www.labes.ufpa.br 209 JAVA I/O – ACESSANDO ARQUIVOS
  210. 210. www.labes.ufpa.br 210 •  Representa as operações de entrada e saída de dados para um destino •  Pode ser representado por diferentes tipos de fontes e destinos –  Arquivos em disco, aparelhos, outros programas, um socket de rede, arrays em memória, entre outros. •  Pode operar com diferentes tipos de dados –  Bytes simples, tipos de dados primitivos, caracteres específicos e objetos •  Um programa Java utiliza a abstração de Stream para criar um canal de comunicação entre fonte e destino O que é Java I/O
  211. 211. www.labes.ufpa.br 211source:java.sun.com O que é Java I/O Input stream Fonte   Stream   DesHno  
  212. 212. www.labes.ufpa.br 212 O que é Java I/O Output stream source:java.sun.com DesHno   Stream   Fonte  
  213. 213. www.labes.ufpa.br 213 •  Representa uma abstração sobre os arquivos e diretórios verdadeiros armazenados no SO •  Não é uma stream Java •  É muito importante I/O Java, pois streams Java manipulam objetos da classe File •  P o s s u i o p e r a ç õ e s p a r a a c e s s a r propriedades do arquivo ou diretório, tais como permissões de leitura, escrita, tamanho, etc. Classe File
  214. 214. www.labes.ufpa.br 214 Classe File   public class FileInfoClass { public static void main(String args[]) { String nomeArquivo = "arquivo.txt";//mude aqui o nome para o diretorio que queira testar File arquivoRef = new File(nomeArquivo); System.out.println("Nome: " + arquivoRef.getName()); if (!arquivoRef.exists()) { System.out.println(nomeArquivo + " nao existe"); /* Cria um diretorio temporario */ System.out.println("Criando diretorio temporario..."); nomeArquivo = "temp"; arquivoRef = new File(nomeArquivo); arquivoRef.mkdir(); System.out.println(nomeArquivo + (arquivoRef.exists() ? "existe" : "nao existe")); System.out.println("Deleting temp directory..."); arquivoRef.delete(); System.out.println(nomeArquivo + " e um " + (arquivoRef.isFile() ? "arquivo ." : "diretorio .")); } …   Cria objeto arquivo Verifica se arquivo já existe Cria um diretório temp Apaga arquivo
  215. 215. www.labes.ufpa.br 215 … if (arquivoRef.isDirectory()) { String content[] = arquivoRef.list(); System.out.println("O conteudo do diretorio"); for (int i = 0; i < content.length; i++) { System.out.println(content[i]); } } System.out.println(nomeArquivo + " tem tamanho = " + arquivoRef.lastModified() ); if (!arquivoRef.canRead()) { System.out.println(nomeArquivo + " nao pode ser lido"); return; } System.out.println(nomeArquivo + " tem tamanho " + arquivoRef.lastModified()); if (!arquivoRef.canWrite()) { System.out.println(nomeArquivo + " nao pode ser escrito"); } }  }   Verifica se é diretório Imprime nome do arquivo Classe File
  216. 216. www.labes.ufpa.br 216 Leitura e Escrita de Arquivos Hierarquia
  217. 217. www.labes.ufpa.br 217 Leitura e Escrita de Arquivos Programa Fluxo de dados
  218. 218. www.labes.ufpa.br 218 •  Streams de Byte –  Streams de dados binários –  Classes raiz para streams de bytes: •  Classe InputStream •  Classe OutputStream •  Ambas são classes abstratas •  Streams de Character –  Para caracteres Unicode –  Classes raiz para streams de caracteres: •  Classe Reader •  Classe Writer •  Ambas são abstratas Leitura e Escrita de Arquivos
  219. 219. www.labes.ufpa.br 219 public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("eln.txt"); out = new FileOutputStream("saidaeln.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } // mais codigo finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } } Leitura e Escrita de Arquivos FileInputStream e FileOutputStream Cria referências Lê da entrada e escreve na saída Fecha referências aos arquivos
  220. 220. www.labes.ufpa.br 220 •  Leitura de Linhas •  Entrada e Saída baseada em caracteres é uma operação muito “baixo nível” •  Entrada e Saída usualmente utiliza unidades maiores que um simples caracter –  Uma unidade comum é uma linha: uma string com um caracter terminador no final –  Um terminador de linha pode ser um retorno de carro seguido de nova linha ("rn"), um único retorno de carro ("r"), ou uma única nova linha ("n"). Leitura e Escrita de Arquivos
  221. 221. www.labes.ufpa.br 221 public static void main(String[] args) {   File inputFile = new File("eln.txt"); File outputFile = new File("saidaeln.txt"); FileReader in; FileWriter out; try { in = new FileReader(inputFile); out = new FileWriter(outputFile);   BufferedReader inputStream = new BufferedReader(in); PrintWriter outputStream = new PrintWriter(out); String l; while ((l = inputStream.readLine() System.out.println(l); outputStream.println(l); }   in.close(); out.close();   } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } Leitura e Escrita de Arquivos ●  Leitura de Linhas
  222. 222. www.labes.ufpa.br 222 •  Uma operação de I/O sem buffer significa que cada chamada de leitura ou escrita é capturada diretamente pelo SO –  Isto pode fazer os programas ficarem ineficientes, a partir de que cada requisição geralmente representa um acesso a disco, atividade de rede, ou alguma operação geralmente custosa. •  Para reduzir este tipo de overhead, a plataforma Java implementa streams com buffer de I/O –  Streams com buffer de entrada lêem dados de área de memória conhecida como buffer; a API nativa é chamada quando o buffer está vazio –  Similarmente, Streams com buffer de saída escrevem dados para o buffer, e a API nativa é chamada quando o buffer estiver cheio. Buffer de I/O
  223. 223. www.labes.ufpa.br 223 •  Um programa pode converter uma stream sem buffer em uma stream com buffer utilizando o “empacotamento”: –  Uma stream sem buffer é passada como parâmetro no construtor de classe stream com buffer •  Exemplo inputStream = new BufferedReader(new FileReader(”entra.txt")); outputStream =new BufferedWriter(new FileWriter(”sai.txt")); Buffer de I/O
  224. 224. www.labes.ufpa.br 224 •  Geralmente não faz sentido enviar dados do buffer em pontos críticos, sem esperar pelo preenchimento do mesmo. Isto é conhecido como “flush” do buffer. •  Alguns buffers permitem flush automático, que é especificado por um parâmetro opcional no construtor. –  Quando flush automático está habilitado, certos eventos chave fazem com o buffer seja descarregado –  Por exemplo, um objeto PrintWriter com flush automático descarrega os dados em toda invocação de println(). •  Para realizar o “flush” de arquivos manualmente, é necessário invocar o método flush(). Buffer de I/O
  225. 225. www.labes.ufpa.br 225 •  Em Java existem três tipos de stream padrão: –  Entrada Padrão, acessada por System.in –  Saída Padrão, acessada por System.out –  Erro Padrão, acessada por System.err •  Estes objetos são definidos automaticamente e não precisam ser instanciados •  System.out e System.err são definidas como objetos PrintStream (streams de escrita) Entrada e Saída Padrão
  226. 226. www.labes.ufpa.br CapacitaçãoEletronorte–2007-2008 226 Entrada e Saída Padrão public class LeituraEntradaPadrao {   public static void main(String[] args) throws IOException { DataOutputStream output = new DataOutputStream(System.out DataInputStream in = new DataInputStream(System.in);   int c; while ((c = in.read()) != -1) output.write(c); in.close(); //sempre fechar antes de terminar output.close();//sempre fechar antes de terminar }   } MacLima:bin adailton$ java br.eln.java.io.LeituraEntradaPadrao < ../eln.txt *************** inicio do arquivo linha 1 linha 2 linha3 fim do arquivo ************** MacLima:bin adailton$
  227. 227. www.labes.ufpa.br 227 •  Geralmente ler o conteúdo de entrada a partir da linha comando e com sigilo exige a definição de alguma classe utilitária para tal tarefa. •  O Java SE 6 introduziu a classe Console especificamente para facilitar esta tarefa. •  Para ler uma senha, utilize o seguinte código: – Console cons = System.console(); – String username = cons.readLine(“Nome Usuario: "); – char[] passwd = cons.readPassword(“Senha: "); Java 6: Classe Console
  228. 228. www.labes.ufpa.br 228 – Considere um arquivo de texto com o conteúdo no seguinte formato: Exercício Fulano 89 n Fulano 23 n Fulano 45 n Beltrano 33 n EOF Nome Jogador Minuto do jogo em que marcou golLinha
  229. 229. www.labes.ufpa.br 229 – Codifique um método que receba como entrada o nome do arquivo, e processa o texto escrevendo na tela quantos gol cada jogador fez e o minuto do primeiro gol Exercício
  230. 230. www.labes.ufpa.br 230 NOVAS FUNCIONALIDADES
  231. 231. www.labes.ufpa.br 231 Recentes Evoluções do Java Loop for each Import Estático Autoboxing Generics Java Web Start Annotations Java 5
  232. 232. www.labes.ufpa.br 232 Recentes Evoluções do Java SplashScreen SystemTray JDBC 4.0 Scripting (JavaScript, JavaFX e JRuby) JAX-WS (Web Services) Melhorias de I/O (Console, Permissões) Java 6
  233. 233. www.labes.ufpa.br 233 •  De maneira geral, a versão 5 do Java incluiu novas estruturas para a linguagem em si •  A versão 6 adicionou várias melhorias de performance e funcionalidades relacionadas à plataforma, como acesso a banco, apoio a scripts, etc. •  A versão 7 está no forno ainda, mas pretende adicionar novas estruturas para linguagem, como por exemplo tipagem dinâmica Recentes Evoluções do Java
  234. 234. www.labes.ufpa.br 234 •  Permite que uma classe tenha acesso a membros estáticos (atributos e métodos) sem necessitar digitar explicitamente a classe originária, como em: double r = Math.cos(Math.PI * valor); •  O import estático permite acesso a membros estáticos sem necessariamente utilizar herança. Assim, o programa importa somente os membros individualmente: import static java.lang.Math.PI; •  ou import static java.lang.Math.*; Import Estático
  235. 235. www.labes.ufpa.br 235 •  Uma vez importados, os membros estáticos podem ser utilizados diretamente: double r = cos(PI * theta); •  A declaração de import estático é análogo ao import normal, pois permite acesso sem necessitar explicitar o path completo Import Estático import static java.lang.Math.PI; import static java.lang.Math.round;    public class ImportMathEstatico {   public static void main(String args[]){ System.out.println(" Valor de PI = "+PI); System.out.println(" Valor de -5 arredondado = "+round(-5)); }  }
  236. 236. www.labes.ufpa.br 236 •  Utilize quando precisar ter acesso freqüente a membros estáticos de uma ou duas classes. •  Se utilizar mal a funcionalidade de import estático, pode fazer o programa perder legibilidade e manutenibilidade, poluindo o código com todos os membros estáticos importados. •  Se utilizado apropriadamente, o import estático pode fazer o programa mais legível (pois remove toda a repetição de nomes de classes) Import Estático
  237. 237. www.labes.ufpa.br 237 •  Esse processo de empacotamento entre primitivos e objetos é algo intediante. •  A partir do Java 5, o recurso de autoboxing faz esse empacotamento sozinho: •  No Java 1.4 o código acima é inválido. No Java 5 ele compila perfeitamente. Autoboxing Integer inteiro1= new Integer(1); int valInteiro1 = inteiro1.intValue();  Integer inteiro2= 1; int valInteiro2 = inteiro1; 
  238. 238. www.labes.ufpa.br 238 •  Este caso se aplica a todos os tipos primitivos e seus correspondentes wrappers (float e Float, double e Double, etc.) •  Isso não quer dizer que tipos primitivos e referências agora são a mesma coisa, isso é simplesmente um “adocicamento sintático” para facilitar a codificação. •  Pode-se fazer o autoboxing diretamente para Object também, possibilitando passar um tipo primitivo para um método que recebe Object como argumento: Autoboxing Object val1 = 5; Object val2 = 5.0F; Internamente val1 e val2 são empacotados no mesmo tipo de objeto?
  239. 239. www.labes.ufpa.br 239 Como são utilizadas? •  Annotations, ou simplesmente ”anotações”, são utilizadas para afetar o modo como os programas são tratados por ferramentas e bibliotecas •  Annotations são utilizados por ferramentas para produzir arquivos derivados –  Ferramentas: Compilador, IDE –  Arquivos derivados: Novo código Java, descritor de implantação, arquivos .class Annotations
  240. 240. www.labes.ufpa.br 240 Porquê Annotations? •  Habilitam o estilo de “programação declarativa” –  Menor codificação, já que uma ferramenta pode gerar arquivos derivados automaticamente –  Fácil modificar configurações •  Elimina a necessidade de manter “arquivos dependentes” que precisam ser alterados sempre para estar sincronizado com o código fonte –  Informação é mantida no arquivo fonte Annotations
  241. 241. www.labes.ufpa.br 241 •  A definição do tipo Annotation é similar ao modo de definir Interfaces Java –  Um “arroba” (@) precede a palavra reservada interface –  Cada,método define um elemento da Annotation –  Declaração de métodos não pode ter parâmetros e nem lançar exceções –  Tipos de retorno são restritos a primitivos, String, Class, enums, annotations, e arrays dos tipos anteriores –  Métodos podem ter valores default Annotations Definindo uma Annotation
  242. 242. www.labes.ufpa.br 242 public @interface RequerMelhoria { int id();   String resumo();   String analista() default "[naoDefinid   String data() default "[naoImplementad } Definindo uma Annotation Annotations Item definido como método Define valor default
  243. 243. www.labes.ufpa.br 243 •  Depois de definida, é possível utilizar uma Annotation na declaração de: –  classes, métodos, atributos •  Uma é um tipo especial de modificador, e pode ser utilizado em qualquer lugar que outros modificadores (como public, static, ou final) podem ser utilizados –  Por convenção, Annotations precedem outros modificadores –  Annotations consistem em um arroba (@) seguido de parêntesis com os elementos listados Annotations Como utilizar uma Annotation
  244. 244. www.labes.ufpa.br 244 public interface InterfaceTeste {   @RequerMelhoria( id = 123, resumo = "Permitir Jogo Adiado", analista = "Fulano de Tal", data = "4/1/2010" ) public void definirDataJogo(Date data);   }   Como utilizar uma Annotation Annotations
  245. 245. www.labes.ufpa.br 245 Restrições de Escopo em Annotations •  De maneira geral as anotações podem ser restringidas de duas maneiras: –  Escopo de uso: restringem a qual contexto a Annotation estará disponível para ser acessada por ferramentas (código fonte, código .class, JRE, etc.) –  Escopo de definição: restringem a quais elementos Java a Annotation pode ser aplicada (classe, atributo, método, etc.) Annotations
  246. 246. www.labes.ufpa.br 246 •  Utiliza-se a meta-annotation @Retention, que possui 3 níveis: –  SOURCE: indica que a informação da Annotation será colocada apenas no código fonte, mas não estará disponível no arquivo .class –  CLASS (Default): indica que a informação da Annotation será colocada no arquivo .class, mas não estará disponível em tempo de execução (não será carregado pela JRE) –  RUNTIME – indica que a informação será armazenada no arquivo .class e carregada pela JRE Annotations Escopo de Uso
  247. 247. www.labes.ufpa.br 247 Escopo de Uso Annotations @Retention(RetentionPolicy.RUNTIME) public @interface RequerMelhoria { int id();   String resumo();   String analista() default "[naoDefinido]";   String data() default "[naoImplementado]"; } Define Escopo de Uso
  248. 248. www.labes.ufpa.br 248 •  Definição similar ao escopo de uso •  Utiliza-se a meta-annotation @Target, que possui vários níveis, tais como: •  TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE Annotations Escopo de Definição @Target(ElementType.FIELD) public @interface RequerMelhoria { int id();   String resumo();   String analista() default "[naoDefinido]";   String data() default "[naoImplementado]"; }
  249. 249. www.labes.ufpa.br 249 @Target(ElementType.FIELD) public @interface RequerMelhoria { int id();   String resumo();   String analista() default "[naoDefinido]";   String data() default "[naoImplementado]"; } public interface InterfaceTeste {   @RequerMelhoria( id = 123, resumo = "Permitir Jogo Adiado", analista = "Fulano de Tal", data = "4/1/2010" ) public void definirDataJogo(Date data);   }   § The annotation @RequerMelhoria is disallowed for this location Annotations
  250. 250. www.labes.ufpa.br 250 •  Provêem abstração aos tipos –  Classes, Interfaces e Métodos podem ser parametrizados por tipos ( este recurso é conhecido por programadores C++) •  Generics permite código seguro para uso de tipos –  Se o código compila sem erros ou advertências, não irá acontecer nenhuma ClassCastException inesperado em tempo de execução Generics … Collection<String> nomes = new ArrayList<String>(); nomes.add("a"); for (String umNome: nomes) System.out.println(umNome.charAt(0)); Esta definição já apresentada é permitida pelo uso de Generics § Não precisa fazer Casting para String
  251. 251. www.labes.ufpa.br 251 Definição de uma classe genérica: •  Definição: LinkedList<E> tem um parâmetro tipo E que representa o tipo do elemento armazenado no interior da lista Generics public interface LinkedList<E> extends AbstractSequentialList<E> implements List<E>,Queue<E>, Clonable, java.io.Serializable { … …    } § O uso de “E” como parâmetro é apenas uma convenção § Este parâmetro segue a mesma r e g r a p a r a d e f i n i ç ã o d e identificadores para a linguagem J a v a ( p . e x : T, T I P O , t i P o , TIPO1,etc...)
  252. 252. www.labes.ufpa.br 252 •  Substituir o parâmetro tipo <E> pelo tipo concreto no argumento, como <Integer> ou <String> ou <MeuTipo> –  LinkedList<Integer> pode armazenar somente Integer ou sub tipos deste Generics Uso de uma classe genérica: … LinkedList<Integer> valores = new LinkedList<Integer>(); valores.add(new Integer(1)); valores.add(23); valores.add(“142”); String valor = valores.get(1); … Não é permitido adicionar um valor String Permitido pelo Autoboxing Acesso a valor é verificado
  253. 253. www.labes.ufpa.br 253 •  Problema: Tipos de elementos em Collection –  Compilador não consegue verificar tipos de elementos (pois tudo é Object) –  Atribuição com casting de tipos –  Podem ocorrer ClassCastException em tempo de execução do programa •  Solução: Generics –  Diz ao compilador o tipo da coleção –  Deixa o compilador fazer o casting –  Permite a detecção em tempo de compilação Generics Porquê usar Generics?
  254. 254. www.labes.ufpa.br 254 •  Você pode codificar isto: –  Object o = new Integer(5); •  Você pode codificar também: –  Object[] or = new Integer[5]; •  Então é esperado que permitido o seguinte código: (Que na verdade NÃO pode!) –  ArrayList<Object> ao = new ArrayList<Integer>(); •  Isto poderia causar ClassCastException em tempo de execução Generics Generics e Sub Tipos
  255. 255. www.labes.ufpa.br 255 Generics Generics e Sub Tipos ArrayList<Integer> ai = new ArrayList<Integer>(); ArrayList<Object> ao = ai; // permitido em compilação ao.add(new Object()); Integer i = ai.get(0); ArrayList<Number> an = new ArrayList<Number>(); an.add(new Integer(5)); an.add(new Long(1000L)); No seguinte caso, Long e Integer são subclasses de Number:

×