




























































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
programação em java
Tipologia: Notas de estudo
1 / 124
Esta página não é visível na pré-visualização
Não perca as partes importantes!





























































































Autoria: Patrícia Augustin Jaques - [email protected]
Última atualização: Outubro de 2007.
Nenhuma parte desta apostila pode ser utilizada ou reproduzida, em qualquer meio ou forma, seja mecânico ou eletrônico, fotocópia, gravação, ou outros, sem autorização, prévia, expressa e específica do Autor. Essa apostila está protegida pela licença Creative Communs. Você pode usá-la para seus estudos, mas não pode usá-la para fins comerciais ou modificá-la. Bons estudos em Java!
Programação Básica em Java by Patrícia Augustin Jaques is licensed under a Creative Commons Atribuição- Uso Não-Comercial-Vedada a Criação de Obras Derivadas 2.5 Brasil License.
Meus agradecimentos a aluna Natali Silverio que me permitiu conhecer a licença Creative Commons.
Um especial agradecimento ao aluno Leandro Medeiros que ajudou na revisão do texto.
A linguagem Java surgiu em 1991 quando cientistas da Sun, liderados por Patrick Naughton e James Gosling, projetaram uma linguagem pequena para ser utilizada em eletrodomésticos em geral. O projeto se chamava “Green”.
Como o pessoal da Sun vinha de uma geração UNIX, eles basearam a linguagem em C++ e ela foi chamada originalmente de “Oak”. Oak é um tipo de árvore e a linguagem foi assim denominada porque havia uma árvore deste tipo, a qual Gosling gostava de apreciar, e que podia ser vista da janela de sua sala na Sun. Porém, posteriormente, eles verificaram que Oak era o nome de uma linguagem de programação existente e, por isso, trocaram o nome para Java.
O projeto Green passou os anos de 1993 e 1994 procurando uma empresa que quisesse comprar a sua tecnologia, mas não encontraram ninguém. Dizem que Patrick Naughton, uma das pessoas responsáveis pelo marketing, conseguiu acumular 300.000 milhas aéreas de bônus tentando vender a tecnologia Java.
Enquanto isso a World Wide Web crescia mais e mais. A chave para a Web é o browser que recebe a página hipertexto e o converte para a tela. Então, para mostrar o poder de Java, Patrick Naughton e Jonathan Payne construíram o browser HotJava. Este browser reconhecia applets e, por isso, tinha uma máquina virtual Java embutida em si. Em 1995, a Netscape decidiu tornar a próxima versão do seu browser (versão 2.0) apta a reconhecer applets Java. A partir de então, todas as versões posteriores do Netscape, inclusive do Internet Explorer, reconhecem Java.
A sintaxe da linguagem Java é muito semelhante a da linguagem C ou de C++. Logo, o programador que já conhece a linguagem C achará a transição para Java simples e fácil.
A sintaxe de Java fornece uma versão mais limpa do que C++. Em Java não existe aritmética de ponteiros, estruturas, uniões e etc.
Java é uma linguagem voltada para a programação orientada a objetos e, por isso, todo o código está contido dentro de classes.
Java suporta herança simples, mas não herança múltipla. A ausência de herança múltipla pode ser compensada pelo uso de herança e interfaces, onde uma classe herda o comportamento de sua superclasse além de oferecer uma implementação para uma ou mais interfaces.
Todo programa Java é compilado e interpretado. Um programa em Java é compilado para um código composto por instruções chamadas de “bytecode”. O “bytecode” é um código de uma máquina virtual, chamada Máquina Virtual Java (Java Virtual Machine - JVM), idealizada pelos criadores da linguagem. Os bytecodes são independentes de plataforma e são interpretados pela JVM para serem executados no computador.
Todo o interpretador Java ou browser que execute applets Java é uma implementação de uma Máquina Virtual Java. A JVM também pode ser implementada em hardware.
Além da JVM, a plataforma Java é composta também pela Java Application Programming Interface (Java API). A API Java é uma grande coleção de componentes de software disponibilizados que fornecem muitas capacidades interessantes e úteis, tais como, componentes de interface gráfica, conexão via sockets, etc. A API Java é agrupada em bibliotecas (packages ou pacotes) de componentes relacionados.
O código Java é compilado uma única vez, porém o programa é interpretado toda vez que for executado. Esse processo pode ser mais bem visualizado na figura a seguir.
A presença de coleta automática de lixo (Garbage Collection) evita erros comuns que os programadores cometem quando são obrigados a gerenciar diretamente a memória (C, C++, Pascal). A eliminação do uso de ponteiros, em favor do uso de vetores, objetos e outras estruturas substitutivas, traz benefícios em termos de segurança. O programador é proibido de obter acesso à memória que não pertence ao seu programa, além de não ter chances de cometer erros comuns tais como uso indevido de aritmética de ponteiros.
A presença de mecanismos de tratamento de exceções torna as aplicações mais robustas, não permitindo que elas abortem, mesmo quando rodando sob condições anormais.
Java suporta Multithreading que é a capacidade de um programa fazer mais de uma coisa ao mesmo tempo como, por exemplo, imprimir enquanto lê um fax. A linguagem permite a criação, de maneira fácil, de vários “threads” de execução, que eliminam o período de inatividade do processador executando concorrentemente ou tomando vantagem da execução paralela real em sistemas multiprocessadores.
A partir desta versão é necessário apenas configurar a variável de ambiente PATH. A localização das bibliotecas Java é encontrada automaticamente pela Máquina Virtual Java através do diretório fornecido no PATH. A variável PATH é definida no arquivo autoexec.bat da seguinte maneira:
PATH=%PATH%;c:\jdk1.3\bin
Se for necessário utilizar uma outra biblioteca além das bibliotecas padrões fornecidas com o Java2 SDK (por exemplo, servlets), é necessário que você a defina no CLASSPATH.
A IBM disponibiliza gratuitamente na sua homepage http://oss.software.ibm.com/developerworks/projects/jikes o compilador Java IBM Jikes. Atualmente, o Jikes encontra-se na versão 1.21. Você vai observar que ele é bem mais rápido que o compilador javac da SUN. Vale a pena experimentar!
Para o Jikes é importante definir a variável de ambiente classpath no arquivo autoexec.bat, além de copiar o jikes para o diretório bin onde foi instalado o jdk:
PATH=%PATH%; c:\jdk1.3\bin set CLASSPATH=.;c:\jdk1.3\jre\lib\rt.jar
O código do programa Java que você criar pode ser digitado em qualquer editor de texto padrão como, por exemplo, o WordPad e o NotePad. Atualmente, existem alguns editores de texto específicos para criação de programas Java.
O Kawa, por exemplo, é umshareware e pode ser copiado do site http://www.allaire.com/.
Um outro bom editor que pode ser encontrado na versão freeware é o JCreator. Ele pode ser copiado do site http://www.jcreator.com.
Neste capítulo vamos escrever, compilar e executar o tradicional aplicativo “Hello World”. O código deste programa será explicado posteriormente para que você possa começar a entender os fundamentos da programação Java.
Linha 2: public class HelloWorld
Esta linha utiliza a palavra reservada class para declarar que uma nova classe será definida aqui. HelloWorld é o nome usado para identificar a classe. Toda a definição da classe, inclusive todo o código e os dados, estará entre a chave de abertura “{“ e a chave final “}” que se encontram nas linhas 5 e 8 deste exemplo.
Linha 4: public static void main (String args[ ])
A linha 3 contém a declaração do método main. O método main é simplesmente um ponto de partida para o interpretador Java. É por onde será iniciada a execução.
O método main deverá sempre ser declarado na forma acima.
Linha 6: System.out.println (“Hello, World!”);
Esta linha executa o método println do objeto out. Este objeto é uma instância da classe OutputStream e foi declarado como variável de classe (static) na classe System. Este método imprime na tela uma mensagem texto, no caso, “Hello, World!”.
Por causa do modelo de objeto, uma saída simples de console é complicada para entender. Por isso, até aprofundarmos o conteúdo suficientemente, pense apenas em System.out.println como um método para impressão na tela (saída do console).
Após digitar o código-fonte, você deve nomear o arquivo. Os arquivos que contém o código-fonte Java devem sempre ter a terminação “.java”. Geralmente, em Java, coloca-se uma classe dentro de cada arquivo. O arquivo conterá o mesmo nome da classe.
Cuidado, o compilador Java diferencia letras maiúsculas de minúsculas, por isso, preste atenção quando for nomear o arquivo.
Se você utilizar o modificador public para a classe, por exemplo, public class HelloWorld, o arquivo deve possuir o mesmo nome que a classe. Caso não utilize public, o arquivo pode ter outro nome.
Para compilar o código acima você deve digitar:
C:> javac HelloWorld.java
O compilador é chamado pelo comando javac seguido do nome do arquivo sempre com a terminação “.java”. Ao ser compilado, se o código não possuir nenhum erro, será gerado um arquivo chamado HelloWorld.class composto por bytecodes. Esse programa é independente de plataforma e, por isso, o seu programa HelloWorld (.class) pode ser executado em qualquer sistema operacional que possua a JVM instalada.
Após a compilação do programa, em que foi gerado o arquivo HelloWorld.class, você pode executá-lo digitando o seguinte comando:
C:>java HelloWorld
No código acima estamos chamando o interpretador Java (java.exe) para carregar a classe HelloWorld e executá-la. No comando de execução não se deve digitar a extensão do arquivo (.class). A seguinte saída será gerada para o programa acima:
programador, também como classes da Java API. Apenas são carregadas as classes da Java API que são utilizadas pelo programa.
A MVJ também possui uma máquina de execução (execution engine) que é um mecanismo responsável por executar as instruções Java (bytecodes) contidos nos métodos das classes carregadas. Em uma MVJ implementada em software, o tipo mais simples deexecution engine apenas interpreta os bytecodes um por um. Um outro tipo deexecution engine, que é mais rápida, é o compiladorjust-in-time (JIT). Um compilador JIT compila os bytecodes para código em máquina nativa na primeira vez que o método é executado. O código nativo é guardado em memória e, então, pode ser reusado na próxima vez que o método é invocado. Ele mantém em memória tanto os bytecodes como o código nativo, por isso, embora seja mais rápido, requer mais memória.
Algumas vezes a JVM é chamada de interpretador já que, quando a MVJ é implementada em software, ela interpreta os bytecodes para executá-los. Porém, algumas MVJs usam técnicas diferentes, como é o caso dos compiladores JIT. Desta maneira, não é muito adequado chamar a MVJ de interpretador (Venners, 2000).
Faça um programa Java leia um argumento passado para a Máquina Virtual Java. O programa deve ser formado por uma única classe e contém apenas o método main ( ). A classe deve se chamar PedeArgumento e você passará o seu nome como argumento. Por exemplo, se o seu nome é Nicolas, você deve executar o programa através do seguinte comando:
C:/> java PedeArgumento Nicolas
E o programa deve exibir na tela como resultado:
Dica : Todo o parâmetro passado para a MVJ é recebido pela array de String do método main(). Para acessar um argumento de uma array, forneça a posição da array que você deseja acessar. Por exemplo, como nós fornecemos apenas uma String ela estará na primeira posição da array que é zero: String nome = args [0];
Se você digitasse duas strings (por exemplo, o seu nome e sobrenome, seria necessário acessar as duas primeiras posições da array: 0 e 1).
Java é uma linguagem de formato livre. Não é necessário endentar para que ela funcione corretamente. Por exemplo, o nosso programa HelloWorld poderia ser escrito da seguinte maneira:
public class HelloWorld{public static void main (String a[ ] ) {System.out.println (“Oi, mundo!”);}}
Devemos, porém, tomar cuidado para que haja pelo menos um espaço, Tab ou uma nova linha entre palavras que não estejam separadas por um operador ou separador.
Os comentários em código-fonte Java podem ser de 3 tipos: de uma linha, de várias linhas e de documentação. Os comentários de uma linha começam com // (duas barras) e terminam no final da linha. Este tipo de comentário é útil para explicações de uma única linha de código. Nas linhas 7 e 8 do código exibido no início deste capítulo encontramos dois comentários desse tipo.
O comentário de várias linhas é usado para comentários mais longos que uma linha e é iniciado com /* (barra-asterisco) e finalizado com * / (asterisco-barra). Tudo que houver entre /* e */ é considerado um comentário e, portanto, ignorado pelo compilador.
Existe ainda o comentário de documentação que começa com /** (barra-asterisco-asterisco) e finaliza com */ (asterisco-barra). O uso da ferramenta JavaDoc para gerar documentação HTML vai ser explicado no capítulo 7 (página 58 ).
As palavras-chave reservadas Java são usadas para identificar os tipos, modificadores e mecanismos de controle de fluxo. Essas palavras, juntamente com os operadores e separadores, formam a definição da linguagem Java. Elas não podem ser usadas como nome de variável, método ou classe.
abstract boolean break byte byvalue case cast catch char class
const continue default do double else extends false final finally float for future generic goto if implements import inner instanceof int interface long native new null operator outer package private
protected public rest return short static super switch synchronized this throw throws transient true try var void volatile while
Grupo Tipo Tamanho Intervalo de Valores Valor Default
Inteiros
int 4 bytes - 2.147.483.648 até 2.147.483.64 7 0 short 2 bytes - 32.768 até 32.767 0 long 8 bytes - 9.223.372.036.854.775.808L até 9.223.372.036.854.775.807L
0L
byte 1 byte - 128 até 127 0
Ponto Flutuante
float 4 bytes +- 3,40282347E+38F (6-7 dígitos significativos)
0.0f
double 8 bytes +- 1,79769313486231570E+ (15 dígitos significativos)
0.0d
char 2 bytes representa um Unicode „\u0000‟; boolean 1 bit true ou false false
Qualquer operação numérica em variáveis de tipos diferentes será realizada da seguinte maneira:
Se um dos operandos é do tipo double, o outro será tratado como um double no escopo da operação; Senão, se um dos operandos for float, o outro será tratado como float; Senão, se um dos operandos é do tipo long, o outro será tratado como long. Senão, os operandos serão tratados como inteiros.
Mas em alguns casos pode ser necessário converter, por exemplo, um double em um inteiro. Toda conversão numérica em Java é possível, mas informações podem ser perdidas. Estas conversões podem ser realizadas com o uso de cast. A sintaxe do casting é colocar o tipo desejado entre parênteses antes do nome da variável. Por exemplo:
double x = 9,997; int nx = (int) x;
Java permite ainda que certas conversões sejam feitas pela atribuição de valores de um tipo para outro sem que seja necessário o uso de cast. As conversões permitidas de forma automática pelo compilador são:
byte short int long float double
Você pode atribuir o valor de uma variável que está à esquerda para aquela do tipo que está à direita.
Muito embora os chars não sejam usados como inteiros, você pode operá-los como se fossem inteiros. Desta maneira, é necessário o uso de cast para converter inteiros em caracteres. Caracteres podem ser considerados inteiros sem o uso de casting. Por exemplo:
int três = 3; char um = „1‟; char quatro = (char) (três+um);
A variável quatro finaliza com „4‟ armazenado nela. Observe que um foi promovido para int na expressão, exigindo a definição de tipo de char antes da atribuição para a variável quatro.
Se você desejar que uma variável inteira receba o valor inteiro que um determinado caractere representa, você pode usar o método digit (char, int) da classe Character, onde passamos como parâmetro o caractere e a base de conversão (decimal, binária, etc). Para o contrário, converter um inteiro para um caractere que represente aquele inteiro, utilize o método forDigit (int, int) onde o primeiro parâmetro representa o valor inteiro a ser convertido e o segundo parâmetro a base de conversão. O exemplo abaixo ilustra essas conversões:
public class ConverteCaracteres { public static void main (String args []) { int i = 3; char c = '1'; // converte char em inteiro. Ex: '1' - > 1 int res1 = Character.digit (c, 10);
// converte inteiro em char. Ex: 1 - > '1' char res2 = Character.forDigit (i, 10); System.out.println ("char - > int = " + res1); System.out.println ("int - > char = " + res2); } }
As variáveis do tipo byte, short, int, long, float, double, char e boolean podem ser declaradas de acordo com uma das formas exibidas abaixo.
int a, b, c; Declarando as variáveis a, b e c.
int d = 3, e, f=5; Declarando d, e, f e inicializando d com 3 e f com 5. double pi = 3.14159; Declarando e inicializando pi com o valor 3.14159; char x = „x‟; Declarando e inicializando x com o caractere „x‟;
As variáveis membros (dentro de uma classe) não inicializadas recebem por default o valor 0 (zero). As variáveis locais (dentro de um método) não são inicializadas por default e, por isso, é gerado um erro de compilação quando não é atribuído nenhum valor inicial a elas e essas são acessadas.
O seguinte programa cria variáveis de cada tipo primitivo e exibe seus valores:
class SimpleTypes { public static void main (String args [ ]) { byte b = 5; short s = 5; int i = 334; long l = 34567L; float f = 35.76f; double d = 35.76; System.out.println (“byte b = “+b); System.out.println (“short s = “+s); System.out.println (“int i = “+i); System.out.println (“long l = “+l); System.out.println (“float f = “+f); System.out.println (“double d = “+d); } }
Em Java não podem ser definidas constantes locais para um determinado método como, por exemplo, o main. Ao invés disso, pode haver somente constantes para todos os métodos na classe. Elas são chamadas usualmente de constantes de classe. As constantes são sempre definidas através dos modificadores static final. Por exemplo:
public class UsesConstants { public static final double GRAVIDADE = 32; public static void main (String args [ ]) { System.out.println ("A gravidade é " +GRAVIDADE); } }
Existem quatro tipos de operadores em Java: aritméticos, bit-a-bit, relacional e lógico.
Operador Resultado
&& AND lógico || OR lógico ! Negação
Para os operadores acima, os resultados seguem a tabela exibida a seguir.
A B OR (||) AND (&&) NOT A (!A)
False false false false true True false true false false False true true false true True true true true false
Por exemplo, no código abaixo a variável c será incrementada.
boolean a=true, b=false; int c=0; if (a && !b) c++;
Os tipos numéricos inteiros possuem um conjunto adicional de operadores que podem modificar e inspecionar os bits que formam seus valores. São eles:
Op. Operação Op. Operação
~ NOT bit-a-bit
& AND bit-a-bit &= atribui e AND | OR bit-a-bit |= atribui e OR ^ OR exclusivo ^= atribui e OR exclusivo
deslocamento à direita (shift right) >>= atribui e deslocamento à direita
deslocamento à direita com zeros >>>= atribui e deslocamento à direita com zeros << deslocamento à esquerda (shift left) <<= atribui e deslocamento à esquerda
A tabela a seguir mostra como cada operador bit-a-bit age em cada combinação de bits de operando.
A B OR (|) AND (&) XOR (^) NOT A (~A)
0 0 0 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1
1 1 1 1 0 0
Abaixo, encontram-se alguns exemplos:
NOT : O operador unário NOT (~) inverte todos os bits de um operando. Por exemplo, a operação de NOT sobre o número 42:
a 00101010 42 ~a 11010101 - 43
AND: Gera 1 se os bits dos operandos forem 1, caso contrário gera 0 (zero).
a 00101010 42 b 00001111 15 a&b 00001010 10
OR: Se um dos bits dos operandos for 1 ele gera 1, caso contrário ele gera 0 (zero).
00101010 42 00001111 15 a | b 00101111 47
XOR: Combina os bits de tal maneira que se os bits dos operandos forem diferentes gera 1, caso contrario gera 0 (zero).
a 00101010 42 b 00001111 15 a^b 00100101 37
<< (Deslocamento para a esquerda): Move todos os bits do operando à esquerda no número de vezes especificado no segundo operando. Para cada bit deslocado, os bits à esquerda são perdidos e as posições à direita preenchidas com zeros. A operação de deslocar à esquerda tem o efeito de multiplicar um número por 2 tantas vezes quanto for efetuado o deslocamento. Além disso, ao se deslocar um bit 1 para a posição mais alta, o número torna-se negativo.
a 00000011 3 a<<1 00000110 6
>> (Deslocamento para a direita): Move todos os bits do operando da esquerda para a direita no número de posições de bits especificados pelo operando da direita. Os bits deslocados para direita se perdem.
Esta operação tem o efeito de que cada bit deslocado divide o valor do operando em 2 sem considerar o resto. Ao deslocar para a direita, os bits superiores (da extrema esquerda) são preenchidos com o conteúdo do bit anterior. Isto é chamado de extensão de sinal e serve para preservar o sinal de números negativos.
a 00100011 35 a>>2 00001000 8
>>> Deslocamento para a direita sem sinal: Desloca n bits à direita preenchendo os campos superiores (extrema esquerda) com zero.
A 11111111 11111111 11111111 11111111 - 1 a>>>24 00000000 00000000 00000000 11111111 255
Todos os tipos de inteiros são inteiros com sinal. Isto significa que eles podem representar tantos valores negativos como positivos. Java usa uma codificação conhecida como complemento de dois, o que significa que os números negativos estão representados pela inversão (mudança de 1‟s para 0‟s e vice-versa) de todos os bits de um valor, somando-se depois 1 ao resultado. Por exemplo, 42 é 00101010 que invertendo os 0 ‟s e 1‟s fica 11010101, depois somando 1 resulta em 11010110 ou – 42. Para decodificar um número negativo em binário para decimal, primeiro inverta todos os bits e depois some 1.
expressão? declaração1 : declaração
Onde expressão é qualquer expressão que o resultado seja um valor boolean. Se o resultado for true, a declaração 1 é executada e se for false a declaração 2 é executada. Por exemplo:
ratio = denom==0? 0 : num/denom;
Na expressão acima é avaliado se denom é igual a zero. Caso positivo ratio recebe zero, senão ratio recebe num/denom.