Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas

JAVA Starter, Notas de estudo de Análise de Sistemas de Engenharia

Curso de JAVA básico para principiantes.

Tipologia: Notas de estudo

2010

Compartilhado em 08/05/2010

raphael-silva-souza-6
raphael-silva-souza-6 🇧🇷

3 documentos

1 / 190

Documentos relacionados


Pré-visualização parcial do texto

Baixe JAVA Starter e outras Notas de estudo em PDF para Análise de Sistemas de Engenharia, somente na Docsity! lavá Starter WAVAV:LZ LIFGOM www .t2ti.com Curso Java Starter Apresentação O Curso Java Starter foi projetado com o objetivo de ajudar àquelas pessoas que têm uma base de lógica de programação e desejam entrar no mercado de trabalho sabendo Java, A estrutura do curso é formada por módulos em PDF e por mini-cursos em vídeo. O aluno deve baixar esse material e estudá-lo. Deve realizar os exercícios propostos. Todas as dúvidas devem ser enviadas para a lista de discussão que está disponível para inscrição na página do Curso Java Starter no site www.t2ti.com. As dúvidas serão respondidas pelos instrutores Albert Eije, Cláudio de Barros e Miguel Kojiio, além dos demais participantes da lista. Nosso objetivo é que após o estudo do Curso Java Starter o aluno não tenha dificuldades para acompanhar um curso avançado onde poderá aprender a desenvolver aplicativos para Web, utilizando tecnologias como Servlets e JSP e frameworks como Struts e JSF, além do desenvolvimento para dispositivos móveis. Albert Eije trabalha com informática desde 1993. Durante esse período já trabalhou com várias linguagens de programação: Clipper, PHP, Delphi, C, Java, etc. Atualmente mantém o site www.alberteije.com. Cláudio de Barros é Tecnólogo em Processamento de Dados. Miguel Kojiio é bacharel em Sistemas de Informação, profissional certificado Java (SCJP 1.5). O curso Java Starter surgiu da idéia dos três amigos que trabalham juntos em uma instituição financeira de grande porte. www.t2ti.com 2 Curso Java Starter memória é do Coletor de lixo (Garbage Collector), desta forma, programadores Java ficam livres da preocupação de alocação e desalocação da memória. O Coletor de lixo é um processo que roda em segundo plano e é responsável pela liberação de memória alocada por variáveis que não mais serão utilizadas pela aplicação. Fases de um programa Java As fases pelo qual passam um programa Java relacionam-se da seguinte forma: 1. Criação do código fonte (Programa.java); 2. Compilação do código fonte e geração do bytecode (Programa.class); 3. Interpretação do bytecode pela máquina virtual; 4. Conversão do bytecode em linguagem de máquina. Hotspot Hotspot é a máquina virtual Java, ela provê algumas funcionalidades muito importantes. Ao contrário de outras aplicações, que são compiladas diretamente para código da máquina em que serão executadas, em Java estas somente são transformadas em código de máquina em tempo de execução quando necessário. No princípio esta abordagem trouxe problemas de sobrecarga e lentidão dos sistemas, no entanto, a JVM vem se aprimorando e, em muitas situações, as aplicações Java tem desempenho similar as aplicações que são previamente compiladas. Este desempenho vem melhorando muito devido a otimização que a máquina virtual consegue fazer a medida que o código é executado. Perceba que quando programamos em C, por exemplo, o código fonte é transformado em código de máquina imediatamente. www.t2ti.com 5 Curso Java Starter Em princípio podemos pensar que o fato do programa não precisar passar por uma etapa a mais, interpretação, irá torná-lo mais eficiente, mas muitas vezes a compilação estática não consegue prever situações que irão ocorrer durante a execução do código: trechos da aplicação mais utilizados, carga do sistema, quantidade de usuários simultâneos, memória disponível e etc.. Estas informações, relativas ao ambiente no qual a aplicação está sendo executada, são utilizadas pela JVM para fazer otimizações em tempo de execução e havendo necessidade o código que está sendo interpretado é transformado em instruções nativas do sistema operacional (código de máquina) em um processo de compilação dinâmica. Esta transformação em tempo de execução é realizada pelo JIT, Just-in-time compiler. O fato do código (bytecode) ser transformado, em tempo de execução, em código de máquina permite que a JVM mude a estratégia de compilação em busca de um melhor desempenho, em um ciclo de “aprendizado” contínuo. JRE e JDK  JRE: O Java Runtime Environment contém tudo aquilo que um usuário comum precisa para executar uma aplicação Java (JVM e bibliotecas), como o próprio nome diz é o “Ambiente de execução Java”;  JDK: O Java Development Kit é composto pelo JRE e um conjunto de ferramentas úteis ao desenvolvedor Java. Versões do Java: Abaixo temos uma síntese das versões do Java e as principais alterações nas nomenclaturas e no seu conteúdo. 1. JDK 1.0 (1996): Primeira versão; 2. JDK 1.1 (1997): Adição das bibliotecas JDBC, RMI e etc; 3. J2SE 1.2 (1998) – Playground: A partir daqui todas as versões Java foram denominadas de Java 2 Standard Edition, passaram a ter apelidos (Playground) e foi adicionado o Framework Collections e etc.; 4. J2SE 1.3 (2000) – Kestrel: Inclusão das bibliotecas JNDI, JavaSound e etc.; www.t2ti.com 6 Curso Java Starter 5. J2SE 1.4 (2002) – Merlin: Palavra reservada “assert”, biblioteca NIO e etc.; 6. J2SE 5.0 (2004) – Tiger: Apesar da versão ser 1.5, agora é chamada apenas de 5. Adições importantes como: Enumeração, Autoboxing, Generics, for-each e etc; 7. JSE 6 (2006) – Mustang: Entre outras alterações houveram mudança na nomenclatura (remoção do 2 – J2SE) e melhora significativa na performance. Ferramentas do JDK A seguir temos uma breve descrição das principais ferramentas que fazem parte do JDK:  javac: Compilador da linguagem Java;  java: Interpretador Java;  jdb: Debugador Java;  java -prof: Interpretador com opção para gerar estatísticas sobre o uso dos métodos;  javadoc: Gerador de documentação;  jar: Ferramenta que comprime, lista e expande;  appletviewer: Permite a execução e debug de applets sem browser;  javap: Permite ler a interface pública das classes;  extcheck: Detecta conflitos em arquivos Jar. Primeiro contato com o Java - Definições  Classe: É a estrutura que, quando construída, produzirá um objeto, dizemos “todo objeto é instância de alguma classe”;  Objeto: Em tempo de execução, quando a JVM encontra a palavra reservada new é criada uma instância da classe apropriada;  Estado: É definido pelo conjunto de atributos de uma classe, isto é, cada instância da classe possuirá um estado independente dos demais objetos.  Comportamento: São os métodos da classe, comportamento é aquilo que uma classe faz (algoritmos), muitas vezes, um determinado comportamento (método) muda o estado do objeto, isto é, após a execução do método um ou mais atributos mudaram de valor; www.t2ti.com 7 Curso Java Starter  PATH: Identifica o local onde encontram-se as ferramentas de desenvolvimento (compilador, interpretador, gerador de documentação e etc.), devemos adicionar o diretório JAVA_HOME\bin;  CLASSPATH: Identifica diretório onde o ClassLoader pode encontrar classes que são utilizadas pela sua aplicação. Windows Faça o download do JDK no site da SUN e execute o instalador. *Muitos estudantes têm tido dificuldade para escolher o instalador. O instalador correto sempre conterá o termo JDK no seu nome, se contiver o termo JRE é o incorreto. www.t2ti.com 10 Curso Java Starter Este diretório será utilizado na configuração do ambiente. A seguir clique em Next> até que a instalação seja iniciada. www.t2ti.com 11 Curso Java Starter Neste momento inicia-se a instalação do JRE, continue clicando em Next>. Nesta tela selecione todos os navegadores disponíves. www.t2ti.com 12 Curso Java Starter No prompt do MS-DOS vamos testar o interpretador, digite java -version, deverá aparecer algo parecido com isto: Agora vamos testar o compilador, digite javac -version, deverá aparecer algo parecido com isto: Nos dois casos se apareceram textos semelhantes aos apresentados www.t2ti.com 15 Curso Java Starter significa que a instalação foi bem sucedida. Primeira aplicação Java Vamos criar a nossa primeira aplicação Java utilizando o editor do MS-DOS, para isto dirija-se ao prompt e digite edit Teste.java. Dentro do editor digite o texto conforme abaixo: www.t2ti.com 16 Curso Java Starter Saia do editor pressionando ALT + F e X, se a versão do MS-DOS for em português a combinação de teclas será diferente (provavelmente ALT + A e R), ao sair, o editor perguntará se você deseja salvar. Escolha a opção afirmativa. Retorne ao console e digite: javac Teste.java. Este comando irá compilar a nossa classe e gerar o bytecode (Teste.class). Após a geração do arquivo compilado (.class) digite: java Teste. Este comando invoca o interpretador que irá transformar o nosso bytecode em código de máquina. Pronto, temos nossa primeira aplicação Java sendo executada1. Agora vamos entender um pouco de cada trecho do código digitado. 1. public class Teste 2. { 3. public static void main(String[] parametros) 4. { 5. System.out.println("Curso Java Iniciante!!"); 6. } 7. } Linha: 1. Declaração da classe pública de nome Teste; 2. Início do corpo da classe; 3. Declaração do método main (público, estático, sem retorno e parametrizado); 1 A instalação do JDK e a criação da aplicação são demonstradas no mini-curso “Instalação do JDK” www.t2ti.com 17 Curso Java Starter Módulo 02 Tipos Primitivos, Operadores e Controle de Fluxo Introdução Se você está achando essa parte do curso muito teórica, não se preocupe com isso. Você vai usar quase tudo que está sendo visto aqui quando for criar uma aplicação Java, seja ela desktop, para web ou mobile. Assista aos mini-cursos NetBeans e Eclipe para observar como instalar e utilizar essas IDEs. Você pode escolher qualquer umas das duas para desenvolver os seus projetos Java. Tipos de Dados Observe a tabela a seguir, sobre os tipos de dados. Esses tipos são conhecidos como Tipos de Dados Primitivos. Como podemos observar a linguagem Java oferece diversos tipos de dados com os quais podemos trabalhar. Há basicamente duas categorias em que se encaixam os tipos de dados: tipos primitivos e tipos de referências. Os tipos primitivos correspondem a dados mais simples ou escalares, enquanto os tipos de referências consistem em arrays, classes e interfaces. Estes serão vistos nos módulos subseqüentes. Vamos a uma descrição curta sobre cada um dos tipos: Tipo Descrição boolean Pode ser contido em 1 bit, porém o seu tamanho não é precisamente definido. Assume os valores true ou false. char Caractere em notação Unicode de 16 bits. Serve para armazenar dados alfanuméricos. Também pode ser usado como um dado inteiro com valores na faixa entre 0 e 65535. byte Inteiro de 8 bits em notação de complemento de dois. Pode assumir valores entre -27=-128 e 27-1=127. short Inteiro de 16 bits em notação de complemento de dois. Os valores possíveis www.t2ti.com 3 Curso Java Starter cobrem a faixa de -2-15=-32.768 a 215-1=32.767 int Inteiro de 32 bits em notação de complemento de dois. Pode assumir valores entre -231=2.147.483.648 e 231-1=2.147.483.647. long Inteiro de 64 bits em notação de complemento de dois. Pode assumir valores entre -263 e 263-1. float Representa números em notação de ponto flutuante normalizada em precisão simples de 32 bits em conformidade com a norma IEEE 754-1985. O menor valor positivo representável por esse tipo é 1.40239846e-46 e o maior é 3.40282347e+38. 4 bytes de tamanho e 23 dígitos binários de precisão. double Representa números em notação de ponto flutuante normalizada em precisão dupla de 64 bits em conformidade com a norma IEEE 754-1985. O menor valor positivo representável é 4.94065645841246544e-324 e o maior é 1.7976931348623157e+308. 8 bytes de tamanho e 52 dígitos binários de precisão. Para entendermos o comportamento dos tipos acima vamos analisá-los em um programa. Observe atentamente o programa abaixo. Não passe adiante sem compreender cada linha desse programa. Ele está todo comentado. Essa classe está em anexo para que você a abra e teste sua execução no Netbeans ou no Eclipse. public class TiposPrimitivos { public static void main(String[] args) { /* Declaramos 8 variáveis. Exatamente o mesmo número dos tipos primitivos do Java. Cada variável é de um dos tipos. */ boolean bo; char c; byte b; short s; int i; long l; float f; double d; /* Atribuímos o valor 65 à variável c, que é do tipo char. OBS Importante: O tipo char também é um inteiro! No entanto é um inteiro que faz referência a tabela Unicode, que contém 65535 simbolos. */ c = 65; System.out.println("============================="); System.out.println("char"); /* www.t2ti.com 4 Curso Java Starter Note a diferença entre a impressão das duas linhas abaixo: */ System.out.println("============================="); System.out.println("valor de c como char = " + c); System.out.printf("valor de c como numero = %d \n",(int)c); System.out.println("-----------------------------"); /* Saída da impressão: ============================= char ============================= valor de c como char = A valor de c como numero = 65 ----------------------------- Interessante notar que além do println você também pode usar o printf que aprendemos lá no C. Vale aqui tudo que aprendemos no Módulo 1 em relação à função printf. */ /* Agora vamos trabalhar com os outros tipos inteiros: byte, short e int. Veja que estamos trabalhando com o valor 10 e que atribuímos esse valor à variável b, que é do tipo byte. Como esse valor "cabe" em um short e em um int não há problema nenhum quando atribuímos o valor de b à variável s (short) e o valor de s à variável i (int) */ b = 10; s = b; i = s; System.out.println("============================="); System.out.println("inteiros"); System.out.println("============================="); System.out.println("i = s = b = "+i); /* Saída da impressão: ============================= inteiros ============================= i = s = b = 10 */ /* Agora multiplicamos i por 100 e atribuimos o total dessa multiplicação ao próprio i. */ i *= 100; System.out.println("novo valor de i = "+i); www.t2ti.com 5 Curso Java Starter ============================= valor de d = 125.32 valor de d = 125.32 valor de d = 125.31999969482422 */ f = (float)125.32; System.out.println("valor de f = " + d); f = 125.32f; System.out.println("valor de f = " + d); f = (float)125.32d; System.out.println("valor de f = " + d); System.out.println("-----------------------------"); /* Mesma coisa que foi feita com o Double, mas dessa vez com o float. Logo no primeiro caso já é necessário fazer um casting. Lembre-se: o tipo padrão de um número literal em ponto flutuante é double. No segundo caso nada é preciso. No terceiro caso novamente a presença no casting já que estamos informando explicitamente que o literal é do tipo double. É bom lembrar que ao converter de double para float pode haver perda de bits. Pergunta: por que todos os valores saíram tão quebrados, em contraste com o double? Investigue e comente na lista. Saída da impressão: valor de f = 125.31999969482422 valor de f = 125.31999969482422 valor de f = 125.31999969482422 ----------------------------- */ /* Abordaremos agora o tipo booleano. */ System.out.println("============================="); System.out.println("booleano"); System.out.println("============================="); bo = true; System.out.println("valor de bo = " + bo); bo = (1 > 2); System.out.println("valor de bo = " + bo); bo = (f == d); System.out.println("valor de bo = " + bo); System.out.println("-----------------------------"); /* www.t2ti.com 8 Curso Java Starter O valor true ou false pode ser atribuido sem problemas. Se atribuirmos uma operação à variável. Essa operação será avaliada e seu valor será armazenado na variável. No caso de (1>2) sabemos que o resultado será false. Depois testamos se f é igual a d. Observe que o operador de teste de igualdade é o == (igual duas vezes), semelhante à linguagem C. Falaremos sobre operadores mais a frente. Saída da impressão: ============================= booleano ============================= valor de bo = true valor de bo = false valor de bo = true ----------------------------- */ System.out.println("============================="); System.out.println("brincando com os tipos"); System.out.println("============================="); System.out.println("posso converter int para float?"); System.out.println("i antes da conversao = " + i); System.out.println("f antes da conversao = " + f); f = i; System.out.println("i depois da conversao = " + i); System.out.println("f depois da conversao = " + f); System.out.println("--"); /* Em nossa primeira "brincadeira" com os tipos tentamos converter de int para float. Observe atentamente o resultado na saída de impressão. Saída de impressão: ============================= brincando com os tipos ============================= posso converter int para float? i antes da conversao = 1000 f antes da conversao = 125.32 i depois da conversao = 1000 f depois da conversao = 1000.0 -- */ f = (float)d; System.out.println("posso converter float para int?"); System.out.println("i antes da conversao = " + i); System.out.println("f antes da conversao = " + f); i = (int)f; System.out.println("i depois da conversao = " + i); System.out.println("f depois da conversao = " + f); System.out.println("-----------------------------"); www.t2ti.com 9 Curso Java Starter /* Depois de nossa primeira "brincadeira" o valor de f ficou igual ao valor de i. Por isso atribuímos o valor de d novamente à variável f. Agora o que queremos saber é se é possível atribuir o valor de um float a um inteiro. O contrário foi possível sem casting. Mas dessa vez o casting será necessário. Mas, além desse detalhe, outra coisa vai ocorrer. Pode ser desejável ou não. Comente na lista o que ocorreu nessa conversão de float para int e em que situação isso seria desejavel. Saída de impressão: posso converter float para int? i antes da conversao = 1000 f antes da conversao = 125.32 i depois da conversao = 125 f depois da conversao = 125.32 ----------------------------- */ } } Pelo que podemos observar no programa anterior, as conversões em Java ocorrem da seguinte maneira, sem perda de informação: ● Um byte pode ser convertido em um short, int, long, float ou double ● Um short pode ser convertido em um int, long, float ou double ● Um char pode ser convertido em um int, long, float ou double ● Um int pode ser convertido em um long, float ou double ● Um long pode ser convertido em um float ou double ● Um float pode ser convertido em um double Obseve a imagem seguir: www.t2ti.com 10 Curso Java Starter condicional == 8 E primitivo,primitivo igualdade de valores condicional != primitivo,primitivo diferença de valores condicional == referência, referência igualdade, endereço dos objetos condicional != referência, referência diferença, endereço de objetos binário & 9 E inteiro, inteiro E sobre bits lógico & booleana, booleana E booleano binário ^ 10 E inteiro, inteiro XOR sobre bits Grupo Operador Precedência A Operando Descrição lógico ^ booleana, booleana XOR (OU exclusivo) booleano binário | 11 E inteiro, inteiro OU sobre bits lógico | booleana, booleana OU booleano lógico && 12 E booleana, booleana E condicional lógico || 13 E booleana, booleana OU condicional condicional ?: 14 D booleana, qualquer operador ternário, condicional atribuição = 15 D variável, qualquer atribuição *= /= %= variável, qualquer atribuição com operação += -= <<= >>= >>>= &= ^= |= Em se tratando de precedência é bom lembrar que os parênteses podem ser usados para modificá-la. 2 + 6 * 5 = 32 (2 + 6) * 5 = 40 Controle de Fluxo O controle de fluxo é efetuado através do uso de condicionais, que são www.t2ti.com 13 Curso Java Starter estruturas que modificam o fluxo de execução normal do programa. if-else Sintaxe: if (expressão booleana) instrução_simples; if (expressão booleana) { instruções } if (expressão booleana) { instruções } else if (expressão booleana) { instruções } else { instruções } Quando existe apenas uma instrução após o if não precisamos abrir um bloco com as chaves. Se existirem mais instruções a abertura do bloco é necessária. Se houver mais de uma condição usa-se o else como podemos observar na segunda coluna acima. Veja o exemplo abaixo e comente o mesmo na lista de discussão. if ( ano < 0) { System.out.println("Não é um ano!"); } else if ( (ano%4==0 && ano%100!=0) || (ano%400==0) ) { System.out.println("É bissexto!"); } else { System.out.println("Não é bissexto!"); } while e do-while Sintaxe: while (expresão booleana) { instruções; } do { instruções; } while (expresão booleana ); No caso do while as instruções serão executadas enquanto a expressão booleana for verdadeira. O do-while executa a instrução pelo menos uma vez e continua executando enquanto a expressão booleana for verdadeira. Observe os exemplos seguintes. www.t2ti.com 14 Curso Java Starter //exemplo com while int x = 0; while (x < 10) { System.out.println ("item " + x); x++; } //exemplo com do-while int x = 0; do { System.out.println ("item " + x); x++; } while (x < 10); //esse é um laço infinito. Pra que ele serve? while ( true ) { if (obj.z == 0) { break; } } for Sintaxe: for ( inicialização; expressões booleanas; passo da repetição ) instrução_simples; for ( inicialização; expressões booleanas; passo da repetição ) { instruções; } O for pode conter apenas uma instrução no seu corpo. Neste caso não é necessário abrir um bloco. Isso é assim porque o for já implementa alguns comandos na sua assinatura, ou seja, no seu cabeçalho, como a inicialização da variável e o passo da repetição, ou seja, o incremento/decremento da variável. Veja os exemplos: //esse tá bem fácil. for ( int x = 0; x < 10; x++ ) { System.out.println ("item " + x); } //esse já não é tão simples só de olhar. for ( int x = 0, int y = 25; x < 10 && (y % 2 == 0); x++, y = y - 1 ) { System.out.println (x + y); } //também podemos fazer um laço infinito com o for for ( ; ; ) { if (obj.z == 0) { break; } } www.t2ti.com 15 Curso Java Starter Tente utilizar algumas dessas palavras como nome de variáveis e veja como o compilador Java se comporta. Você deve ter percebido que não utilizamos um tipo String neste módulo. O Java possui um tipo String, no entanto, String no Java não é um tipo primitivo. Falaremos sobre String em um módulo posterior. Entrada de Dados Como eu faço para ler algo que o usuário digita no prompt? Observe o programa abaixo: //importe a classe Scanner para utilizar a leitura pelo teclado //Similar ao #include do C import java.util.Scanner; public class Leitura { public static void main(String[] args) { // crie a variável de leitura dos dados Scanner s = new Scanner(System.in); // use os métodos de leitura específicos do tipo desejado System.out.print("digite uma linha: "); String linha = s.nextLine(); // le a linha System.out.print("digite um numero: "); int i = s.nextInt(); // le um inteiro System.out.print("digite um numero: "); double d = s.nextDouble(); // le um ponto-flutuante } } Com o estudo do programa acima já dá para você solicitar que o usuário digite alguma coisa e utilizar o que o mesmo está digitando. www.t2ti.com 18 Curso Java Starter Vamos aos tão aguardados exercícios. Exercícios Aprenda com quem também está aprendendo, veja e compartilhe as suas respostas no nosso Fórum: Exercícios – Módulo 02 – Tipos Primitivos, Operadores e Controle de Fluxo 01 - Escreva um programa que imprima o resultado das expressões abaixo: • 3 – 2 – 1 + 2 + 1 + 3 • 2 x 3 – 4 x 5 • 2 + 6 – 3 / 7 x 9 • 3 % 4 –8 02 - Escreva um programa que declare, inicialize e imprima as seguintes variáveis: • Inteiro i de 32 bits com valor 1 • Inteiro j de 64 bits com valor 2 • Ponto-flutuante p de 32 bits com valor 20.0 • Ponto-flutuante q de 64 bits com valor 30.0 • Boolean b com valor verdadeiro • Caracter c com valor ‘k’ 03 - Implemente um programa que recebe um número de 1 a 7 e imprime o dia da semana correspondente. 04 - Altere o programa do exercício anterior para ficar recebendo o número dentro de um laço enquanto o número for diferente de 0 (zero). 05 - Implemente um programa que recebe repetidamente um número de 1 a 12, enquanto esse número for diferente de 0 (zero), e imprime o mês correspondente. Quando o número estiver fora do intervalo permitido, a mensagem “mês inválido” deverá ser exibida. 06 - Escreva um laço while que execute 20 vezes, imprimindo o valor da variável x que inicialmente está com valor 10. Converta este laço para um do-while. 07 - Escreva um programa que imprima na tela a soma dos números ímpares entre 1 e 30 e a multiplicação dos números pares entre 1 e 30. 08 - Escreva um programa que percorra dois laços de 0 a 10, um interno ao outro, imprimindo os contadores, e quando estes forem iguais, o programa deve passar à próxima interação do laço mais externo, caso contrário, deve imprimir os valores dos contadores dos dois laços. 09 - Desenvolva um programa que solicita ao usuário um número inteiro de no máximo 4 dígitos. Inverta esse número. 10 – Desenvolva um programa que dado um número inteiro o programa informe se o mesmo é um número primo. www.t2ti.com 19 Curso Java Starter 11 - Escreva um programa em Java que calcula e imprime na tela o salário proporcional de um funcionário que trabalhou apenas N dias num mês de 22 dias úteis. O número de dias trabalhados bem como o salário integral do funcionário devem ser lidos do teclado. O resultado deve ser um número ponto-flutuante. 12 - Escreva um programa em Java que leia repetidamente um número do teclado até que seja digitado o número zero (0) e determine se o número lido é perfeito ou não, imprimindo o resultado. Um número é dito perfeito quando é igual a soma dos seus divisores menores do que ele, por exemplo, 6 é perfeito, uma vez que 6 = 3 + 2 + 1. 13 – Faça um programa que contenha um menu com 4 opções: 1 – calcular o fatorial de um número dado 2 – calcular a raiz quadrada de 3 números dados 3 – imprimir a tabuada completa de 1 a 10 4 – sair do programa 14 - Escreva quatro instruções em Java diferentes para adicionar 1 a uma variável inteira x. 15 - Escreva instruções Java para realizar a seguinte tarefa: atribuir soma de x e y a z e incrementar x por 1 depois do calculo. Use somente uma instrução; 16 - Escreva instruções Java para realizar a seguinte tarefa: decrementar a variável x por 1, depois subtrair o resultado da variável total com somente uma instrução. 17 - Implemente um programa para calcular a área de um trapézio, onde: h = altura b = base menor B = base maior Área = (h.(b+B))/2 18 - Fulano aplicou R$ 100,00 com rendimento de 5% ao mês. Quantos meses serão necessários para o capital investido ultrapasse a R$ 200,00. Desenvolva um programa que realize essa operação. 19 – Faça um programa que imprima os quadrados dos números inteiros ímpares entre 15 e 35. www.t2ti.com 20 Curso Java Starter Cada uma das estruturas de dados apresentadas possui características que as diferenciam quanto a: ● Eficiência de busca; ● Eficiência de inserção; ● Organização; ● Ordenação; ● Forma de acesso; ● Forma de busca e; ● Forma de inserção. Arrays unidimensionais: A forma mais eficiente de trabalhar com coleções de elementos em Java é através da construção de vetores (arrays). Em Java, arrays são objetos que armazenam múltiplas variáveis do mesmo tipo ou do mesmo sub-tipo (sub-tipo? Não se preocupe por enquanto com isto). Observe que apesar da sua eficiência, normalmente, para armazenar dados nós utilizamos estruturas de dados mais flexíveis já existentes na linguagem, mais especificamente, no Framework Collections (assunto a ser abordado em mais detalhes durante este curso) ao invés de arrays. Um array é um objeto que armazena um número pré-definido de elementos, isto é, o seu tamanho é definido no momento da sua construção. Seus elementos são acessados através de índices que iniciam-se sempre por 0 (zero), ou seja, um array de tamanho quatro terá índices 0, 1, 2 e 3. Em Java existem diversas formas de declarar, construir e inicializar arrays e a melhor forma de utilizar estas estruturas de dados é conhecendo como são realizadas cada uma destas etapas. A seguir apresentaremos cada uma destas etapas e a forma como elas acontecem na prática: 1. Declaração: Etapa em que a referência do array é declarada; 2. Construção: Aqui é definido o tamanho e instanciado o array; 3. Inicialização: Os elementos são inseridos no array. www.t2ti.com 4 Curso Java Starter Abaixo temos um exemplo com todas as etapas bem definidas: 1. int[] jogoSena; //Declaração 2. 3. jogoSena = new int[6]; //Criação 4. 5. jogoSena[0] = 23; //Inicialização da posição 0 6. jogoSena[1] = 12; //Inicialização da posição 1 7. jogoSena[2] = 55; //Inicialização da posição 2 8. jogoSena[3] = 02; //Inicialização da posição 3 9. jogoSena[4] = 07; //Inicialização da posição 4 10.jogoSena[5] = 19; //Inicialização da posição 5 Neste caso estamos criando um vetor de inteiros (int), perceba que a declaração da variável ocorre na linha 1, na seqüencia temos a criação do vetor (linha 3) e por último a inicialização de cada uma das suas posições. Existem formas mais enxutas de efetuarmos as mesmas etapas mostradas no exemplo anterior. Podemos declarar, construir e inicializar em apenas uma linha da seguinte forma: int[] outroJogoSena = {23, 12, 55, 02, 07, 19}; No exemplo acima, acontecem quatro coisas em apenas uma linha: I. Declaração de uma referência a um array de inteiros chamado outroJogoSena; II. Criação de um array com seis posições; III.Inicialização das posições com os valores 23, 12, 55, 02, 07 e 19; IV. Atribuição do novo objeto (array) a referência outroJogoSena; O outro atalho que a linguagem Java nos permite é o seguinte: int[] outroJogoSena = new int[]{23, 12, 55, 02, 07, 19}; Em ambos os casos todas as etapas continuam sendo executadas (declaração, construção e inicialização). Certo, mas qual é o tamanho destes arrays? Quando criamos arrays desta maneira a quantidade máxima de elementos que o array irá armazenar será igual a quantidade de elementos com que ele foi inicializado, isto é, em ambos os casos os arrays seriam suficientes para armazenar até 6 elementos. Caso haja necessidade de www.t2ti.com 5 Curso Java Starter mais espaço um novo array deve ser construído. Para conhecer o tamanho total de um array basta você acessar o atributo length. Este atributo retorna um valor inteiro (int) que indica qual a capacidade máxima de armazenamento deste array. Lembretes: ✔ Primeira posição (índice): de qualquer array é sempre 0; ✔ Última posição (índice): é sempre o seu tamanho – 1 (length - 1). Exercício Resolvido Implemente a lógica para realização de saques em um caixa eletrônico considerando que o mesmo armazena cédulas de R$100,00, R$50,00, R$20,00, R $10,00, R$5,00, R$2,00 e R$1,00 e devem ser entregues ao cliente o menor número possível de cédulas. public class CaixaEletronico { public static void main(String[] args) { //Cedulas disponiveis no caixa eletronico int[] cedulas = {100, 50, 20, 10, 5, 2, 1}; //Quantidade total de cedulas entregues ao cliente int quantidadeTotal = 0; //valor a ser sacado pelo cliente int valorReais = 163; //Percorrendo todas as cedulas disponiveis no caixa eletronico for(int i = 0; i < cedulas.length; i++) { //Quantidade de cedulas para o valor cedulas[i] int quantidadeCedulas = valorReais/cedulas[i]; //Impressao da quantidade de cedulas System.out.println("Quantidadde de cedulas de "+ cedulas[i] + ": " +quantidadeCedulas ); //Resto da divisao valorReais %= cedulas[i]; //Quantidade total de cedulas entregues ao cliente quantidadeTotal += quantidadeCedulas; } //Impressao System.out.println("Quantidade total: "+quantidadeTotal); } } Resultado obtido durante a execução deste código: Quantidadde de cedulas de 100: 1 Quantidadde de cedulas de 50: 1 Quantidadde de cedulas de 20: 0 Quantidadde de cedulas de 10: 1 Quantidadde de cedulas de 5: 0 Quantidadde de cedulas de 2: 1 Quantidadde de cedulas de 1: 1 Quantidade total: 5 www.t2ti.com 6 Curso Java Starter Resolução: 1. A matriz será de double; 2. A classe deverá manipular um array bidimensional; 3. O valor de cada célula corresponderá ao valor dos respectivos índices multiplicados. public class Matriz { public static void main(String[] args) { double matriz[][] = new double[4][4];//declaracao e construcao da matriz for(int i = 0; i < matriz.length; i++)//percorre a matriz no eixo i { for(int j = 0; j < matriz[i].length; j++)//percorre a matriz no eixo j { matriz[i][j] = i*j;//atribui o valor a celula } } for(int i = 0; i < matriz.length; i++) //percorre a matriz no eixo i { for(int j = 0; j < matriz[i].length; j++) //percorre a matriz no eixo j { //imprime o resultado System.out.println("Valor da posição ["+i+","+j+"]: "+ matriz[i][j]); } } } } Saída console: Valor da posição [0,0]: 0.0 Valor da posição [0,1]: 0.0 Valor da posição [0,2]: 0.0 Valor da posição [0,3]: 0.0 Valor da posição [1,0]: 0.0 Valor da posição [1,1]: 1.0 Valor da posição [1,2]: 2.0 Valor da posição [1,3]: 3.0 Valor da posição [2,0]: 0.0 Valor da posição [2,1]: 2.0 Valor da posição [2,2]: 4.0 Valor da posição [2,3]: 6.0 Valor da posição [3,0]: 0.0 Valor da posição [3,1]: 3.0 Valor da posição [3,2]: 6.0 Valor da posição [3,3]: 9.0 Manipulando vetores utilizando a classe Arrays A classe Arrays, disponível no pacote java.util, fornece uma grande www.t2ti.com 9 Curso Java Starter quantidade de métodos utilitários, como por exemplo métodos para ordenação, procura, comparação e etc.. Estes métodos são muito úteis quando manipulamos arrays. A seguir serão apresentados os principais métodos e a as respectivas funcionalidades oferecidas. ● Ordenação: Realizada utilizando-se o método “sort” cujo parâmetro é o vetor a ser ordenado; ● Pesquisa: A localização de um determinado elemento em um array é realizada utilizando-se o método “binarySearch” que retorna a posição que o elemento foi encontrado no array. Caso o elemento não seja encontrado retorna um valor negativo; ● Preenchimento: Utilizando-se o método “fill” da classe utilitária Arrays é possível preencher um determinado array com o elemento desejado; ● Comparação: Dados dois arrays o método “equals” compara valor a valor e retorna true se os vetores são idênticos em valores e índices. Agora que conhecemos, superficialmente, a forma como a classe Arrays fornece métodos utilitários vamos ver na prática como algumas destas funcionalidades são utilizadas. Exercício Resolvido - Ordenação Implemente um programa que construa um array de inteiros (int) de tamanho 10.000 com valores atribuídos da seguinte forma, cada posição do array conterá o resultado da operação 10.000 – índice da posição, isto é, a posição 0 terá o valor 10.000, a posição 1 terá o valor 9.999 e assim por diante. Ordene utilizando o algoritmo de ordenação implementado no exercício resolvido pag. 6 e na seqüencia utilizando a classe utilitária Arrays. Compare os tempos de ordenação. import java.util.Arrays; public class OrdenacaoArray { public static void main(String[] args) { //Criacao do array de 10.000 posicoes int[] arrayInteiros = new int[10000]; //Atribuindo os valores a cada posicao for(int i = 10000; i > 0; i--) { arrayInteiros[arrayInteiros.length - i] = i; www.t2ti.com 10 Curso Java Starter } //inicio do algoritmo de ordenacao - implementado boolean estaOrdenado = false; //armazena o tempo de inicio da ordenacao long inicio = System.currentTimeMillis(); while(!estaOrdenado) { estaOrdenado = true; for(int i = 1; i < arrayInteiros.length; i++) { if(arrayInteiros[i-1] > arrayInteiros[i]) { estaOrdenado = false; int aux = arrayInteiros[i]; arrayInteiros[i] = arrayInteiros[i-1]; arrayInteiros[i-1] = aux; } } } //armazena o tempo fim da ordenacao long fim = System.currentTimeMillis(); //Imprime o tempo total de ordenacao System.out.println("Tempo ordenar 1: "+(fim-inicio)+" ms"); //Atribuindo os valores a cada posicao for(int i = 10000; i > 0; i--) { arrayInteiros[arrayInteiros.length - i] = i; } //armazena o tempo de inicio da ordenacao inicio = System.currentTimeMillis(); //Ordena utilizando a classe Arrays Arrays.sort(arrayInteiros); //armazena o tempo fim da ordenacao fim = System.currentTimeMillis(); //Imprime o tempo total de ordenacao System.out.println("Tempo ordenar 2: "+(fim-inicio)+" ms"); } } Resultado da execução: Tempo ordenar 1: 1013 ms Tempo ordenar 2: 9 ms O resultado desta execução mostra que o método de ordenação implementado pela classe Arrays foi, aproximadamente, 100 vezes mais eficiente que a implementação feita no exercício referenciado. Exercício Resolvido - Pesquisa Implemente um programa que construa um array de inteiros (int) de tamanho 1.000.000 com valores atribuídos de acordo com o seu índice, procure o valor 555.000, entre os valores armazenados no vetor. Compare o tempo gasto utilizando o método “binarySearch” da classe Arrays e uma procura simples percorrendo todos os elementos do array até encontrar o valor desejado. import java.util.Arrays; public class PesquisarArray { public static void main(String[] args) { //Criacao do array de 1.000.000 de posicoes int[] numerosInteiros = new int[1000000]; www.t2ti.com 11 Curso Java Starter public class mainParametros { public static void main(String[] parametros) { if(parametros != null) { System.out.println("Foram passados: "+parametros.length+" parametros"); for(int i = 0; i < parametros.length; i++) System.out.println("parametro "+i+": "+parametros[i]); } } } Abaixo temos a imagem com a execução deste programa, primeiro foram passados 6 parâmetros e na seqüencia nenhum. Agora nós já sabemos como enviar parâmetros através do prompt de duas formas, uma através do método main e outra, apresentada no Módulo 4, através do uso de um Scanner. Mas nós podemos fazer estas mesmas funções de forma um pouco mais elaborada utilizando interfaces gráficas. A próxima seção irá descrever como isto pode ser realizado. www.t2ti.com 14 Curso Java Starter Entrada de dados – interface gráfica Aqui nós iremos utilizar a biblioteca Swing que é responsável pela geração dos artefatos gráficos em Java mas nós não iremos nos aprofundar nesta biblioteca pois este assunto será abordado em um módulo dedicado apenas a isto. A entrada de dados utilizando prompt pode, dependendo da situação, deixar o seu programa menos “palatável” para usuários iniciantes. Para evitar esta situação podemos efetuar a entrada de dados utilizando a classe JOptionPane. A classe JOptionPane torna simples a implementação de diálogos que solicitam a entrada de dados ou mesmo apenas informam alguma coisa. Os principais métodos desta classe estão relacionados a seguir. Método Descrição showConfirmDialog Utilizado para confirmações, diálogos cuja resposta seja do tipo sim, não ou cancela. showInputDialog Utilizado para entrada de dados pelo usuário. showMessageDialog Informa ao usuário alguma coisa showOptionDialog Uma mistura dos três outros métodos, ou seja, pode ser utilizado para informar, para entrada de dados e ainda confirmações. Vamos ao exemplo prático para melhor compreensão, neste exemplo serão utilizados os métodos showInputDialog e showMessageDialog. //Importando classe do Swing import javax.swing.JOptionPane; public class Dialogo { public static void main(String[] args) { String nome; //Este comando mostra um dialogo que solicita entrada de dados nome = JOptionPane.showInputDialog("Digite o seu nome: "); String mensagem = nome+" está fazendo o curso Java Iniciante"; //Este comando mostra um dialogo que apenas exibe a mensagem JOptionPane.showMessageDialog(null, mensagem); } } A seguir temos as telas demonstrando a execução deste programa no prompt. www.t2ti.com 15 Curso Java Starter Entrada de dados no diálogo. Exibição da mensagem de conclusão do programa. www.t2ti.com 16 Curso Java Starter Módulo 04 Orientação a Objetos Classes, Objetos e Encapsulamento Introdução Apesar de não termos sido apresentados formalmente, já estamos utilizando orientação a objetos nos programas que fizemos até agora, pois algumas das classes e tipos que utilizamos são verdadeiramente objetos. É claro que não estamos fazendo isto da forma correta ou melhor forma. Mas porque “Programação Orientada a Objetos” ao invés da tradicional Programação Estruturada? Antes de conhecermos a resposta devemos compreender que em algum momento o código Orientado a Objetos utiliza-se do paradigma Estruturado, a grande diferença é a forma como a aplicação é idealizada. Um paradigma de programação, seja ele Estruturado ou Orientado a Objetos é a forma como a solução para um determinado problema é desenvolvida. Por exemplo, em Orientação a Objetos os problemas são resolvidos pensando-se em interações entre diferentes objetos, já no paradigma Estruturado procura-se resolver os problemas decompondo-os em funções e dados que somados formarão um programa. Retornando a nossa pergunta, durante muito tempo a programação Estruturada foi o paradigma mais difundido porém, a medida que os programas foram tornando-se mais complexos, surgiu a necessidade de resolver os problemas de uma maneira diferente. Neste contexto surge o paradigma da Programação Orientada a Objetos. Em Orientação a Objetos os dados e as operações que serão realizadas sobre estes formam um conjunto único (objeto), e a resolução de um problema é dada em termos de interações realizadas entre estes objetos. Dizemos que um objeto encapsula a lógica de negócios, concentrando a responsabilidade em pontos únicos do sistema, viabilizando um maior reuso do código pela modularidade desta abordagem. www.t2ti.com 3 Curso Java Starter Benefícios da abordagem orientada a objetos: ● Modularidade: Uma vez criado um objeto pode ser passado por todo o sistema; ● Encapsulamento: Detalhes de implementação ficam ocultos externamente ao objeto; ● Reuso: Uma vez criado um objeto pode ser utilizado em outros programas; ● Manutenibilidade: Manutenção é realizada em pontos específicos do seu programa (objetos). Classes e Objetos Objetos são “coisas” que temos no mundo real e abstraímos no mundo virtual para que possamos manipulá-los na resolução de problemas. Um objeto no mundo real sempre possui estado e comportamento, isto é, ele possui características e ações que são pertinentes a sua natureza. Para clarificar nada melhor do que alguns exemplos: Objeto Estado Comportamento Pessoa Nome, idade, RG Falar, andar, cumprimentar Cachorro Nome, raça Latir, correr Conta bancária Saldo, agência, número Creditar, debitar Carro Cor, marca, modelo Acelerar, frear, abastecer Observe que estado e comportamento, respectivamente, são transformados em dados e procedimentos quando programamos de forma estruturada e atributos e métodos quando utilizamos orientação a objetos. Alguém pode perguntar: Legal, mas eu sou uma pessoa e possuo mais atributos (estado) do que os que foram apresentados! Cadê o restante (peso, altura e etc.)? Certamente, todos os objetos apresentados possuem estado e comportamento muito mais complexos do que os apresentados, no entanto, iremos criar um modelo para apenas aquilo o que nos interessa, ou melhor, interessa a resolução do problema. Seu programa não deve ter nada mais do que o necessário, fuja dos “Sistemas www.t2ti.com 4 Curso Java Starter Mundo” - no meu trabalho utilizamos esta expressão para identificar sistemas cujo escopo não está bem definido (limitado) – que são intermináveis. Objetos são oriundos (instâncias) das classes. Uma classe é uma especificação para um determinado tipo de objeto, isto é, para que o objeto seja de determinada classe ele, obrigatoriamente, terá que respeitar a especificação. Por exemplo, vamos especificar que todo documento deve possuir, ao menos, foto, código, nome e data de nascimento. Agora vamos criar um documento para o Alfredo e um para a Juliana: Documento Documento 1 Documento 2 Foto: Img1.png Img4.png Código: 123456 789012 Nome: Alfredo Juliana Data de nascimento: 20/05/1990 30/09/1987 Perceba que, nesta tabela a coluna Documento define a classe (especificação) enqüanto as colunas Documento 1 e Documento 2 são os objetos desta forma, cada documento particular terá um valor diferente para os atributos definidos na especificação. A compreensão desta diferença, entre classes e objetos, é parte fundamental do paradigma orientado a objetos. Esta especificação em Java poderia ser da seguinte forma: class Documento { //Estado String foto; //Nome do arquivo de imagem String nome; //Nome da pessoa Integer codigo; //Codigo deste documento String dataNascimento; //Data de nascimento } Perceba que nós acabamos de definir um novo tipo, Documento, e especificamos que para um objeto ser deste tipo ele deve necessariamente ter os atributos foto, nome, código e data de nascimento. Agora vamos implementar um programa que crie o documento do Alfredo (Documento 1 - tabela): class Programa { public static void main(String[] args) { www.t2ti.com 5 Curso Java Starter (endereço) é o mesmo, logo o objeto que estas variáveis fazem referência também será o mesmo. Métodos Ok, dentro de um objeto temos seu “estado” definido pelo conjunto de atributos. Mas cadê o comportamento? As ações que são realizadas sobre os atributos são os métodos, o conjunto de métodos define o comportamento de um objeto. Imagine que agora o sistema a ser modelado é o de uma corrida de carros. O principal objeto de uma corrida de carros são os próprios carros – nenhuma novidade até aqui – para os quais nós devemos criar uma especificação (classe) para ser utilizada neste sistema imaginário. O nosso carro de corrida terá seu estado definido pelo conjunto de atributos número de identificação, velocidade atual e velocidade máxima. O comportamento será definido pelo conjunto de métodos acelerar, frear, ligar e desligar. Vamos criar a nossa classe apenas com a definição do estado, inicialmente: class CarroCorrida { //Estado Integer numeroIdentificacao; Double velocidadeAtual; Double velocidadeMaxima; //Comportamento... } Pronto! Agora temos o nosso carro de corrida que não faz nada por enqüanto. Vamos adicionar os primeiros comportamentos, ligar e desligar. Estas ações (ligar e desligar) não retornam nenhum tipo de informação, o carro apenas emite um som, sendo assim, estes comportamentos podem ser implementados da seguinte forma: void ligar() { System.out.println("VRUUUMmmmmmmmmm"); } void desligar() { System.out.println("MMMmmmm......"); } Observe que os dois métodos não retornam nenhuma informação para quem os aciona (invoca) isto é informado através da palavra reservada void. www.t2ti.com 8 Curso Java Starter Agora vamos implementar o método acelerar: void acelerar() { velocidadeAtual += 10; if(velocidadeAtual > velocidadeMaxima) { velocidadeAtual = velocidadeMaxima; } } Em acelerar() nós temos a primeira regra de negócio, cada acionamento deste comportamento adiciona 10 unidades de velocidade a nossa velocidade atual até o máximo permitido (atributo velocidade máxima), se a velocidade atual após a aceleração extrapolar o valor da velocidade máxima do carro então a velocidade atual será igual a velocidade máxima. Vamos implementar o método frear: void frear(Integer intensidadeFreada) { if(intensidadeFreada > 100) { intensidadeFreada = 100; }else if(intensidadeFreada < 0) { intensidadeFreada = 0; } velocidadeAtual -= intensidadeFreada*0.25; if(velocidadeAtual < 0) { velocidadeAtual = 0.0; } } O método frear recebe um parâmetro que significa a intensidade com que o pedal de freio foi acionado. Esta intensidade pode ser um valor entre 0 e 100, a velocidade após a freada é o resultado da intensidade da freada multiplicada pelo fator 0.25 tudo isto diminuído da velocidade atual, caso o resultado desta operação seja menor do que 0 (zero) então o valor final será zero. A nossa classe após a adição destes comportamento ficou da seguinte forma: class CarroCorrida { //Estado Integer numeroIdentificacao; Double velocidadeAtual; Double velocidadeMaxima; //Comportamento... void ligar() www.t2ti.com 9 Curso Java Starter { System.out.println("VRUUUMmmmmmmmmm"); } void desligar() { System.out.println("MMMmmmm......"); } void acelerar() { velocidadeAtual += 10; if(velocidadeAtual > velocidadeMaxima) { velocidadeAtual = velocidadeMaxima; } } void frear(Integer intensidadeFreada) { if(intensidadeFreada > 100) { intensidadeFreada = 100; }else if(intensidadeFreada < 0) { intensidadeFreada = 0; } velocidadeAtual -= intensidadeFreada*0.25; if(velocidadeAtual < 0) { velocidadeAtual = 0.0; } } } Podemos melhorar um pouco mais a nossa classe atribuindo valores default para alguns atributos. Por exemplo, nós sabemos que a velocidade inicial de qualquer veículo é zero, sendo assim vamos definir o nosso atributo velocidadeAtual inicialmente como zero e ao mesmo tempo vamos definir que a velocidade máxima destes carros será, inicialmente, 100. Para isto basta declarar estes atributos como é mostrado: public class CarroCorrida { //Estado Integer numeroIdentificacao; Double velocidadeAtual = 0.0; Double velocidadeMaxima = 100.0; //... Desta forma toda vez que um carro for instanciado o valor destas variáveis estará previamente atribuído. Mas, observando novamente o nosso modelo de carro de corrida percebemos que faltam algumas características importantes. No nosso caso o piloto com seus atributos são fundamentais para uma corrida de automóveis. Isto é fácil de resolver, primeiro identificamos os atributos que desejamos e www.t2ti.com 10 Curso Java Starter 2. Não respeitou o algoritmo de aceleração do veículo que permite o aumento de velocidade em intervalos de 10 unidades mais um adicional de acordo com a habilidade do piloto. Diagnosticamos corretamente o problema e agora que o problema foi descoberto nós precisamos resolvê-lo, e para isto nós iremos entrar em um dos conceitos fundamentais do paradigma Orientado a objetos, o “encapsulamento”. ENCAPSULAMENTO Apesar do nome relativamente esquisito o conceito é simples. Encapsulamento refere-se ao isolamento entre as partes do programa. Uma das principais formas de fazer isso é proibindo o acesso direto as variáveis de um objeto por objetos externos. Para limitar o acesso aos membros do objeto (métodos e atributos), utilizamos os modificadores de acesso existentes em java (public, private, protected e default). Estes modificadores funcionam da seguinte forma:  public: Qualquer objeto pode acessar o membro;  default: Qualquer objeto do mesmo pacote pode acessar o membro e subclasses de outros pacotes;  protected: O membro é acessível apenas por objetos do mesmo pacote;  private: O membro é acessível apenas internamente (próprio objeto); Os dois modificadores de acesso mais utilizados desta lista são o public e o private, e são com estes que nós iremos nos preocupar. Normalmente, os métodos são públicos (public) e os atributos private (privados), isto ocorre pois nós desejamos que os atributos de um objeto só possam ser alterados por ele mesmo, desta forma nós inviabilizamos situações imprevistas. Vamos entender isto voltando ao nosso programa de corrida de carros. Observe que na linha identificada pela seta vermelha existe uma violação da integridade. Em um determinado momento do programa um valor é atribuído de forma aleatória, sem respeitar a regra de negócio. Observe novamente o trecho de código a www.t2ti.com 13 Curso Java Starter seguir: ... carroEquipeVelocidade.acelerar(); carroEquipeTrapaceiros.acelerar(); carroEquipeVelocidade.acelerar(); carroEquipeTrapaceiros.velocidadeAtual = 200.0; }... Compreendeu o problema? A equipe trapaceiros simplesmente “apelou” e atribuiu o valor 200 ao campo velocidadeAtual, desconsiderando que a velocidade máxima do carro é 100 e sem respeitar o algoritmo (regra de negócio) implementado no método acelerar. Para resolver isto nós iremos limitar o acesso aos atributos da classe CarroCorrida de forma que estes só possam ser acessado internamente. Observe como fica a nova classe: class CarroCorrida { //Estado private Integer numeroIdentificacao; private Double velocidadeAtual = 0.0; private Double velocidadeMaxima = 100.0; private Piloto piloto; Pronto! Agora os meus atributos só poderão ser acessados pela próprio objeto. Muito bem, mas criamos um outro problema... Como o meu programa irá saber a velocidade de cada carro e determinar quem está na frente ou atrás durante a corrida? Vamos entrar em uma outra importante convenção quando programamos em Java. São os métodos getters e setters. Este métodos são responsáveis por fornecer meios modificarmos o “estado” - lembra-se? - de um objeto, isto é, meios de acessarmos e modificarmos valores dos atributos de um objeto. Mas é claro que nós iremos criar estes métodos apenas se forem realmente necessários, ou seja, nós não damos acesso aos atributos que não interessam a outros objetos, ou seja, interessam apenas ao próprio objeto. A convenção para estes métodos é a seguinte:  Getters: Método que retorna o atributo, é sempre composto pela palavra get[nome do atributo]. Ex: getIdade(), getSalario().  Setters: Método que atribui/modifica o valor de um atributo, é sempre composto pela palavra set[nome do atributo] e o parâmetro do mesmo tipo do atributo. Ex: setIdade(Integer idade), setSalario(Double salario). www.t2ti.com 14 Curso Java Starter A nossa classe com estes métodos fica da seguinte forma: class CarroCorrida { //Estado private Integer numeroIdentificacao; private Double velocidadeAtual = 0.0; private Double velocidadeMaxima = 100.0; private Piloto piloto; //Comportamento... //Demais métodos foram suprimidos apenas para melhorar a visualização //... public Integer getNumeroIdentificacao() { return numeroIdentificacao; } public void setNumeroIdentificacao(Integer numeroIdentificacao) { this.numeroIdentificacao = numeroIdentificacao; } public Piloto getPiloto() { return piloto; } public void setPiloto(Piloto piloto) { this.piloto = piloto; } public Double getVelocidadeAtual() { return velocidadeAtual; } } Percebeu que eu não criei getter e setter para todos os atributos? Isto acontece pois não há necessidade de fornecer meios de acesso e/ou modificação a todos os atributos (observe o uso dos modificadores de acesso antes da declaração de cada variável e cada método – public e private). Vamos observar atributo a atributo e enteder o pensamento Orientado a objetos:  numeroIdentificacao: Este atributo deve ser acessado e atribuído/modificado (getter e setter foram criados) por qualquer objeto, pensando no mundo real (no caso a corrida que estou modelando) o número de identificação é variável, isto é, a direção do campeonato pode mudar aleatóriamente entre corridas, ou seja, é necessário fornecer meios de modificá-lo e acessá-lo a outros objetos;  velocidadeAtual: Este atributo pode apenas ser acessado (getter), isto ocorre pois desejo que a velocidade dos meus carros de corrida sejam modificadas apenas através dos métodos frear() e acelerar() www.t2ti.com 15 Curso Java Starter Ao aplicarmos os conceitos apresentados a nossa classe Corrida fica da seguinte forma: class Corrida { public static void main(String[] args) { //Criacao dos carros que irao correr CarroCorrida carroEquipeVelocidade = new CarroCorrida(1, 100.0); CarroCorrida carroEquipeTrapaceiros = new CarroCorrida(2, 100.0); //Criacao dos pilotos de cada equipe Piloto pilotoEquipeVelocidade = new Piloto(); Piloto pilotoEquipeTrapaceiros = new Piloto(); //Atributos do piloto da equipe Velocidade pilotoEquipeVelocidade.setNome("Piloto 1"); pilotoEquipeVelocidade.setIdade(25); pilotoEquipeVelocidade.setHabilidade(75); //Atributos do piloto da equipe Trapaceiros pilotoEquipeTrapaceiros.setNome("Piloto 2"); pilotoEquipeTrapaceiros.setIdade(27); pilotoEquipeTrapaceiros.setHabilidade(65); //Os pilotos sao colocados nos seus carros carroEquipeVelocidade.setPiloto(pilotoEquipeVelocidade); carroEquipeTrapaceiros.setPiloto(pilotoEquipeTrapaceiros); //Identificao dos carros carroEquipeVelocidade.setNumeroIdentificacao(1); carroEquipeTrapaceiros.setNumeroIdentificacao(2); //Carros sao ligados carroEquipeVelocidade.ligar(); carroEquipeTrapaceiros.ligar(); //Inicia a corrida carroEquipeVelocidade.acelerar(); carroEquipeTrapaceiros.acelerar(); carroEquipeVelocidade.acelerar(); carroEquipeTrapaceiros.acelerar(); carroEquipeVelocidade.acelerar(); carroEquipeTrapaceiros.acelerar(); } } Preste atenção neste novo código e compare-o com o que foi implementado anteriormente, veja que agora não acessamos/modificamos nenhum atributo de forma direta, somos obrigados a utilizar os métodos de cada uma das classes. Exercícios *Respeite o encapsulamento em todos os exercícios. www.t2ti.com 18 Curso Java Starter Aprenda com quem também está aprendendo, veja e compartilhe as suas respostas no nosso Fórum: Exercícios – Módulo 04 – OO, Classes e Objetos, Modificadores de Acesso 1. Modifique a classe CarroCorrida, vista durante este módulo. Adicione um outro construtor que receba apenas um parâmetro (velocidade máxima). 2. Crie uma classe Motor com o atributo potência (inteiro que varia entre 1 e 100), implemente um construtor que receba o parâmetro potência e verifique se o valor encontra-se dentro dos limites estabelecidos (1 - 100). Caso o valor extrapole o limite superior ou inferior o valor da potência deve ser o valor do limite extrapolado. 3. Adicione a classe CarroCorrida o atributo motor (utilize classe Motor do exercício 2). Altere o método acelerar() de forma que ao resultado da aceleração já implementado sejam adicionados 10% do valor da potência do motor. 4. Escreva uma classe “Contador”, que apresente métodos para informar o valor inicial, incrementar, decrementar e imprimir o valor atual. 5. Crie uma classe que represente um ponto no plano cartesiano, lembrando que um ponto no plano cartesiano é representado pelas coordenadas no eixo x e no eixo y. 6. Crie uma classe que represente um triângulo, utilize a classe desenvolvida no exercício anterior para identificar os vértices do triângulo. 7. Implemente uma classe Pessoa com os seguintes atributos: Nome, idade e CPF. 8. Utilizando a classe implementada no exercício anterior crie um programa que instancie 2 pessoas com todos os atributos e imprima os valores. 9. Implemente uma classe que represente uma sala de aula, esta sala pode ter o máximo de 10 alunos, se extrapolar este limite deve ser impressa uma mensagem avisando que o número máximo de alunos foi atingido. 10.Implemente uma classe de Endereço com os seguintes atributos: Estado, Cidade, Bairro, Rua, CEP e telefone. 11.Adicione a classe Pessoa desenvolvida no exercício 7 um atributo de endereço utilizando a classe desenvolvida no exercício 10. 12.Implemente um método construtor para a classe Pessoa de forma que uma instância desta classe seja criada apenas se possuir nome, idade e cpf. www.t2ti.com 19 Curso Java Starter 13.Implemente uma classe que simule um cadastro de pessoal. Esta classe deve armazenar até 100 pessoas (utilize a classe Pessoa) com seus respectivos endereços. Esta classe deve ter os seguintes comportamentos: permitir o cadastramento e exclusão de pessoas do cadastro. 14.Faça uma classe Calculadora que realize as 4 operações matemáticas básicas (soma, divisão, multiplicação e subtração) sobre dois valores (double) passados como parâmetros e retorne o resultado. Crie um programa que realize as 4 operações e imprima os resultados obtidos. 15.Faça uma classe CalculadoraComercial, esta classe deve realizar, além das 4 operações básicas, o cálculo de porcentagens. O cálculo da porcentagem deve ser efetuado sobre 2 parâmetros o valor total (double) e a porcentagem a ser obtida (inteiro) retornando o resultado. Atenção, a classe CalculadoraComercial deve ter um atributo Calculadora e transferir a responsabilidade pela realização das 4 operações matemáticas básicas para o objeto Calculadora, ou seja, a única implementação nova será o cáculo da porcentagem. 16.Faca uma classe Conta que contenha o cliente (utilize a classe Pessoa desenvolvida nos exercícios anteriores), o numero da conta, o saldo e o limite. Estes valores deverao ser informados no construtor. Faça um método depositar e um método sacar. O método sacar irá devolver true ou false, em razão da disponibilidade ou não de saldo. Faça um método saldo que retorne o saldo do cliente. 17.Utilize a classe Pessoa e a classe Sala, desenvolvidas nos exercícios anteriores, e mais uma classe Escola com atributos nome, CNPJ e salas (máximo de 20 salas ocupadas). Faça um programa que: ● Crie uma escola; ● Adicione a esta escola algumas salas; ● Adicione as salas pessoas (alunos); ● Transfira um aluno de uma sala para outra. www.t2ti.com 20 Curso Java Starter Segue um exemplo e o resultado de execução da classe: class JavaIniciante { public static void main (String args[]){ String s = "Java Iniciante"; System.out.println("Tamanho da string: " + s.length()); } } Método charAt() O método charAt() é utilizado para retornar um caractere de uma determinada string de acordo com um índice especificado entre parênteses (parâmetro), sendo que o primeiro caractere tem o índice 0, o segundo tem o índice 1 e assim por diante. Tem a seguinte sintaxe: nome-da-string.charAt(indice) Observe que no exemplo a seguir, o índice informado no parâmetro é 6, retornando o 7° caractere da string. class JavaIniciante { public static void main (String args[]){ String s = "Java Iniciante"; System.out.println("Caracter da posição 7: " + s.charAt(6)); } } www.t2ti.com 5 Curso Java Starter Métodos toUpperCase() e toLowerCase() Os métodos toUpperCase() e toLowerCase() são utilizados para transformar todas as letras de uma determinada string em maiúsculas ou minúsculas, respectivamente. Tem a seguinte sintaxe: nome-da-string.toUpperCase() nome-da-string.toLowerCase() Veja no exemplo a seguir: class JavaIniciante { public static void main (String args[]){ String s = "Java Iniciante"; System.out.println("String s em maiúscula: " + s.toUpperCase()); System.out.println("String s em minúscula: " + s.toLowerCase()); } } Método substring() O método substring() é utilizado para retornar uma cópia de caracteres de uma string a partir de dois índices inteiros especificados. Tem a seguinte sintaxe: nome-da-string.substring(indice1, indice2) O primeiro parâmetro especifica o índice a partir do qual se inicia a cópia dos caracteres. O segundo parâmetro é opcional (se não for inserido será considerado como o comprimento máximo da string) e especifica o índice final em que termina a cópia dos caracteres, porém o índice final deve especificar um índice além do último caractere. Caso queira uma cópia do 1° ao 5° caracteres, o índice inicial deve ser 0 e o índice final 6. Veja no exemplo a seguir: www.t2ti.com 6 Curso Java Starter class JavaIniciante { public static void main (String args[]){ String s = "Java Iniciante"; System.out.println("Do 3° caratere até o fim: " + s.substring(2)); System.out.println("Do 1° caratere até o 6°: " + s.substring(0, 6)); System.out.println("Do 4° caratere até o 13°: " + s.substring(3, 13)); } } Método trim() O método trim() tem por objetivo remover todos os espaços em branco que aparecem no início e no final de uma determinada string. Observe que serão removidos apenas os espaços do início e do fim da string – não serão removidos os espaços entre as palavras. Tem a seguinte sintaxe: nome-da-string.trim() class JavaIniciante { public static void main (String args[]){ String s = " Java Iniciante "; System.out.println("Com espaços: *" + s + "*"); System.out.println("Sem espaços: *" + s.trim() + "*"); } } Método replace() O método replace() é utilizado para substituição de caracteres individuais de www.t2ti.com 7 Curso Java Starter class JavaIniciante { public static void main (String args[]){ String s1 = new String("Curso Java Iniciante"); String s2 = new String("Curso Java Iniciante"); if (s1 == s2){ System.out.println("As duas strings são iguais!"); } else{ System.out.println("As duas strings são diferentes!"); } } } O que há de errado neste resultado? Declaramos duas strings e a instanciamos com o mesmo conteúdo, e ao compará-las temos como resultado que elas são diferentes. Quando quisermos comparar duas strings, não devemos utilizar “==” e sim o método equals() que possui a seguinte sintaxe: string1.equals(string2) Agora vamos utilizar este método e ver o que acontece: class JavaIniciante { public static void main (String args[]){ String s1 = new String("Curso Java Iniciante"); String s2 = new String("Curso Java Iniciante"); if (s1.equals(s2)){ System.out.println("As duas strings são iguais!"); } else{ System.out.println("As duas strings são diferentes!"); } } } www.t2ti.com 10 Curso Java Starter Agora sim, temos o resultado esperado! A classse java.lang.String possui vários métodos. É uma boa prática consultar o javadoc (esse assunto será abordado no próximo módulo) desta classe para aprender mais sobre a mesma. java.lang.Math A classe java.lang.Math possui vários métodos que permitem efetuar diversos tipos de cálculos matemáticos. Para utilizar os métodos desta classe basta chamar o método precedido do nome Math. Ela não pode ser estendida (é uma classe final) e possui o construtor private (não pode ser instanciada); Métodos max() e min() O método max() é utilizado para verificar o maior valor entre dois números, e o método min() é utilizado para verificar o menor valor entre dois números, que podem ser do tipo double, float, int ou long. Observe a seguir a sintaxe destes métodos: Math.max(valor1, valor2); Math.min(valor1, valor2); class JavaIniciante { public static void main (String args[]){ int a = 10; double b = 5.4; int c = -4; System.out.println("Qual o maior valor? 10 ou 5.4: " + Math.max(a, b)); System.out.println("Qual o maior valor? 5.4 ou -4: " + Math.max(b, c)); System.out.println("Qual o menor valor? 5.4 ou -4: " + Math.min(b, c)); } } www.t2ti.com 11 Curso Java Starter Método random() O método random() é utilizado para gerar valores de forma aleatória. Toda vez que este método é chamado, será gerado um valor do tipo double entre 0.0 e 1.0 (o valor 1.0 nunca é gerado). Veja a sintaxe deste método: Math.random() class JavaIniciante { public static void main (String args[]){ System.out.println("Número aleatório: " + Math.random()); System.out.println("Número aleatório: " + Math.random()); System.out.println("Número aleatório: " + Math.random()); } } Execute a aplicação várias vezes e perceba que o resultado será sempre diferente. Agora, se quisermos gerar números aleatórios inteiros? Por exemplo, minha aplicação precisa de números entre 0 e 99. O exemplo seguinte mostra como implementar isto. class JavaIniciante { public static void main (String args[]){ System.out.println("Número aleatório: " + (int) (Math.random() * 100)); System.out.println("Número aleatório: " + (int) (Math.random() * 100)); System.out.println("Número aleatório: " + (int) (Math.random() * 100)); } } www.t2ti.com 12 Curso Java Starter No exemplo anterior, a data e hora foram mostradas de uma forma diferente da que estamos acostumados. Vamos analisá-lo: 1 - Tue --> representa o dia da semana. Neste caso “Tuesday” - Terça-feira 2 – Nov --> representa o mês. Neste caso “November” - Novembro 3 – 20 --> representa o dia do mês. 4 – 20:38:34 --> representa a hora, minuto e segundo. 5 – GMT -03:00 --> representa o Tempo Médio de Greenwich. Neste caso a hora oficial do brasil. 6 – 2007 --> representa o ano. Talvez não seja muito útil a data representada desta maneira, então vamos obter cada campo separadamente. Vamos utilizar agora o método get(). import java.util.Calendar; class JavaIniciante { public static void main (String args[]){ Calendar data = Calendar.getInstance(); System.out.println("Dia do mês: " + data.get(Calendar.DAY_OF_MONTH)); System.out.println("Mês : " + (data.get(Calendar.MONTH) + 1)); System.out.println("Ano : " + data.get(Calendar.YEAR)); System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY)); System.out.println("Minuto : " + data.get(Calendar.MINUTE)); System.out.println("Segundo : " + data.get(Calendar.SECOND)); } } O método get() da classe Calendar sempre retorna um valor do tipo int. Observe que para o mês, incrementamos o valor obtido em 1. A constante Calendar.MONTH que representa o mês inicia em 0(zero), ou seja, janeiro = 0, fevereiro = 1 e assim por diante. Agora iremos atribuir novos valores para os campos utilizando o método set(). Este método necessita de dois argumentos: o primeiro define qual campo vamos alterar e o segundo o novo valor do campo. www.t2ti.com 15 Curso Java Starter import java.util.Calendar; class JavaIniciante { public static void main (String args[]){ Calendar data = Calendar.getInstance(); data.set(Calendar.DAY_OF_MONTH, 18); data.set(Calendar.MONTH, 10); data.set(Calendar.YEAR, 2005); data.set(Calendar.HOUR_OF_DAY, 14); data.set(Calendar.MINUTE, 18); data.set(Calendar.SECOND, 45); System.out.println("Dia do mês: " + data.get(Calendar.DAY_OF_MONTH)); System.out.println("Mês : " + data.get(Calendar.MONTH)); System.out.println("Ano : " + data.get(Calendar.YEAR)); System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY)); System.out.println("Minuto : " + data.get(Calendar.MINUTE)); System.out.println("Segundo : " + data.get(Calendar.SECOND)); } } No exemplo anterior, definimos a data para 18/11/2005, 14:18:45. E se quisermos “somar” 20 dias a esta data? Para isto, utilizamos o método add(). Da mesma forma que o set(), informamos dois argumentos: o primeiro define qual campo vamos “somar” e o segundo quanto iremos “somar”. import java.util.Calendar; class JavaIniciante { public static void main (String args[]){ Calendar data = Calendar.getInstance(); data.set(Calendar.DAY_OF_MONTH, 18); data.set(Calendar.MONTH, 10); data.set(Calendar.YEAR, 2005); data.set(Calendar.HOUR_OF_DAY, 14); data.set(Calendar.MINUTE, 18); data.set(Calendar.SECOND, 45); data.add(Calendar.DAY_OF_MONTH, 20); System.out.println("Dia do mês: " + data.get(Calendar.DAY_OF_MONTH)); System.out.println("Mês : " + data.get(Calendar.MONTH)); System.out.println("Ano : " + data.get(Calendar.YEAR)); System.out.println("Hora : " + data.get(Calendar.HOUR_OF_DAY)); System.out.println("Minuto : " + data.get(Calendar.MINUTE)); System.out.println("Segundo : " + data.get(Calendar.SECOND)); www.t2ti.com 16 Curso Java Starter } } Como resultado, obtivemos a data 8/12/2005, 14:18:45. Lembre-se que o campo “mês” começa com 0(zero). Outros métodos muito importantes da classe java.util.Calendar são: before() e after(). before() nos permite saber se uma determinada data é anterior a outra data. after() é o inverso, retorna se uma data é posterior a outra data. Tem a seguinte sintaxe: data1.before(data2) data1.after(data2) before() retorna verdadeiro, se e somente se data1 < data2. after() retorna verdadeiro, se e somente se data1 > data2. import java.util.Calendar; class JavaIniciante { public static void main (String args[]){ Calendar data1 = Calendar.getInstance(); data1.set(Calendar.DAY_OF_MONTH, 18); data1.set(Calendar.MONTH, 10); data1.set(Calendar.YEAR, 2005); Calendar data2 = Calendar.getInstance(); data2.set(Calendar.DAY_OF_MONTH, 12); data2.set(Calendar.MONTH, 8); data2.set(Calendar.YEAR, 2007); if (data1.before(data2)){ System.out.println("data1 é anterior a data2"); } else{ System.out.println("data1 não é anterior a data2"); } } } www.t2ti.com 17 Curso Java Starter Módulo 06 JAVADOC E ARQUIVOS “JAR” JAVADOC JAVADOC, é um utilitário para a geração da documentação das classes criadas em Java. Esta documentação é muito importante, pois é através dela que conhecemos melhor as classes, verificando quais métodos determinada classe possui e suas funcionalidades. Aprender utilizá-la é essencial. A documentação da API Java 1.6 pode ser acessada no link: http://java.sun.com/javase/6/docs/api/ www.t2ti.com 3 Curso Java Starter Na tela seguinte, estamos acessando a API da classe java.util.Calendar: O campo representado por “1” contém a lista de pacotes. O campo representado por “2” contém a lista de classes e interfaces do pacote selecionado em “1”. O campo representado por “3” contém a descrição da classe selecionada em “2”. Todo o detalhamento da classe vai estar no campo representado por “3”. No cabeçalho da página encontramos links para: Overview – Mostra todos os pacotes da API Java. Package – Mostra a descrição de todas as classes do pacote atual. Neste www.t2ti.com 4 Curso Java Starter caso, java.util. Class – classe que está sendo acessada. Use – Lista dos pacotes que a classe atual utiliza. Tree – Hierarquia de classes no pacote atual. Deprecated – classes e métodos que não são recomendados utilizar. Index – índice de métodos e campos. Muito útil quando não se sabe a classe. Help – ajuda de como utilizar a documentação. Identificado com a letra A temos o nome do pacote em B temos o nome da classe em C temos a estrutura hierárquica de classes em D temos as interfaces que são implementadas por esta classe e em E temos as classes que estendem esta classe. www.t2ti.com 5 Curso Java Starter Podemos observar aqui o modificador de acesso (public), o tipo de retorno (Calendar) o nome do método (getInstance) e o parâmetro (TimeZone). Gerando o JAVADOC Quando instalamos o JDK, o gerador de javadoc também é instalado. O mesmo fica na pasta “%JAVA_HOME%/bin/javadoc.exe”. Agora vamos criar um javadoc da classe a seguir: package veiculo public class CarroPasseio { public void acelerar(){ //código... } public void frear(int intensidade){ //código www.t2ti.com 8 Curso Java Starter } public int getVelocidade(){ //código... return 0; } } No prompt de comando digitamos o seguinte comando: javadoc veiculo veiculo --> nome do pacote Será gerado javadoc para todas as classes que estiverem no pacote “veiculo”. Se tiver mais de um pacote, faça assim: javadoc pacote1 pacote2 pacote3 ... Serão gerados vários arquivos. Abra o arquivo “index.html” e temos o javadoc do pacote “veiculo”: www.t2ti.com 9 Curso Java Starter Acessando a classe “CarroPasseio” temos o seguinte: Geramos o javadoc, mas vemos que só aparecem o nome do construtor e dos www.t2ti.com 10
Docsity logo



Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved