apostila de java.pdf

Upload: bruno-cesar-rosa-diniz

Post on 07-Jul-2018

235 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 Apostila de JAVA.pdf

    1/147

     

    CurtaTI - TecnologiaParceira da suaEmpresa 

    Autor: MarceloCosta Curta

    [PROGRAMAÇÃOEM A!A" Uma introdução ao mundo da programação em Java.

  • 8/19/2019 Apostila de JAVA.pdf

    2/147

     

  • 8/19/2019 Apostila de JAVA.pdf

    3/147

     

     © 2013, Marcelo Costa Curta - Todos os direitosreservados e protegidos pela Lei nº9.610, de

    10/02/1998.Nenhuma parte deste livro poderá ser reproduzida, nemtransmitida, sem autorização prévia por escrito do autor.

  • 8/19/2019 Apostila de JAVA.pdf

    4/147

     

    SOBRE O AUTOR

    Marcelo Costa Curta – formado em Engenhariada Computação pela Universidade de Ribeirão Preto eMBA em Gestão de Projetos pela FGV, certificado emITIL V3, atua a 6 anos como desenvolvedor Java e a 4anos trabalha como consultor na empresa CurtaTI(www.curtati.com.br).

  • 8/19/2019 Apostila de JAVA.pdf

    5/147

  • 8/19/2019 Apostila de JAVA.pdf

    6/147

     

    Lendo o arquivo gerado ___________________ 96

    Scanner e PrintStream ____________________ 97

    7. Serialização ________________________ 99

    Transient e static _______________________ 104

    Regras de Serialização __________________ 105

    Externalizable __________________________ 106

    Controle de Versão _____________________ 107

    8. Reflexão __________________________ 109

    9. Padrões de Projetos ________________ 115

    Padrões estruturais _____________________ 117

    Padrões comportamentais ________________ 117

    Singleton (Padrão de Criação) _____________ 119

    Factory Method (Padrão de Criação) ________ 122

    Template Method (Padrão Comportamental) _ 128

    Façade (Padrão Estrutural) _______________ 132

    10. Referencias _______________________ 137

  • 8/19/2019 Apostila de JAVA.pdf

    7/147

    Programação em Java

    6 | w w w . b o r g e s r i n o l f i . c o m . b r 

    1. Introdução

    A linguagem de programação Java é umalinguagem de alto nível, robusta e segura que tem comoprincipais características, a orientação a objetos e acapacidade de ser multiplataforma, lançada em 2005pela Sun Microsystems, e atualmente mantida pelaOracle.

    Hoje é uma linguagem que conta com mais de 9milhões de desenvolvedores em todo o mundo1.

    O grande diferencial do Java hoje é acaracterística de ser multiplataforma, ou seja, pode serexecutado em vários hardwares e SistemasOperacionais, através do conceito de Maquina Virtual

    Java que veremos mais detalhes ainda nesse capitulo.

    Por sua capacidade modularização e estruturabem definida, permite que seja implantado um ambiente

    1 http://www.oracle.com/br/technologies/java/overview/index.html 

  • 8/19/2019 Apostila de JAVA.pdf

    8/147

    Programação em Java

    7 | w w w . b o r g e s r i n o l f i . c o m . b r 

    altamente seguro e avançado para arquiteturascomplexas baseadas em rede.

    Tecnologias JavaA tecnologia Java oferece meios para se

    desenvolver aplicações robustas para com arquiteturasavançadas, programas desktop, sistemas embarcados(Embeddable ), para dispositivos móveis e interfaces

    gráficas avançadas para seus aplicativos.Para fazer isso da melhor forma possível foidesenvolvida uma tecnologia para cada tipo deaplicação conforme segue abaixo:

    Java EE – Java Platform, EnterpriseEdition

    Com bibliotecas essenciais para odesenvolvimento de aplicações empresariais,permitindo desenvolver aplicações Web, comarquiteturas avançadas, e mais produtividade.

    Java SE – Java Standard Edition

    O JavaSE foi criado para o desenvolvimento

    com bibliotecas padrões para um desenvolvimento deaplicações segura, e de alto desempenho.

    Oracle Embeddable Java

    Embeddable   é um pacote criado paradesenvolvimento para dispositivos com recursosrestritos, tendo alto desempenho para acessar os

  • 8/19/2019 Apostila de JAVA.pdf

    9/147

    Programação em Java

    8 | w w w . b o r g e s r i n o l f i . c o m . b r 

    recursos do aparelho, dentro desta categoria podemoslistar JavaCard utilizado para desenvolvimento em

    cartões inteligentes (crachás, bilhete eletrônico, etc) eJava TV para desenvolvimento de aplicações paraTV´s.

    Java ME – Java Platform, Micro Edition

    Possui ferramentas exclusivas paradesenvolvimento de aplicações para celulares, podendo

    fazer acessos a funções específicas dos aparelhos devárias marcas e modelos.

    JavaFX

    JavaFX é uma plataforma criada paradesenvolvimento de interfaces visuais avançadas paraaplicações, reduzindo a complexidade dodesenvolvimento.

    Estrutura da linguagem Java

    A linguagem Java é composta basicamente dedois componentes centrais:

    •  Java Virtual Machine (JVM)  – é umaferramenta capaz de executar instruçõesgeradas pelo compilador java. Este é capaz deexecutar um programa java.

  • 8/19/2019 Apostila de JAVA.pdf

    10/147

    Programação em Java

    9 | w w w . b o r g e s r i n o l f i . c o m . b r 

    •  Java Development Kit (JDK)  – trata-se de umkit de ferramentas essenciais para o

    desenvolvimento, consistindo de classesessenciais, compilador Java, e a Máquina VirtualJava, entre outros.

    Para iniciar o desenvolvimento Java,primeiramente todo código fonte é escrito em arquivostexto simples, com o seu editor de texto preferido, e

    salvo com a extensão ‘.java ’.

    Figura 1: MeuPrograma.java

    Esse código fonte é compilado utilizando o

    programa ‘ javac.exe ’ que vem junto com o Kit deDesenvolvimento (JDK).

    Figura 2: MeuPrama.java passa por um compilador

    Depois de compilado é gerado um arquivo como mesmo nome e com extensão ‘.class ’, este arquivocontém instruções independentes do computador quefoi compilado, ele contem informações de bytecodes ,que a Máquina Virtual Java (JVM) é capaz de executaresse programa.

  • 8/19/2019 Apostila de JAVA.pdf

    11/147

    Programação em Java

    10 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 3: Esquema de compilação Java

    É exatamente essa estrutura de compilação quefaz o Java ter capacidade de ser multiplataforma, pois aJVM pode ser implementada para qualquer sistemaoperacional, inclusive podendo ter várias para a mesmaplataforma, fazendo com que sua aplicação execute em

    várias plataformas, conforme ilustrado no desenhoabaixo:

    MeuPrograma.java

    Compilador• Converto o arquivo

    '.java' em bytecode

    MeuPrograma.class

    Java irtual Mac!ine

    • tradu" o arquivo'.class' embinario e e#ecutao programa

  • 8/19/2019 Apostila de JAVA.pdf

    12/147

    Programação em Java

    11 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 4: Funcionamento multiplataforma Java

    Devido a execução de um programa Javapassar por uma camada a mais, a JVM, ela tende a sermais lenta do que as demais linguagens.

    Para isso foi criado um conceito de Just-In-Time (JIT) Compiler, trata-se de um componenteagregado a JVM , que converte todos os bytecodes  emlinguagem nativa da máquina somente quando oprograma Java é iniciado. O resultado é uma melhoraconsiderável no código que é interpretado pela JVM .

    Chegou a hora do ‘Hello World’Para criar o nosso primeiro programa

    precisaremos ter a JDK devidamente instalado, umeditor de texto a sua escolha, podendo facilmente serutilizado o Notepad que vem incluso no Windows.

  • 8/19/2019 Apostila de JAVA.pdf

    13/147

    Programação em Java

    12 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Criar o código fonte

    Utilizando o seu editor de texto preferido escrevao código fonte abaixo, e salve o arquivo, ele deve ter aextensão ‘.java ’ daremos o nome no arquivo de‘OlaMundo.java ’, como exemplo iremos salvar em umapasta no caminho ‘C:\primeiroPrograma ’.

    class OlaMundo{

     public static void  main(String[] args) {

    System.out.println("Hello World!");}

    }

    Código 1: Fonte da classe OlaMundo.java 

    ATENÇÃO: o código é ‘case sensitive ’, ou seja,ele é sensível a letras maiúsculas e minúsculas,

    identificando como palavras diferentes, portanto ocódigo acima deve ser digitado exatamente comoexibido.

    Compilando o Código Fonte

    O Kit de Desenvolvimento JDK, traz asferramentas necessárias para compilar e executar o

    programa java, e para utilizar eles iremos utilizar oPrompt de comando do Windows (Iniciar > Todos osProgramas > Acessórios > Prompt de Comando )

  • 8/19/2019 Apostila de JAVA.pdf

    14/147

    Programação em Java

    13 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 5: Prompt de comando do Windows

    ATENÇÃO : Garanta que você esteja dentro dodiretório que contem o arquivo que criamos‘C:\primeiroPrograma ’ para fazer isso execute oscomando como mostrado na tela abaixo:

    Figura 6: Verifique o diretório onde se localiza o arquivo

    Agora estamos prontos para compilar o nossoprimeiro programa, utilizaremos um programa chamado

  • 8/19/2019 Apostila de JAVA.pdf

    15/147

    Programação em Java

    14 | w w w . b o r g e s r i n o l f i . c o m . b r 

    ‘javac.exe’ que acompanha a JDK, e para isso bastaexecutar o comando abaixo:

    javac OlaMundo.java

    Código 2: Compilando a classe OlaMundo.java

    Será criado um arquivo com o mesmo nome ecom extensão ‘.class’   trata-se do bytecode  gerado quecontém instruções que a Máquina Virtual Java é capaz

    de executar.

    Figura 7: Arquivo compilado .class e código fonte .java

    Executando o programa

    Agora que já temos o bytecode  (.class ) gerado enão tivemos nenhuma erro, podemos executar o nossoprimeiro programa feito em java. Para isso basta utilizaro comando ‘ java.exe ’ que também é instalado junto coma JDK.

  • 8/19/2019 Apostila de JAVA.pdf

    16/147

  • 8/19/2019 Apostila de JAVA.pdf

    17/147

    Programação em Java

    16 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Variáveis e Controle de Fluxo

    Todo programa de computador é elaborado pararesolver alguns problemas, ou automatizar operaçõesdo dia-a-dia. E isso sempre é feito manipulando dados através de instruções ou comandos.

    Dados

    Tipos primitivos de dadosTipos primitivos de dados é um conjunto de tipos

    básicos de dados definido na linguagem java.

    Tipo Tamanho(bits)

    Descrição ValorPadrão(Default

    )Byte 8 Valor mínimo de -128 emáximo de 127 (inclusive).Pode ser utilizado paraeconomizar memoria,podendo substituir o tipoint   só que com valoreslimitados

    0

    Short 16 Valor mínimo de -32.768 evalor máximo de 32.767(inclusive) pode ser usadotambém para economizarmemória.

    0

    Int 32

    Valor mínimo de -2.147.483.648 e máximode 2.147.483.647

    0

  • 8/19/2019 Apostila de JAVA.pdf

    18/147

    Programação em Java

    17 | w w w . b o r g e s r i n o l f i . c o m . b r 

    (inclusive). Escolhido paravalores do tipo inteiro,

    positivos e negativos.Long 6

    4Valor mínimo de -9.223.372.036.854.775.808 e máximo de9.223.372.036.854.775.807 (inclusive). Usadoquando há a necessidadede um espaço de valores

    maiores do que o int. 

    0L

    Float 32 (754pontosflutuantes)

    Utilizado para valoresdecimais positivos enegativos. Não érecomendado o seu usopara valores muitosprecisos como moedas,para isso é melhor utilizar

    objetos como java.math.BigDecimal.

    0.0f

    Double 64 (754pontosflutuantes)

    Utilizado para valoresdecimais positivos enegativos com umaabrangência maior do queo float . Também não érecomendado o seu uso

    para valores muitosprecisos como moedas,para isso é melhor utilizarobjetos como

     java.math.BigDecimal .

    0.0d

    Boolean

    1 Tipo de dados comsomente dois valores

    False

  • 8/19/2019 Apostila de JAVA.pdf

    19/147

    Programação em Java

    18 | w w w . b o r g e s r i n o l f i . c o m . b r 

    possíveis True   ou False  (verdadeiro ou falso).

    Char 16

    Utilizado para representarcaracteres Unicode. Ovalor mínimo é ‘\u0000’(ou 0) e o máximo é ‘\uffff’(ou 65.535 inclusive)

    ‘\u0000’

    Tabela 1: Tipos primitivos existentes em Java

    O tipo de dados utilizado no Java para

    representar uma string  (cadeia de caractere), é a classe java.lang.String , a cada vez que você coloca oscaracteres entre aspas duplas, automaticamente écriado um objeto da classe String.

    Por exemplo, String s = “string de teste” . String  não é um tipo primitivo de dados, é uma classe comsuporte especial pela linguagem Java, fazendo com que

    pareça ser um tipo primitivo.Variáveis

    No Java as variáveis precisam ser declaradasantes de serem utilizadas e podem ser divida em quatrotipos:

    •  Instancia de Variáveis (Campos Não estático) – espaços de memória para armazenar valoresnão estáticos e que pode ser diferente para cadainstância.

    •  Variáveis de Classe (Campos Estáticos) –  équalquer campo declarado com o modificadorstatic , que define um valor único para todas asinstancias da classe.

  • 8/19/2019 Apostila de JAVA.pdf

    20/147

    Programação em Java

    19 | w w w . b o r g e s r i n o l f i . c o m . b r 

    •  Variáveis Locais – A sintaxe para criação davariável é a mesma utilizada para os outros

    tipos, porém ela é criada dentro de um método eé valida somente dentro dele, sendo visíveltambém somente dentro do método e não sendoacessível para o resto da classe.

    •  Parâmetros – São variáveis utilizadas parapassagem de parâmetros entre os objetos.

    Para criar variáveis elas devem seguir algumasregras como, por exemplo:

    •  Os nomes são ‘case sensitive’ , ou seja, fazdiferença escrever uma variável com letrasminúsculas e maiúsculas.

    •  O primeiro nome tem que ser uma letra•  Não pode utilizar caracteres especiais (por

    exemplo: $@&)•  Não pode possuir espaços em branco•  Não pode ser palavra reservada para uso da

    linguagem Java, para consultar as palavrasreservadas do Java consulte o linkhttp://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html 

    No Java a sintaxe para se declarar uma variávelsegue a seguinte forma:

    tipoDeDado nomeDaVariavel

    Código 4: Forma de declaração de variável

    Como os exemplos abaixo:

  • 8/19/2019 Apostila de JAVA.pdf

    21/147

    Programação em Java

    20 | w w w . b o r g e s r i n o l f i . c o m . b r 

    float valor;

    int numero;

    Código 5: Exemplo de declaração de variável

    Constantes

    Constantes são similares a variável, com umadiferença, não é possível alterar o seu valor durante aexecução do código, o seu valor é imutável.

    As constantes são muito utilizadas para lembrar-

    se de algum número muito grande ou um valor quepode ser identificado pelo nome da constante.Para declarar uma constante em java, deve-se

    adicionar a palavra static   antes do tipo de dado,conforme exemplo abaixo:

    final float PI = 3.14159265f;

    Código 6: Declaração de constantes

    Atribuição de valores

    Para poder utilizar a variável após a suadeclaração você pode atribuir valores a essas variáveis.Isso pode ser feito de varias formas, segue algumasdelas:

    Atribuição de valor na mesma linha dadeclaração da variável, nesse caso a variável já écriada com um valor inicial.

    int numero = 10;

    Código 7: Atribuindo valores 

  • 8/19/2019 Apostila de JAVA.pdf

    22/147

    Programação em Java

    21 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Atribuir valor em qualquer momento após adeclaração da variável, após a sua declaração o valor

    padrão é atribuída a variável, até que esse valor sejaalterado.

    int numero; //nesse momento valor da variável

    é 0

    numero = 10;

    Código 8: Atribuição de valor em um segundo momento

    CastingAlguns tipos de dados quando declarados não

    podem assumir posições de valores com menorcapacidade, como por exemplo:

    long  valor = 1000;

    int numero = valor;

    Código 9: Erro por tipos de dados incompativeis

    Isso causaria um erro de compilação, pois,embora o número 1000, de certo em uma variável dotipo inteiro, a variável ‘valor’ é de um tipo de dado quesuporta pontos flutuantes e o inteiro não e com issovocê pode estar perdendo informação. Se realmentequisermos fazer essa operação, temos que converter ovalor da variável para inteiro, ou seja, fazer um ‘casting’  

    conforme código abaixo:

    long  valor = 1000;

    int numero = (int) valor;

    Código 10: Casting de tipo de dados

    Mais alguns tipos de casting :

    char  a = 'a';

  • 8/19/2019 Apostila de JAVA.pdf

    23/147

    Programação em Java

    22 | w w w . b o r g e s r i n o l f i . c o m . b r 

    int b = (int) 5.1987;

    float c = (float) 5.0;

    int d = (char ) (a + 5);char  e = (char ) 110.5;

    Código 11: Outros tipos de casting de variaveis

    Nem todos os tipos de dados são possíveisconverter, para isso segue abaixo uma tabela dos tipospossíveis de casting:

    DE \PARA Byte   short   char   int long   float   double  

    byte Implícito char Implícito Implícito Implícito Implícito

    short byte char Implícito Implícito Implícito Implícito

    char byte short Implícito Implícito Implícito Implícito

    int byte short char Implícito Implícito Implícito

    long byte short char int Implícito Implícito

    float byte short char int long Implícitodouble byte short char int long float

    Tabela 2: Tipos de Casting possíveis

    Instruções ou Comandos

    Operadores Aritméticos

    Os operadores aritméticos são utilizados parafazer operações matemáticas, manipulando os dados(variáveis) criados no código. Segue abaixo algunsexemplos de operadores aritméticos:

    int soma = 1 + 1; //resultado igual a 2

    int subtracao = 2 - 1; //resultado igual a 1

  • 8/19/2019 Apostila de JAVA.pdf

    24/147

    Programação em Java

    23 | w w w . b o r g e s r i n o l f i . c o m . b r 

    int  multiplicacao = 3 * 3; //resultado igual

    a 6

    int divisao = 6 / 2; //resultado igual a 3int modulo = 6 % 2; //resultado igual a 0

    Código 12: Operadores aritméticos em Java

    O operador aritmético módulo (%) retorna oresta da divisão entre os dois números, no exemploacima (6 / 2), tem o resto da divisão igual a ‘0’. Essetipo de operar é muito utilizado para identificar se um

    número é par ou impar.

    ATENÇÃO : Os operadores seguem as mesmasregras de precedência da matemática, podendo serlimitada por parênteses, obedecendo sempre a regramatemática.

    Operadores de AtribuiçãoOs operadores de atribuição são utilizados para

    atribuir um determinado valor a variável, sem perceber já vimos o operador ‘=’, que atribui valor a variável, alémdele temos outros operadores como segue abaixo:

    Operador Descrição Exemplo

    += Operadorincremental - somavalor da variável eatribui valor.

    int  numero = 1;numero += 2; //o valor3 é atribuído avariável ‘numero’  

    -= OperadorDecremental -subtrai valor da

    int  numero = 2;

    numero -= 2;  //o valor0 é atribuído avariável ’numero’  

  • 8/19/2019 Apostila de JAVA.pdf

    25/147

    Programação em Java

    24 | w w w . b o r g e s r i n o l f i . c o m . b r 

    variável e atribuivalor.

    *= OperadorMultiplicador –multiplica valor davariável e atribuivalor.

    int  numero = 2;

    numero *= 3; //o valor6 é atribuído avariável ‘numero’  

     /= Operador Divisor –divide valor da

    variável e atribuivalor.

    int  numero = 6;

    numero /= 2;  //o valor

    3 é atribuído avariável ‘numero’  

    %= Operador Módulo –divide valor avariável e atribuivalor.do resto dadivisão a variável

    int  numero = 4;

    numero %= 3;  //ovalor 1 é atribuído avariável ‘numero’  

    Tabela 3: Operadores de Atribuição

    Todas essas operações poderiam ser feitas comos operadores aritméticos, porém como pudemosperceber, com essa sintaxe, economizamos código edeixamos o código fonte mais legível.

    Além desses operadores de atribuição, temos

    também alguns operadores de incremento edecremento de um em um, também com códigoreduzido.

    Ao invés de escrevermos um código como:

    int numero = 6;

  • 8/19/2019 Apostila de JAVA.pdf

    26/147

    Programação em Java

    25 | w w w . b o r g e s r i n o l f i . c o m . b r 

    int incrementado = numero + 1; //o valor 7 é

    atribuído a variável incrementado

    Código 13: Incrementando um número

    Podemos escrever da seguinte forma:

    int numero = 6;

    int  incrementado = numero++; //o valor 6 é

    atribuído a variável ‘incrementado’, e a

    variável ‘numero’ passa a valer 7

    Código 14: Incrementando um numero de forma mais limpa no

    código Essa forma chamada de PÓS-INCREMENTO,

    primeiro atribui o valor a variável, para depois fazer oincremento, por isso a variável ‘numero’ , primeiro foiatribuído o seu valor a variável ‘incrementado’  e depoisa variável ‘numero’  foi adicionado ‘1’  a ela, fazendo comque ela passasse a valer ‘7’ .

    No PRÉ-INCREMENTO o valor atribuído avariável ‘incrementado’ , já vem com valor da variável‘numero’  somado, conforme exemplo abaixo:

    int numero = 6;

    int  incrementado = ++numero; //A variável

    numero passa a valer 7, e este valor é

    atribuído a variável ‘incrementado’.

    Código 15: Utilizando pós-incremento em java

    Operadores Relacionais

    Todo programa é feito de tomada dedecisões com respostas podendo ser, verdadeira oufalsa e mais nada, não permitindo redundância ou

  • 8/19/2019 Apostila de JAVA.pdf

    27/147

    Programação em Java

    26 | w w w . b o r g e s r i n o l f i . c o m . b r 

    duvidas nas decisões. Para essas comparaçõesutilizamos os operadores relacionais, seguem

    abaixo quais são os operadores:

    Operador Descrição Exemplo

    == Igualdade – verificase o primeiro valor éIGUAL ao segundo

    int  numero = 1;

    boolean  resultado;

    resultado = (numero== 2);  //o valor ‘false’é atribuído a variável

    ‘resultado’  

    != Diferença – verificase o primeiro valor éDIFERENTE aosegundo

    int  numero = 1;

    boolean  resultado;

    resultado = (numero

    != 2);  //o valor ‘true’ é

    atribuído a variável

    ‘resultado’  

    < Menor – verifica se oprimeiro valor éMENOR ao segundo

    int  numero = 1;

    boolean  resultado;

    resultado = (numero <

    2);  //o valor ‘true’ é

    atribuído a variável

    ‘resultado’  

    2);  //o valor ‘false’ é

  • 8/19/2019 Apostila de JAVA.pdf

    28/147

    Programação em Java

    27 | w w w . b o r g e s r i n o l f i . c o m . b r 

    atribuído a variável

    ‘resultado’  

    >= Maior ou igual –verifica se o primeirovalor é MAIOR OUIGUAL ao segundo

    int  numero = 1;boolean  resultado;

    resultado = (numero

    == 2);  //o valor ‘false’

    é atribuído a variável

    ‘resultado’  

    Tabela 4: Operadores Relacionais em Java

    Operadores LógicosAs decisões aprendidas no tópico anterior

    podem ser feitas em conjunto com duas ou maisdecisões, trazendo para o programa apenas umresultado ‘true’   ou ‘false’ , para isso é utilizado osoperadores lógicos ‘E ’ ou ‘OU’ , segue abaixo:

    Operador Descrição Exemplo

    && Condição ‘E ’ – faz averificação e asduas condiçõesdevem serverdadeiras paraque seja retornado‘true ’

    int  numero = 1;

    boolean  resultado;

    resultado = (numero >0 && numero < 3 ); //ovalor ‘true’ é atribuídoa variável ‘resultado’  

    || Condição ‘OU’   – faza verificação e umadas duas condiçõesdeve ser verdadeirapara que sejaretornado ‘true ’

    int  numero = 1;boolean  resultado;

    resultado = (numero

    == 2 || numero > 10 );

     //o valor ‘false’ é

    atribuído a variável

    ‘resultado’  

    Tabela 5: Operadores Lógicos em Java

  • 8/19/2019 Apostila de JAVA.pdf

    29/147

    Programação em Java

    28 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Estruturas de Controle

    O fluxo de um sistema desenvolvido pode terseu rumo alterado conforme o valor inserido (Decisão),ou tem-se a necessidade de repetir algum trecho decódigo por algum período seja ele fixo, ou por algumacondição de parada (Repetição). Para isso temosalguns recursos para controle do fluxo do programa,vamos ver quais são e como funciona cada um deles.

    Decisão

    IF-Else

    Este é um dos comandos mais comuns paracontrole de fluxo. Com as tomadas de decisõestrazendo respostas booleanas , ou seja, verdadeiras oufalsas, pode ser que eu queira tomar alguma ação se

    for verdadeira e outra completamente diferente se forfalsa, e para esse tipo de controle usamos o If-Else, quepode facilmente ser traduzido para ‘Se-Senão’, paraessas tomadas de decisões utilizamos os operadores

    lógicos , =.

    Por exemplo, para verificar se o valor digitado

    não é negativo, para o caso de validação de um sistemade pagamento de uma conta, por exemplo:

    if  ( valor < 0) {

    System.out.println ("O valor não pode ser

    negativo ");

    } else {

  • 8/19/2019 Apostila de JAVA.pdf

    30/147

    Programação em Java

    29 | w w w . b o r g e s r i n o l f i . c o m . b r 

    System.out.println ("O valor esta correto.

    ");

    }Código 16: Estrutura if-else 

    O bloco ‘else’  é opcional, caso você queira quealgo aconteça.

    O comando ‘if-else’ pode ser aninhado comvárias sequencias de decisões, e a sequencia dasdecisões são seguidas, caso a primeira seja satisfeita,

    nenhuma mais será testada, conforme o exemploabaixo:

    if  ( nota >= 9) {

    System.out.println ("Você passou com

    louvor!");

    } else if  ( nota >= 8) {

    System.out.println ("Você passou!");

    } else if  ( nota >= 7) {System.out.println ("Você passou raspando!");

    } else if  ( nota >= 6) {

    System.out.println ("Você não passou pois a

    média é 7, tente novamente!");

    } else {

    System.out.println ("Você precisa estudar

    mais!");

    }

    Código 17: Estrutura if-else aninhada 

    Switch

    O Comando ‘switch’  pode ter vários caminhos deexecução possíveis, conforme exemplo abaixo:

    int numero = 8;

  • 8/19/2019 Apostila de JAVA.pdf

    31/147

    Programação em Java

    30 | w w w . b o r g e s r i n o l f i . c o m . b r 

    String colocacao;

    switch (numero) {

    case 1: colocacao = "Primeiro";break;

    case 2: colocacao = "Segundo";

    break;

    case 3: colocacao = "Terceiro";

    break;

    case 4: colocacao = "Quarto";

    break;

    case 5: colocacao = "Quinto";

    break;case 6: colocacao = "Sexto";

    break;

    case 7: colocacao = "Sétimo";

    break;

    case 8: colocacao = "Oitavo";

    break;

    case 9: colocacao = "Nono";

    break;

    case 10: colocacao = "Décimo";

    break;

    default: colocacao = "Acima do

    décimo";

    break;

    }

    System.out.println(colocacao);

    Código 18: Estrutura do comando switch

    Neste código a variável ‘numero’   representa acolocação do candidato e deve ser impressa na tela acolocação por extenso até a 10ª posição, acima destaposição deve aparecer a mensagem "Acima dodécimo", como a variável número é ‘8’, deve serimpresso na tela a mensagem "Oitavo".

  • 8/19/2019 Apostila de JAVA.pdf

    32/147

    Programação em Java

    31 | w w w . b o r g e s r i n o l f i . c o m . b r 

    ATENÇÃO: No bloco do ‘switch’   eu posso terquantos ‘case’   for necessário, a instrução ‘break ’ é

    necessário para o comando parar de ser executadoapós ter encontrado a opção correta, caso contráriotodos os ‘case’   abaixo da opção escolhida, tambémserá executado.

    Repetição

    Estruturas de repetição são utilizadas para

    executar um trecho de código algumas vezes, ou umnúmero de vezes fico ou definindo uma condição deparada.

    While e Do-While

    O comando WHILE executa um trecho de códigoenquanto a condição permanecer verdadeira.

    Por exemplo, o código abaixo imprime númerosde 1 a 100.

    int contador = 1;

    while (contador

  • 8/19/2019 Apostila de JAVA.pdf

    33/147

    Programação em Java

    32 | w w w . b o r g e s r i n o l f i . c o m . b r 

    ATENÇÃO : É importante definir uma condição de

    parada, pois caso não seja bem definido teremos o quechamamos de um laço infinito, o que quer dizer que só iraterminar quando o programa for encerrado.

    Na repetição DO-WHILE a única diferença é que averificação da condição é feito no final, ou seja, sempre seráexecutado pelo menos uma vez o bloco de código desejado.Veja o mesmo exemplo acima, feito com DO-WHILE:

    int contador = 1;

    do{

    System.out.println("Número "  +

    contador);

    contador++;

    }while(contador

  • 8/19/2019 Apostila de JAVA.pdf

    34/147

    Programação em Java

    33 | w w w . b o r g e s r i n o l f i . c o m . b r 

    vezes que o laço irá percorrer, como no exemploabaixo:

    int[] numeros = {1, 2, 3, 4, 5};

    for  (int cont : numeros) {

    System.out.println("Número: "  +

    cont);

    }

    Código 22: Estrutura do For-each

    Esse laço ira percorrer as 5 posições do array  chamado ‘numeros’ , e guardar a posição atual navariável ‘cont’   para que possa ser utilizado dentro dolaço.

  • 8/19/2019 Apostila de JAVA.pdf

    35/147

    Programação em Java

    34 | w w w . b o r g e s r i n o l f i . c o m . b r 

    2. Orientação a Objetos

    A programação Orientada a Objetos foidesenvolvida para resolver alguns problemas daprogramação procedural como, por exemplo:

    •  Muita linha de código•  Difícil manutenção•  Difícil avaliar impacto de mudanças•

      Não modularizadoBasicamente a orientação objetos consiste emtrazer a programação o mais próximo possível domundo real. Ou seja, no mundo real o que temos sãoobjetos interagindo um com outro, através de troca demensagens.

  • 8/19/2019 Apostila de JAVA.pdf

    36/147

    Programação em Java

    35 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Como no exemplo ilustrado abaixo:

    Figura 9: Troca de mensagem, principio básico daOrientação a Objetos

    A orientação a objetos consiste em consideraruma coleção de objetos que interagem de maneiraorganizada.

    Pode parecer complicado, mas veremos comotraduzir isso para o mundo computacional.

    A responsabilidade do programador éespecificar quais serão as mensagens que cada objetopode receber e também qual ação o objeto deve fazerao receber a mensagem.

    Por exemplo, vamos imaginar um caso real,temos que desenvolver um software para uma locadoraque tem diversos clientes.

    Objeto: Paulo

    Ação: Falar

    Objeto: Rafaela

    Ação: Ouvir

    Mensagem:“Oi tudo bem?”

  • 8/19/2019 Apostila de JAVA.pdf

    37/147

    Programação em Java

    36 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 10: Representação de objetos do mundo real

    1. O objeto cliente escolhe o filme e passa umamensagem para o objeto atendente com umparâmetro, que é o nome do filme que o clientedeseja.

    2. O Atendente ao receber essa mensagem

    reserva o filme, enviando uma mensagem aoobjeto Filme.

    3. O Filme ao receber essa mensagem, é colocadoem um status de alugar, através da ação‘serAlugado’ .

    Esses objetos são estruturas de programação

    que contêm informações e os comportamentos querepresentam um objeto dentro do sistema.

    ClassesUma classe é uma estrutura criada para criação

    de objetos.

    Objeto: Cliente1

    Ação: EscolherFilme

    Objeto: Atendente

    Ação: ReservarFilme

    EscolherFilme(nomeDoFilme)

    Objeto: FilmeAção: serAlugado

    serAlugado()

  • 8/19/2019 Apostila de JAVA.pdf

    38/147

    Programação em Java

    37 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Vimos que um objeto representa algo do mundoreal, e podemos ter vários objetos do mesmo tipo, por

    exemplo, pessoas são bilhões de pessoas no mundocom as mesmas características, e para isso criarmosuma estrutura única que pode representar váriosobjetos. Como no modelo abaixo:

    Figura 11: Classe é estrutura que se pode gerar vários objetos

    É como se a Classe fosse uma receita de umbolo, a receita em si ela não é física e não ocupa umespaço, não tem cheiro, porém através dela podemoscriar um bolo real que tem cheiro, e é físico. A receita

    Classe$ Pessoa

    Atri#utos$

    %ome

    &dade

    e#o

    A$%o$

    (alar)*

    O#&eto$ Pessoa+

    Atri#utos$

    %ome$ João

    &dade$ +,

    e#o$ Masculino

    A$%o$

    (alar)*

    O#&eto$ Pessoa-

    Atri#utos$

    %ome$ Maria

    &dade$ -

    e#o$ /eminino

    A$%o$

    (alar)*

  • 8/19/2019 Apostila de JAVA.pdf

    39/147

    Programação em Java

    38 | w w w . b o r g e s r i n o l f i . c o m . b r 

    seria a Classe e a partir dela posso criar vários bolos,ou melhor, objetos.

    Agora que já sabemos o que é uma classevejamos como criar a classe Pessoa, definida acima,em Java.

    Criamos um arquivo chamado ‘Pessoa.java ’contendo o seguinte código:

     public class Pessoa {

    //Variáveis (Atributos) 

     public String nome;

     public int idade;

     public String sexo;

    //Métodos (ações) 

     public void falar (){

    System.out.println("Oi, Tudo bem?");

    //comando para exibir ‘Oi, Tudo bem?’ na tela 

    }

    }

    Código 23: Código da classe Pessoa.java

    Atributos

    As variáveis (atributos) da classe pessoa são nome,idade e sexo, todas elas são declaradas da seguinte forma:

    Código 24: Estrutura de declaração de varivaies 

    Onde os modificadores de acesso podem ser:

  • 8/19/2019 Apostila de JAVA.pdf

    40/147

    Programação em Java

    39 | w w w . b o r g e s r i n o l f i . c o m . b r 

    •  public – Todas as outras classes tem acesso a essavariável

      private – Somente a própria classe pode acessar asvariáveis (no caso a classe Pessoa)•  protected  – As classes do mesmo pacote ou

    subclasses, podem acessar as variáveis.

    Veremos mais detalhes sobre os modificadoresno próximo capitulo.

    MétodosMétodos são procedimentos ou funções, que

    tem a capacidade de manipular os atributos paraexecutar alguma ação atribuída a classe, por exemplo anossa classe Pessoa, tem a responsabilidade de falar, epor isso foi especificado um método chamado ‘falar ’com um código para exibir uma frase na tela.

    Todos os métodos são compostos de:

    ()

    Código 25: Estrutura básica de um método

    Onde:•  Modificadores de acesso - são os mesmos que

    vimos para as variáveis.•  Tipo de Retorno  – trata-se do valor que será

    retornado após a execução do método, pode serutilizado todos os tipos de dados já conhecidos.

    •  Nome do Método – deve ser um nome coerentecom a ação que ele faz, inicia-se com letraminúscula por convenção.

  • 8/19/2019 Apostila de JAVA.pdf

    41/147

    Programação em Java

    40 | w w w . b o r g e s r i n o l f i . c o m . b r 

    •  Parâmetros  – são variáveis que o métodorecebe para poder manipular e auxiliar a ação

    que será feita.

    Chamamos essa definição do método, deassinatura do método, ou seja, não sabemos ainda asua implementação, mas já podemos entender o queela deve fazer, os parâmetros que recebe e o tipo deretorno.

    Sobrecarga de métodos

    Em java podemos ter dois métodos com omesmo nome, desde que tenham parâmetrosdiferentes, chamamos isso de sobrecarga de métodos.

    Por exemplo:

    //Métodos (ações)

     public void  falar (){

    System.out.println("Oi, Tudo

    bem?");//comando para exibir ‘Oi, Tudo bem?’

    na tela

    }

     public void  falar (String frase){

    System.out.println(frase);//comando

     para exibir o conteúdo da variável 'frase' natela

    }

    Código 26: Dois métodos podem ter o mesmo nomedesde que tenham parâmetros diferentes

    Objetos

  • 8/19/2019 Apostila de JAVA.pdf

    42/147

    Programação em Java

    41 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Como vimos até agora a linguagem java temtoda sua estrutura baseada em objetos interagindo

    entre si através de passagem de parâmetros utilizandométodos.

    Veremos agora como criar, na prática, algunsobjetos, aproveitando ainda o exemplo de pessoas.Criaremos uma nova classe chamada‘ExemploObjetos.java ’.

    1 public class ExemploObjetos {2  public static void   main(String[] args)

    {

    3 Pessoa pessoa1; //a variável

    'pessoa1' é do tipo Pessoa 

    4

    5 pessoa1 = new   Pessoa();

    //'pessoa1' foi alocado na memória tendo

    todos atributos de Pessoa 

    6

    7 //atribuindo valor para os

    atributos do objeto 

    8 pessoa1.nome = "João";

    9 pessoa1.idade = 18;

    10 pessoa1.sexo = "Masculino";

    11 }

    12 }

    Código 27: : Criação de objetos e atribuição de valoresa seus atributos

    Na linha 3 apenas declaramos que a variável‘pessoa1’ é uma variável do tipo ‘Pessoa’, ou seja, elaterá todas as características de pessoas.

  • 8/19/2019 Apostila de JAVA.pdf

    43/147

    Programação em Java

    42 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Na linha 5 é onde efetivamente criamos (oucomo dizemos instanciamos), a palavra reservada new  é

    quem tem a capacidade de criar o objeto, a frente dapalavra new , esta o construtor, que inicializa o objeto,veremos mais detalhes do construtor no próximocapítulo.

    Após a criação do objeto já temos alocado namemória o valor padrão de cada atributo da classe

    Pessoa, conforme vemos abaixo:

    •  Variável: pessoa1•  Tipo: Pessoa.java•  Atributos:

    •  String nome = null;•  int idade = 0;•

      String sexo = null;

    Das linhas 8 a 10 alteramos os valores dessesatributos.

    Já que temos agora o objeto pronto com osvalores iniciados podemos fazer a chamada ao seumétodo da seguinte forma:

    pessoa1.falar();Desta forma estamos chamando o método

    falar(), que pelo código dele escreve na tela amensagem ‘Oi, Tudo bem? ’.

  • 8/19/2019 Apostila de JAVA.pdf

    44/147

    Programação em Java

    43 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Para entendermos melhor a importância dosmétodos e dos atributos, vamos alterar o código do

    método ‘falar()’ da classe Pessoa  para o código abaixo:

     public void  falar (){

    System.out.println("Oi, Tudo bem? Meu

    nome é: " +  this.nome);//comando para exibir

    ‘Oi, Tudo bem? Meu nome é: ’ + valor da

    variável ‘nome’ na tela 

    }

    Código 28: Imprimindo uma mensagem na tela 

    Agora vamos modificar a classe‘ExemploObjetos.java’  para o código abaixo:

     public class ExemploObjetos { public static void   main(String[] args) {

    Pessoa pessoa1; //a variável

    'pessoa1' é do tipo Pessoa 

     pessoa1 = new   Pessoa(); //'pessoa1'

    foi alocado na memória tendo todos atributos

    de Pessoa 

    //atribuinto valor para os atributos

    do objeto 

     pessoa1.nome = "João";

     pessoa1.idade = 18;

     pessoa1.sexo = "Masculino";

     pessoa1.falar();

    Pessoa pessoa2;

     pessoa2 = new   Pessoa(); //'pessoa2'

    foi alocado na memória tendo todos atributos

    de Pessoa 

  • 8/19/2019 Apostila de JAVA.pdf

    45/147

    Programação em Java

    44 | w w w . b o r g e s r i n o l f i . c o m . b r 

    //atribuinto valor para os atributos

    do objeto  pessoa2.nome = "Maria";

     pessoa2.idade = 25;

     pessoa2.sexo = "Feminino";

     pessoa2.falar();

    }

    }

    Código 29: Criação de dois objetos e chamada de

    método 

    Temos agora dois objetos criados (pessoa1 epessoa2) com base na classe Pessoa, e chamamos ométodo falar()  dos dois objetos. O resultado final quedevemos ver na tela é o seguinte:

    Oi, Tudo bem? Meu nome é: João

    Oi, Tudo bem? Meu nome é: Maria

    Construtores

    Como pudemos ver no código da classe‘ExemploObjetos.java’ primeiro instanciamos o objeto(new) e depois nas linhas 8 a 10 e 19 a 21, atribuímos

    valores aos atributos do objeto.

    O construtor é um método que é chamado nomomento da inicialização do objeto. Ele deve ter onome idêntico ao da classe, e não tem um tipo deretorno.

  • 8/19/2019 Apostila de JAVA.pdf

    46/147

    Programação em Java

    45 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Para criar um construtor para a classe‘Pessoa.java ’ utilizaremos o código abaixo:

    //Construtor para inicializar as

    variváveis

     public  Pessoa(String nome, int  idade,

    String sexo) {

    this.nome = nome;

    this.idade = idade;

    this.sexo = sexo;

    }

    Código 30: Construtor da classe Pessoa.java 

    Após essa alteração, temos que alterar a classe‘ExemploObjetos.java ’, conforme o código abaixo:

     public class ExemploObjetos { public static void   main(String[] args) {

    Pessoa pessoa1;

     pessoa1 = new  

    Pessoa("João",18,"Masculino");

     pessoa1.falar();

    Pessoa pessoa2;

     pessoa2 = new   Pessoa("Maria", 25,

    "Feminino");

     pessoa2.falar();

    }

    }

    Código 31: Criação de objetos utilizando construtorespara inicializar os atributos

    Agora ao instanciarmos um objeto da classePessoa , o método inicializador, ou seja, o construtor jáatribuiu os valores para seus atributos, e nãoprecisamos atribuir um a um.

  • 8/19/2019 Apostila de JAVA.pdf

    47/147

    Programação em Java

    46 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Anteriormente conseguimos instanciar a classe

    Pessoa, sem ter definido explicitamente um construtorpadrão, de padrão a classe já tem um construtor quenão recebe parâmetro nenhum, porém devemos tomarcuidado, pois os atributos vão assumir o valor padrãode acordo com o tipo de dados.

    Para garantirmos que todos os atributos

    essenciais sejam preenchidos com valores reais, énecessário especificar um construtor.

    ATENÇÃO: como o construtor é um método,podemos também fazer sobrecarga dele.

    Pacotes e importaçõesCom a orientação a objetos, cada classe é um

    arquivo, além do arquivo principal, e de muitos outrosque são criados nesse tipo de projeto. Para issoprecisamos organizar muito bem os códigos, para o java se aproveita de uma estrutura já conhecida quesão as pastas e dentro dessas pastas colocamos

    nossos arquivos.A diferença é que no Java chamamos essaspastas de pacotes (packages).

    Após incluir o arquivo ‘. java’   no diretóriodesejado, é feita uma declaração desse pacote naprimeira linha do arquivo, conforme código abaixo:

  • 8/19/2019 Apostila de JAVA.pdf

    48/147

  • 8/19/2019 Apostila de JAVA.pdf

    49/147

    Programação em Java

    48 | w w w . b o r g e s r i n o l f i . c o m . b r 

     public class  Motor  {

    }

     package primeiroexemplo;

     public class Carro  {

     private Motor motor ;

    }

    Código 34: Duas classes no mesmo pacote seconhecem facilmente

    Porém se dividirmos as duas classes cada umaem um pacote diferente, precisaremos usar o comandoimport  do java para podermos dizer onde se localiza aclasse desejada, conforme o código abaixo:

     package primeiroexemplo;

    import primeiroexemplo.pecas.Motor;

     public class Carro  {

     private Motor motor ;

    }

    Código 35: Classes em pacotes diferentes necessitamde um import

    Modificadores de acesso

    As classes, métodos e atributos são declaradospodendo ser especificado um modificador de acesso, ouseja, quem são as classes que poderão ter acesso aessa informação.

  • 8/19/2019 Apostila de JAVA.pdf

    50/147

    Programação em Java

    49 | w w w . b o r g e s r i n o l f i . c o m . b r 

    No java existem quatro tipos de modificadoresde acesso, publico (public), privado (private) e protegido

    (protected).

    •  public   – é visível por todas as classes doprojeto.

    •  private  – somente a própria classe tem acessoa ele mesmo.

    •  protected   – todas as classes que estão no

    mesmo pacote (package) pode tem acesso, etambém as suas subclasses, mesmo que estejaem outro pacote (ver mais em Herança).

    Dica: seja o mais restritivo possível com suasvariáveis e métodos, se você não tiver um bom motivouse private .

    HerançaImagine o seguinte cenário em nossos sistemas

    temos duas classes uma representando os Clientes eoutra representando os Funcionários, conforme odesenho abaixo:

  • 8/19/2019 Apostila de JAVA.pdf

    51/147

    Programação em Java

    50 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 12: Classes Funcionario.java e Cliente.java tem

    atributo iguais

    Podemos observar que os atributos ‘nome’   e‘CPF’  são comuns as duas classes, com isso podemoscriar uma categoria maior para classifica-los, com seusatributos em comuns, conforme diagrama abaixo:

    Figura 13: Herança, unificando as característicascomuns na superclasse Pessoa.java

  • 8/19/2019 Apostila de JAVA.pdf

    52/147

    Programação em Java

    51 | w w w . b o r g e s r i n o l f i . c o m . b r 

    As classes ‘Funcionário’ e ‘Cliente’, ficaram comos atributos específicos deles e a classe ‘Pessoa’ foi

    criada com os atributos em comuns entre eles.

    Dizemos que a classe ‘Funcionario’ HERDA ascapacidades da classe ‘Pessoa’, ou seja, todos osatributos e métodos públicos (public) e protegidos(protected) existentes na classe ‘Pessoa’ podem seracessados pela classe ‘Funcionario’.

    A classe ‘Funcionario’ é chamada de ‘classefilha’ ou ‘subclasse’ e a classe ‘Pessoa’ é chamaa de‘superclasse’ ou ‘classe pai’.

    A herança é um conceito simples, mas muitoimportante para orientação a objetos, é com ela que

    podemos reutilizar códigos e atributos já escritos, semter que reescrever, apenas herdando as suascapacidades, chamamos isso de reusabilidade decódigo.

    Em Java a herança é expressa pela palavrareservada ‘extends’ , o código das classes ilustradasacima ficaria da seguinte forma:

     public class Pessoa {

    //atributos 

     public Integer CPF ;

     public String nome;

    //outros códigos da classe 

  • 8/19/2019 Apostila de JAVA.pdf

    53/147

    Programação em Java

    52 | w w w . b o r g e s r i n o l f i . c o m . b r 

    }

    Código 36: Superclasse, ou classe pai, Pessoa.java 

     public class Cliente extends Pessoa {

    //atributos 

     public String classificacao;

    //outros códigos da classe 

    }

    Código 37: Subclasse, ou classe filha, Cliente.java 

     public class Funcionario  extends Pessoa {

    //atributos 

     public Integer CTPS;

     public double salario;

    //outros códigos da classe 

    }

    Código 38: Subclasse, ou classe filha, Funcionario.java

    Casting

    Para criar um objeto da classe Funcionario ,podemos utilizar o código abaixo:

    Funcionario func1 = new  Funcionario();

    Código 39: Criação do objeto Funcionario

    A variável func1  é do tipo Funcionario , porémcomo a classe Funcionario  estende (ou seja, herda) ascaracterísticas da classe Pessoa , podemos tambémescrever:

  • 8/19/2019 Apostila de JAVA.pdf

    54/147

    Programação em Java

    53 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Pessoa pessoa = new  Funcionario();

    Código 40: Tratar o objeto funcionario como Pessoa,afinal, pela herança o Funcionario é uma Pessoa

    Com isso estaremos criando um objetoFuncionario ( new Funcionario()), mas sabemos que eleé uma Pessoa , e podemos trata-lo como tal. Porém setentarmos fazer o inverso:

    Pessoa pessoa = new  Pessoa();

    Funcionario func1 = pessoa;

    Código 41: Não tem como o compilador saber sePessoa é um Funcionario 

    Como a variável ‘pessoa’  é do tipo ‘Pessoa’ , não temcomo o compilador saber se objeto vem de um ‘Funcionario’  ou de um ‘Cliente’ , causando um erro. Por isso podemos

    especificar para o compilador que tipo de objetos ele é, e issochama-se CASTING .

    Funcionario func1 = (Funcionario) pessoa;

    Código 42: Fazendo casting de Pessoa paraFuncionario 

    Caso você também não saiba o tipo do objetopessoa, você pode utilizar o código abaixo paraverificar:

    if  (pessoa instanceof  Funcionario) {

    Funcionario func1 = (Funcionario)

     pessoa;

    }

    Código 43: Utilizando INSTANCEOF para saber qual ainstancia do objeto

  • 8/19/2019 Apostila de JAVA.pdf

    55/147

    Programação em Java

    54 | w w w . b o r g e s r i n o l f i . c o m . b r 

    É como se fizéssemos a seguinte pergunta “Oobjeto pessoa é instanciado pela classe Funcionário?” .

    Polimorfismo

    É a capacidade de trabalhar com objetosreferenciados de várias formas, agrupando os objetos.

    Por exemplo, no exemplo utilizado acimatínhamos polimorfismo sendo utilizado na seguintelinha:

    Pessoa pessoa = new  Funcionario();

    Código 44: Polimorfismo é tratar um objeto como, outraclasse (uma classe pai, ou uma interface) 

    Ou seja, temos um objeto Funcionário   sendocriado (new  Funcionario()), porém ele esta sendotratado como Pessoa (Pessoa pessoa), somente poderáexecutar os métodos disponíveis na classe Pessoa.

    ATENÇÃO: Isso não quer dizer que o objetoFuncionário se transformou em Pessoa, toda e qualquercódigo escrito na classe Funcionário, será executada,pois é assim que o objeto foi criado na memória.

    Para esclarecer melhor a utilidade dopolimorfismo voltemos ao exemplo acima, com oseguinte modelo:

  • 8/19/2019 Apostila de JAVA.pdf

    56/147

    Programação em Java

    55 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 14: Herança de Pessoa, Funcionario e Cliente 

    Imagine que agora temos a necessidade de criaruma classe de mala direta responsável por imprimiretiquetas para todas as Pessoas da empresa,

    independente de ser Funcionario ou Cliente, porém,caso seja um funcionário, deve ser impressa nessaetiqueta o número CTPS do funcionário.

    Para isso podemos criar uma classe chamada‘MalaDireta’   com um método chamado‘imprimirEtiquetas’ , conforme modelo abaixo:

     public class  MalaDireta {

     public void  imprimirEtiquetas(Funcionario

    funcionario){

    System.out.println("Nome: " + 

    this.nome);

    System.out.println("CTPS: " + 

    this.CTPS);

  • 8/19/2019 Apostila de JAVA.pdf

    57/147

    Programação em Java

    56 | w w w . b o r g e s r i n o l f i . c o m . b r 

    }

     public void  imprimirEtiquetas(Clientecliente){

    System.out.println("Nome: " + 

    this.nome);

    }

    }

    Código 45: Desta forma teremos um método para cadaobjeto, se tivermos mais um objeto, teremos que escrever mais

    um método 

    A classe acima funcionaria perfeitamente para oproblema proposto, porém, caso o sistema tenha maisuma classe que estenda as capacidades de Pessoa, oualguma das classes existentes (Funcionario ou Cliente)seja removida, somos obrigados a alterar a classeMalaDireta, adicionando ou removendo métodos nela, oque dificultaria e muito a manutenção desse código.

    Para resolvermos esse problema poderíamosutilizar o modelo abaixo:

    Figura 15: Herança com a distribuição do método imprimir 

  • 8/19/2019 Apostila de JAVA.pdf

    58/147

    Programação em Java

    57 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Onde temos os métodos imprimir  com os dados

    das etiquetas dentro de cada entidade Cliente com umaimplementação padrão que todas as suas filhas irãoutilizar, porém no caso de Funcionário ele terá umaimplementação própria, a instrução @Override   acimada implementação deste método indica que estamosfazendo uma Sobrescrita de Métodos, e na classeMalaDireta   podemos criar um único método chamado

    imprimirEtiquetas(Pessoa pessoa) , recebendo comoparâmetro um objeto da classe Pessoa, podendo serFuncionario   ou Cliente   (pois uma vez que elesestendem a classe Pessoa, elas são uma Pessoa). Vejaabaixo como ficaria o código desse modelo:

     public class  MalaDireta { public void  

    imprimirEtiquetas(Pessoa pessoa){

    System.out.println(pessoa.imprimir ());

    }

    }

    Código 46: Classe MalaDireta.java com o método unicoque recebe Pessoa.java 

     public class Pessoa {

    //atributos 

     public Integer CPF ;

     public String nome;

    //Método para imprimir etiquetas

     public String imprimir (){

    return "Nome: " + this.nome;

  • 8/19/2019 Apostila de JAVA.pdf

    59/147

    Programação em Java

    58 | w w w . b o r g e s r i n o l f i . c o m . b r 

    }

    }

    Código 47: Classe Pessoa.java com a implementaçãobásica do método imprimir() 

     public class Cliente extends Pessoa {

    //atributos 

     public String classificacao;

    //outros códigos da classe 

    }

    Código 48: Classe Cliente.java, ira utilizar aimplementação da superclasse, ou seja, Pessoa.java 

    Classe Funcionario.java

     public class Funcionario  extends Pessoa {

    //atributos 

     public Integer CTPS;

     public double salario;

    //Método para imprimir etiquetas.

    Sobrescrito da classe Pai, Pessoa, pois tem

    características próprias.

    @Override

     public String imprimir () {

    return  "Nome: "  + this.nome  +

    "Carteira de trabalho: " + this.CTPS;

    }}

    Código 49: Classe Funcionario.java, sobrescreve ométodo imprimir() e tem a sua própria implementação 

    Com isso podemos utilizar o código abaixo emuma classe com método main , ou seja, no programaprincipal:

  • 8/19/2019 Apostila de JAVA.pdf

    60/147

    Programação em Java

    59 | w w w . b o r g e s r i n o l f i . c o m . b r 

     public static void   main(String[] args) {

    MalaDireta malaDireta = new  MalaDireta();

    Funcionario func1 = new  

    Funcionario();

    func1.nome = "Fucnionario 1";

    func1.CPF  = 123456;

    Cliente cl1 = new  Cliente();

    cl1.nome = "Cliente 1";

    malaDireta.imprimirEtiquetas(cl1);

    malaDireta.imprimirEtiquetas(func1);

    }

    Código 50: Classe principal, para ver o funcionamentodo polimorfismo em métodos. 

    Para concluir, independente do objeto passado

    como parâmetro para o método imprimirEtiquetas,desde que ele seja uma classe filha de Pessoa ele seráaceito no método.

    Classes e Métodos Abstratos

    Ainda no problema acima imagine que não há

    implementações padrões, cada classe filha (Funcionarioe Cliente) deve, obrigatoriamente, ter a suaimplementação do método imprimir, e este não seriamais escrito na classe Pai (Pessoa.java). Para esse tipode problema utilizamos métodos abstratos, ou seja, semimplementação. A classe Pessoa passaria a ter oseguinte código:

  • 8/19/2019 Apostila de JAVA.pdf

    61/147

    Programação em Java

    60 | w w w . b o r g e s r i n o l f i . c o m . b r 

     public abstract class Pessoa {

     public Integer CPF ;

     public String nome;

     public abstract String imprimir ();

    }

    Código 51: Estrutura de uma classe Abstrata

    Com essa alteração também precisamos fazerum ajuste na classe Cliente, que não tem umaimplementação explicita do método imprimir que agoraé obrigatório, a classe Cliente ficaria da seguinte forma:

     public class Cliente extends Pessoa{

     public String classificacao;

    @Override

     public String imprimir () {

    return "Nome: " + this.nome;

    }

    }

    Código 52: Implementando uma classe abstrata

    No método principal main , não precisa de

    alteração ele continua funcionando normalmente com omesmo resultado.

    ATENÇÃO:  Só podemos ter métodos abstratosem classes abstratas, ao torna-la uma classe abstrataNÃO podemos mais instanciar a classe diretamente, ou

  • 8/19/2019 Apostila de JAVA.pdf

    62/147

    Programação em Java

    61 | w w w . b o r g e s r i n o l f i . c o m . b r 

    seja, não podemos dar new direto na classe abstrata,apenas em suas filhas.

    Caso seja necessário podemos ter outrosmétodos, sem ser abstratos nesta classe, ou seja,implementado explicitamente em uma classe abstrata.

    InterfaceInterface é como um contrato estabelecido você

    cria uma classe apenas com a assinatura dos métodosque deseja que sejam implementados e as classes queimplementar essa interface devem escrever todo ocódigo dos métodos. Veja o mesmo exemplo acimautilizando Interface, para geração de etiquetas.

  • 8/19/2019 Apostila de JAVA.pdf

    63/147

    Programação em Java

    62 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 16: Modelagem UML da interfaceGeraEtiquetas.java

    Imagine o exemplo acima reformulado, agoraqueremos que além da herança, caso alguma classetenha que gerar etiquetas, ela deve implementar ainterface GeraEtiquetas. É como se o contrato fosse:

    “- Você quer ter a capacidade de geraretiqueta?

    - SIM

    - Então implemente a classe

    GeraEtiqueta, e com isso você será

    obrigado a implementar o método

    imprimir(), e estará apto a ser um objeto

    capaz de gerar etiquetas.”

  • 8/19/2019 Apostila de JAVA.pdf

    64/147

    Programação em Java

    63 | w w w . b o r g e s r i n o l f i . c o m . b r 

    A programação dessas classes ficaria da

    seguinte forma:

     public interface GeraEtiquetas { public String imprimir ();

    }

    Classe MalaDireta.java

     public class  MalaDireta {

     public  void  imprimirEtiquetas(GeraEtiquetas etiqueta) {

    System.out.println(etiqueta.imprimir());

    }

    }

    Código 53: Estrutura da interface GeraEtiquetas.java 

     public class Pessoa {

     public Integer CPF ;

     public String nome;

    }

    Código 54: Classe Pessoa.java

     public  class  Funcionario   extends  Pessoa

    implements GeraEtiquetas{

     public Integer CTPS;

     public double salario;

    @Override

     public String imprimir () {

    return  "Nome: "  + this.nome  +

    "Carteira de trabalho: " + this.CTPS;

    }

  • 8/19/2019 Apostila de JAVA.pdf

    65/147

    Programação em Java

    64 | w w w . b o r g e s r i n o l f i . c o m . b r 

    }

    Código 55: Classe Funcionario.java estendendo as

    capacidades de Pessoa e implementando a interfaceGeraEtiquetas

     public  class  Cliente  extends  Pessoa

    implements GeraEtiquetas{

     public String classificacao;

     public String imprimir () {

    return "Nome: " + this.nome;

    }}

    Código 56: Classe Cliente.java também estende ascapacidades de Pessoa e implementa a classe GeraEtiquetas

    A vantagem de se ter interfaces é que podemosagora imprimir etiquetas de outras classes e nãoapenas daquelas que herdam de Pessoa, como por

    exemplo de um produto. Veja como ficaria o modelo:

  • 8/19/2019 Apostila de JAVA.pdf

    66/147

    Programação em Java

    65 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Figura 17: Podemos agora incluir no modelo mais umaclasse para gerar etiquetas, independente da herança

    Como a classe Produto “assinou contrato” paraser um objeto capaz de imprimir etiquetas ele podeutilizar o método da classe MalaDiretaimprimirEtiquetas(GeraEtiquetas etiqueta) .

  • 8/19/2019 Apostila de JAVA.pdf

    67/147

    Programação em Java

    66 | w w w . b o r g e s r i n o l f i . c o m . b r 

    4. Exceções

    Exceções são eventos acontecem fora do fluxono normal do programa, previstos ou não, e quedevemos tratar de alguma forma, seja para sugerir aousuário como corrigir, ou para informar que algoaconteceu de errado, enviando uma mensagemamigável para o usuário do sistema.

    Existem três tipos de exceções:

    •  Checked Exceptions  – condições especiaisque podem ser previstas ou recuperadas, comopor exemplo, na leitura de arquivo texto, caso oarquivo apontado não exista pode ser lançadouma exceção ( java.io.FileNotFoundException ) eser tratada apresentando uma mensagem para ousuário corrigir o caminho do arquivo.

    •  Unchecked Exceptions  – as uncheckedsexceptions  se divide em dois grupos:

    o  Error  – define erros normalmenteexterno a aplicação, são impossíveis de

  • 8/19/2019 Apostila de JAVA.pdf

    68/147

    Programação em Java

    67 | w w w . b o r g e s r i n o l f i . c o m . b r 

    prever e de recuperar, pois são errosgraves que torna impossível a

    continuação do código. Talvez vocêdeseje capturar esse tipo de evento,apenas para gravar um log, ou imprimir apilha de erros, para analise.

    o  RuntimeExceptions  – condiçõesinternas da aplicação, porém tão graves

    que não é possível prever nem recuperaro programa. Normalmente trata-se de umbug na aplicação ou de mal uso dealguma implementação.

    ATENÇÃO:  Apenas as Checked Exceptions  podem ter seus erros capturados por try-catch   que

    vamos ver abaixo.

    Capturando e manipulando umaexceção

    Tome como exemplo o código abaixo, que temum vetor de 10 posições e insere o número 0 em todaselas.

     public static void   main(String[] args) {

    int[] vetor = new  int[10];

    for  (int i = 0; i < 15; i++) {

  • 8/19/2019 Apostila de JAVA.pdf

    69/147

    Programação em Java

    68 | w w w . b o r g e s r i n o l f i . c o m . b r 

    vetor[i] = 0;

    System.out.println("Inserido na

     posição: " + i);}

    }

    Código 57: O número de posições excede o permitidocausando uma exceção

    Porém no laço for, vamos até a posição 15, ouseja, ao tentar inserir na posição 11, teremos um erro,uma Exception(java.lang.ArrayIndexOutOfBoundsException) , conformemostrado abaixo:

    Exception in thread "main"

    java.lang.ArrayIndexOutOfBoundsException: 10

    at

    javaapplication1.JavaApplication1.main(JavaAp

     plication1.java:17)

    Java Result: 1

    Para capturarmos essa exceção e darmos umtratamento amigável a ela, podemos alterar o códigoconforme abaixo:

     public static void   main(String[] args) {

    try  {

    int[] vetor = new  int[10];

    for  (int i = 0; i < 15; i++) {

    vetor[i] = 0;

    System.out.println("Inserido

    na posição: " + i);

    }

    } catch 

    (ArrayIndexOutOfBoundsException e) {

  • 8/19/2019 Apostila de JAVA.pdf

    70/147

    Programação em Java

    69 | w w w . b o r g e s r i n o l f i . c o m . b r 

    System.err .println("Você excedeu

    o limite de posições do vetor!");

    }}

    Código 58: Tratamento de exceção utilizando try-catch

    Com isso dizemos o seguinte, tente (try)executar o trecho de código, se em algum momentodeste bloco, alguém lançar uma exceção do tipoArrayIndexOutOfBoundsException , capture (catch) esse

    erro e execute o trecho de código do catch, no nossocaso imprime na tela a mensagem "Você excedeu olimite de posições do vetor!".

    Poderíamos incluir instruções para tentarrecuperar o sistema ou para fechar conexão, entreoutros.

    Podemos capturar todo o tipo de exceção, casotivermos conhecimento que ela exista, caso nãosoubermos qual é a exceção que pode ser lançada ouquisermos tomar a mesma ação para qualquer tipo deexceção, podemos capturar a exceção Exception, que éa classe pai de todas as exceções.

    FICA A DICA:   A partir do Java 7 podemoscapturar (catch) várias exceções, e dar o mesmotratamento para elas, como no exemplo abaixo, ondecapturamos três exceções possíveis(ClassNotFoundException, IllegalAccessException,InstantiationException ) e imprimimos na tela a mesmamensagem para todos:

  • 8/19/2019 Apostila de JAVA.pdf

    71/147

    Programação em Java

    70 | w w w . b o r g e s r i n o l f i . c o m . b r 

     public static void   main(String[] args) {

    try  {

    Class clazz =Class.forName("java.lang.String");

    Object objeto =

    clazz.newInstance();

    System.out.println(objeto.getClass());

    } catch  (ClassNotFoundException

    |IllegalAccessException |

    InstantiationException ex) {

    System.err .println("Erro ao criaro objeto: " + ex.getMessage());

    }

    }

    Código 59: JAVA 7 - podemos tratar varias exceçõescom o mesmo algoritmo 

    Lançando sua própria exceção

    Além das exceções lançadas por algum eventoconforme vimos, podemos criar métodos que lancem aexceção que desejarmos.

    Vamos alterar o exemplo do vetor para validar otamanho do vetor antes de executar o código, caso seja

    invalido será capturada uma exceção já existentechamada EmptyStackException. Essa exceção serálançada manualmente através da instrução throw   nométodo validaTamanho( int  tamanho), a instrução throws  na assinatura do método indica a quem for utilizar essemétodo que é necessário tratar uma exceção lançada,no caso EmptyStackException .

  • 8/19/2019 Apostila de JAVA.pdf

    72/147

    Programação em Java

    71 | w w w . b o r g e s r i n o l f i . c o m . b r 

     public static void   main(String[] args) {

    int[] vetor = new  int[10];int tamanho = 15;

    try  {

    validaTamanho(tamanho);

    for  (int i = 0; i < tamanho; i++)

    {

    vetor[i] = 0;

    System.out.println("Inserido

    na posição: " + i);}

    } catch 

    (ArrayIndexOutOfBoundsException e) {

    System.out.println("Você excedeu

    o limite de posições do vetor");

    }catch (EmptyStackException e){

    System.out.println("Tamanho

    invalido de vetor!");

    }}

     private  static  void   validaTamanho (int 

    tamanho) throws EmptyStackException {

    if (tamanho > 10){

    throw  new  EmptyStackException();

    }

    }

    Código 60: Utilizando método para lançar manualmenteuma exceção

    Criando sua própria Exceção

    No exemplo anterior usamos uma exceção jáexistente, mas temos ainda opção de criar a nossaprópria exceção, mantendo um código melhor euniformizando as mensagens.

  • 8/19/2019 Apostila de JAVA.pdf

    73/147

    Programação em Java

    72 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Para isso criamos uma classe chamada

    ValidaTamanhoVetorException.java   que extends   aclasse Exception , e sobrescrevemos o métodogetMessage()  para que retorne a mensagem que nósdesejamos, veja o código abaixo:

     public  class  ValidaTamanhoVetorException 

    extends Exception{

    @Override public String getMessage() {

    return "Tamanho invalido de vetor!";

    }

    }

    Código 61: Criando uma classe de exceção, ela podeser utilizada em todo o sistema, padronizando as mensagens de

    erros inesperados.

    E com isso podemos fazer uma pequenaalteração no código principal, conforme exemplo abaixo:

     public static void   main(String[] args) {

    int[] vetor = new  int[10];

    int tamanho = 15;

    try  {

    validaTamanho(tamanho);

    for  (int i = 0; i < tamanho; i++){

    vetor[i] = 0;

    System.out.println("Inserido

    na posição: " + i);

    }

    } catch 

    (ArrayIndexOutOfBoundsException e) {

  • 8/19/2019 Apostila de JAVA.pdf

    74/147

    Programação em Java

    73 | w w w . b o r g e s r i n o l f i . c o m . b r 

    System.out.println("Você excedeu

    o limite de posições do vetor");

    }catch  (ValidaTamanhoVetorExceptione){

    System.out.println(e.getMessage());

    }

    }

     private  static  void   validaTamanho (int 

    tamanho) throws ValidaTamanhoVetorException{

    if (tamanho > 10){throw   new  

    ValidaTamanhoVetorException();

    }

    }

    Código 62: Código lançando nossa própria exception.

    Instrução Finally

    Ainda dentro do bloco de instrução de capturade exceções, podemos utilizar o bloco finally paraexecutar alguma ação após o bloco try ou após algumcatch, independente de ter dado certo ou não eletentara executar o trecho de código do finally. Estainstrução é muito utilizada para fechar arquivos ouconexões, que devem ser fechadas independe de ter

    dado certo o comando ou não. Deve ser utilizadoconforme exemplo:

    try  {

    // bloco try  

    } catch (IOException ex) {

    // bloco catch 

    } finally  {

  • 8/19/2019 Apostila de JAVA.pdf

    75/147

    Programação em Java

    74 | w w w . b o r g e s r i n o l f i . c o m . b r 

    // bloco que será sempre

    executado, independente 

    // de ter dado erro ou não }

    Código 63: Finally é executado sempre, ao final do tryou da exceção causada, desde que a exceção não seja critica

    que deixe o sistema inoperante. 

    Try-with-resources no Java 7Na versão 7 do Java foi lançado um recurso,

    para reduzir e tornar mais legível o código do try-catch ,trata-se de um recurso chamado de try-with- resources .

    O problemaAo tentar, por exemplo, ler um arquivo o primeiro

    passo é abrir o arquivo, caso der algum erro será

    lançado uma exceção, porém, se der algum erro naleitura de um arquivo já aberto, você deve tratar o erro efechar o arquivo sempre (normalmente incluído no blocofinally ), o que pode causar outro erro (outra exceção), ecom isso o código fica mais complicado e de difícilentendimento, veja o exemplo abaixo:

     public  String lerPrimeiraLinha(String

     path) {

    BufferedReader br = null;

    try  {

    br = new   BufferedReader(new  

    FileReader(path));

    return br.readLine();

    } catch (IOException ex) {

  • 8/19/2019 Apostila de JAVA.pdf

    76/147

    Programação em Java

    75 | w w w . b o r g e s r i n o l f i . c o m . b r 

    System.out.println("Falha ao ler

    arquivo: " + ex.getMessage());

    } finally  {if  (br != null) {

    try  {

    br.close();

    } catch (IOException ex) {

    System.out.println("Falha

    ao fechar buffer: " + ex.getMessage());

    }

    }

    }return null;

    }

    Código 64: Código necessário para ler arquivo antes doJava 7

    A soluçãoNo Java 7 podemos incluir o recurso como um

    parâmetro na instrução try , e ele será fechadoautomaticamente após a execução do bloco try . Veja ocódigo abaixo, utilizando try-with-resources :

     public  String lerPrimeiraLinha(String

     path) {

    try (BufferedReader br = new  

    BufferedReader(new  FileReader(path))) {

    return br.readLine();

    } catch (IOException ex) {

    System.out.println("Falha ao ler

    arquivo: " + ex.getMessage());

    }

    return null;

    }

    Código 65: Código mais limpo, utilizando novosrecurso do Java 7

  • 8/19/2019 Apostila de JAVA.pdf

    77/147

    Programação em Java

    76 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Temos um código bem mais limpo e fácil deentender.

    IMPORTANTE: Isso só é possível, pois orecurso que é utilizado como parâmetro no try   deveimplementar asclasses java.lang.AutoCloseable  ou java.io.Closeable ,no nosso caso a classe BufferedReader , na versãoJava 7 já implementa a classe AutoCloseable .

  • 8/19/2019 Apostila de JAVA.pdf

    78/147

    Programação em Java

    77 | w w w . b o r g e s r i n o l f i . c o m . b r 

    5. Coleções

    Também conhecidos como Collections , sãoclasses responsáveis por auxiliar a manipulação degrandes quantidades de dados.

    Os arrays  são utilizados para armazenar váriosobjetos, porém existe uma série de dificuldades emtrabalhar com array , por exemplo, eles têm tamanhofixo, e caso seja necessário aumentar o tamanho, épreciso criar um novo vetor e transferir os dados de umpara o outro, ou se precisarmos inserir um elementonomeio do vetor, ou remover algum.

    Para resolver essas complexidades e nãoprecisarmos reescrever códigos para resolver

    problemas comuns, o Java criou o CollectionsFramework, composto de interfaces, implementações, ealgoritmos, todos preparados para as funcionalidadesbásicas de grandes volumes de dados.

    Interfaces

  • 8/19/2019 Apostila de JAVA.pdf

    79/147

    Programação em Java

    78 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Existe um conjunto de interfaces que define osmétodos essenciais para se trabalhar com coleções

    para vários propósitos, segue abaixo um desenho decomo funciona as interfaces de coleções:

    Figura 18: Classes que compõe o CollectionFramework do Java

    Figura 19: Embora o Map, faça parte do CollectionFramework, ele não herda as capacidades da classe Collection,é uma estrutura independente.

    •  Collection  – é um interface que definecaracterísticas em comum a todas as suas

    Collection

    et

    ortedet

    0ist 1ueue

    Map

    ortedMap

  • 8/19/2019 Apostila de JAVA.pdf

    80/147

    Programação em Java

    79 | w w w . b o r g e s r i n o l f i . c o m . b r 

    classes filhas, não há implementação diretadesta classe, somente de suas subclasses.

    o  Set  – é uma coleção que não contemelementos duplicados. Asimplementações mais comuns destainterface são, HashSet, LinkedHashSet eTreeSet, veremos os detalhes de cadaimplementação mais a frente.

      SortedSet – Um conjunto Set que

    mantem os registros ordenadoso  List  – Uma lista ordenada, que permite

    objetos duplicados, utilizada onde énecessário o controle da localização doobjeto, pois é possível acessá-loreferenciando a posição do mesmo. Asimplementações de List são ArrayList e

    LinkedList.o  Queue – Uma coleção que implementa o

    conceito de FIFO (First in – First out),utilizando para manter registros antes dealgum processo, utiliza as operaçõesbásicas de inclusão e remoção de itens.

    •  Map - Uma lista que armazena dois objetos um

    para a chave e outro para o valor, não permitechaves duplicadas.o  SortedMap  – Um conjunto Map que

    mantem os registros ordenados

    Implementações

  • 8/19/2019 Apostila de JAVA.pdf

    81/147

    Programação em Java

    80 | w w w . b o r g e s r i n o l f i . c o m . b r 

    List

    Com as implementações de lista é possívelrecuperar um objeto pela posição em que ele foiinserido (get(int)), buscar o objeto e recuperar a posiçãoem que ele esta, listar todos os objetos na sequenciaem que foi inserido.

    Segue abaixo as diferenças entre duas dasprincipais implementações da interface List :

    •  LinkedList  – é uma implementação mais rápidapara inserir e remover itens, porém maisdemorada para percorrer os objetos da lista.

    •  ArrayList   – é mais rápido para percorrer osobjetos da lista, e para acessar aleatoriamenteum objeto, a busca pode ser feita diretamentepelo índice. É mais lento para inserir e remover

    objetos.

    Para instanciar uma a implementação ArrayListfazemos da seguinte forma:

    List listaFuncionarios = new  

    ArrayList();

    Código 66: Criando uma lista de Funcionarios 

    Veja que a instrução , é umafuncionalidade chamada Generics , utilizada a partir doJava 5, onde especificamos qual tipo de objeto vamosutilizar dentro da lista, ou seja, eu não posso inserir umaString   nessa lista, pois esta especificado o tipoFuncionario .

  • 8/19/2019 Apostila de JAVA.pdf

    82/147

    Programação em Java

    81 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Em seguida criamos os objetos da classe

    Funcionario, que serão adicionados na lista:Funcionario func1 = new  

    Funcionario();

    func1.nome = "Bianca";

    Funcionario func2 = new  

    Funcionario();

    func2.nome = "Adolfo";

    Código 67: Criação de objetos para inserir na lista

    Agora vamos adicionar os objetos func1 e func2na lista, podemos fazer isso de duas formas, uma éespecificando o índice que devera ser inserido o objeto,conforme abaixo:

    listaFuncionarios.add(0, func1);

    Código 68: Inserindo o objeto na lista, determinando aposição dele 

    Ou simplesmente inserindo o objeto e ele vaiinserir na próxima posição livre da lista:

    listaFuncionarios.add(func2);

    Código 69: Adicionando o objeto na lista sem fazerreferencia a posição dele 

    Para percorrermos os itens da lista e imprimir osnomes dos funcionários, podemos fazer de duasformas, a primeira é utilizando o comando for e ométodo get  para recuperar os objetos, conforme abaixo:

  • 8/19/2019 Apostila de JAVA.pdf

    83/147

    Programação em Java

    82 | w w w . b o r g e s r i n o l f i . c o m . b r 

    for  (int i = 0; i < 10; i++) {

    Funcionario funcionario =

    listaFuncionarios.get(i);System.out.println("Nome do

    Funcionario: " + funcionario.nome);

    }

    Código 70: Percorrendo todos os objetos da lista, deforma tradicional 

    Porém este método além de pouco pratico, é maislento do que utilizando o comando foreach , muito utilizado

    para percorrer Collections  em geral, por ser mais rápido, vejaabaixo como ficaria o mesmo código:

    for   (Funcionario funcionario :

    listaFuncionarios) {

    System.out.println("Nome do

    Funcionario: " + funcionario.nome);

    }

    Código 71: Percorrendo utilizando Foreach, a melhorforma de percorrer uma lista de objetos 

    PROCURE: Pesquise mais sobre a classe Iterator ,para entender por que o foreach  é mais rápido para percorrercollections .

    Se quisermos remover os itens da lista podemosutilizar também pelo índice ou direto pelo objeto, conforme ocódigo abaixo:

    listaFuncionarios.remove(1);

    Funcionario excluir =

    listaFuncionarios.get(0);

  • 8/19/2019 Apostila de JAVA.pdf

    84/147

    Programação em Java

    83 | w w w . b o r g e s r i n o l f i . c o m . b r 

    listaFuncionarios.remove(excluir);

    Código 72: Removendo objetos da lista por indice ou

    diretamente 

    Com isso excluímos todos os itens da nossa lista,para podermos checar se realmente todos os itens foramexcluídos, podemos checar o tamanho da lista utilizando ométodo size():

    System.out.println("Tamanho da lista: "  +listaFuncionarios.size());

    Código 73: Imprimindo o tamanho da lista 

    Confira o código completo da implementação de listaabaixo:

     public static void   main(String[] args) {

    //Instancia uma lista daimplementação ArrayList 

    List listaFuncionarios =

    new  ArrayList();

    //Criação dos objetos que vão ser

    inseridos na lista 

    Funcionario func1 = new  

    Funcionario();

    func1.nome = "Bianca";

    Funcionario func2 = new  

    Funcionario();

    func2.nome = "Adolfo";

    //adiciona os objetos na lista 

    listaFuncionarios.add(0, func1);

    listaFuncionarios.add(func2);

  • 8/19/2019 Apostila de JAVA.pdf

    85/147

    Programação em Java

    84 | w w w . b o r g e s r i n o l f i . c o m . b r 

    //percorre todos os itens da lista 

    for   (Funcionario funcionario :listaFuncionarios) {

    //imprime o nome de cada

    funcionario da lista 

    System.out.println("Nome do

    Funcionario: " + funcionario.nome);

    }

    //Remove o item na posição 1 da lista 

    listaFuncionarios.remove(1);

    //Recupera o objeto que esta na

     posição 0 da lista 

    Funcionario excluir =

    listaFuncionarios.get(0);

    //remove o objeto recuperado da lista 

    listaFuncionarios.remove(excluir);

    //imprime o tamanho atual da lista na

    tela 

    System.out.println("Tamanho da lista:

    " + listaFuncionarios.size());

    }

    Código 74: Código completo da implementação dejava.util.List 

    SETSet é um tipo de Collections   que não permite

    itens duplicados, as principais implementações são:•  HashSet  – é um tipo de implementação que

    armazena os dados em uma tabela hash, trata-se de uma das implementações mais rápidas,porém não tem garantia da ordem de inserção

  • 8/19/2019 Apostila de JAVA.pdf

    86/147

    Programação em Java

    85 | w w w . b o r g e s r i n o l f i . c o m . b r 

    dos objetos, no momento de exibir os itens elesapareceram em qualquer ordem.

    •  LinkedHashSet – armazena os objetos em umatabela hash, porém mantem uma listaencadeada, que garantem a ordem que osobjetos foram inseridos.

    •  TreeSet – armazena os objetos na estrutura deárvore, ordenando os objetos pelos valores.Devido a ordenação é mais lento que o

    HashSet.

    Segue abaixo o código do exemplo anterioragora implementado com HashSet , porém como nãosabemos as posições dos objetos, não podemosrecuperar (get), nem remover (remove) objetos pelaposição, afinal essa é a característica de Set.

     public static void   main(String[] args) {

    //Instancia um SET da implementação

    HashSet 

    Set setFuncionarios =

    new  HashSet();

    //Criação dos objetos que vão ser

    inseridos no Set 

    Funcionario func1 = new  Funcionario();

    func1.nome = "Bianca";

    Funcionario func2 = new  

    Funcionario();

    func2.nome = "Adolfo";

    //adiciona os objetos no Set 

  • 8/19/2019 Apostila de JAVA.pdf

    87/147

    Programação em Java

    86 | w w w . b o r g e s r i n o l f i . c o m . b r 

    setFuncionarios.add(func1);

    setFuncionarios.add(func2);

    //percorre todos os itens do Set 

    for   (Funcionario funcionario :

    setFuncionarios) {

    //imprime o nome de cada

    funcionario da lista 

    System.out.println("Nome do

    Funcionario: " + funcionario.nome);

    }

    //Remove o item na posição 1 do Set 

    setFuncionarios.remove(func1);

    //remove o objeto recuperado do Set 

    setFuncionarios.remove(func2);

    //imprime o tamanho atual do Set 

    System.out.println("Tamanho do Set: " 

    + setFuncionarios.size());

    }

    Código 75: Principais operações utilizando Set

    Map

    Mapas são coleções onde podem ser definidoschave e valor, onde a chave não pode ser duplicada.

    As principais implementações para Mapas são

    HashMap, o TreeMap e o Hashtable, que tem as

    mesmas diferenças das classes HashSet, TreeSet,and LinkedHashSet que vimos junto com asimplementações SET.

  • 8/19/2019 Apostila de JAVA.pdf

    88/147

    Programação em Java

    87 | w w w . b o r g e s r i n o l f i . c o m . b r 

    Segue abaixo o código com as principaisoperações com Mapas comentado:

     public static void   main(String[] args) {

    //instanciando a classe HashMap 

    Map semana = new  

    HashMap();

    //adicionando os dias da semana e

    suas chaves 

    semana.put(1, "Domingo");

    semana.put(2, "Segunda-Feira");

    semana.put(3, "Terça-Feira");

    semana.put(4, "Quarta-Feira");

    semana.put(5, "Quinta-Feira");

    semana.put(6, "Sexta-Feira");

    semana.put(7, "Sábado");

    //recuperando um item do mapa pela

    chave 

    String sabado = semana.get(7);System.out.println("O 7º dia da

    semana é: "+ sabado);

    //removendo do mapa um item pela

    chave 

    semana.remove(1);

    //percorrendo o mapa por valor, desta

    forma não é possível recuperar a chave doconteúdo

    //recuperado 

    for  (String string : semana.values())

    {

    System.out.println("Dia da

    semana: " + string);

    }

  • 8/19/2019 Apostila de JAVA.pdf

    89/147

    Programação em Java

    88 | w w w . b o r g e s r i n o l f i . c o m . b r 

    //percorrendo o mapa pela chave,

    assim podemos recuperar a chave e o valor  

    for   (Integer indice :semana.keySet()) {

    String dia = semana.get(indice);

    System.out.println("O "+indice+"º

    dia da semana é: "+ dia);

    }

    }

    Código 76: Principais operações com a classe Map

    Ordenação

    Além de toda implementação de coleção, aCollections   Framework, ainda traz algunsimplementações prontas para busca, ordenação, entreoutras operações que podem ser realizadas comcoleções.

    Porém para ordenarmos objetos do tipoFuncionario   por ordem alfabética, precisamos primeirodefinir o critério de busca, pois o compilado nãoconhece esse tipo de objeto.

    Precisamos que a classe Funcionario  

    implemente a classe Comparable , e sobrescreva ométodo compareTo   esse método retorna um inteiroque funciona da seguinte maneira:

    •  Negativo se o objeto comparado for MENOR •