(Parte 1 de 5)

Caelum

"Mata o tempo e matarás a tua carreira" Bryan Forbes

Sobre a empresa

A Caelum atua no mercado desde 2002, desenvolvendo sistemas e prestando consultoria em diversas áreas, sempre à luz da plataforma Java. Foi fundada por profissionais que se encontraram no Brasil após experiências na Alemanha e Itália, desenvolvendo sistemas de grande porte, com integração aos mais variados ERPs. Seus profissionais já publicaram diversos artigos nas revistas brasileiras sobre Java, artigos acadêmicos e são presença constante nos eventos de tecnologia.

Em 2004, a Caelum criou uma gama de cursos que rapidamente ganharam grande reconhecimento no mercado. Os cursos foram elaborados por ex-instrutores da Sun que queriam trazer mais dinamismo e aplicar as ferramentas e bibliotecas utilizadas no mercado, tais como Eclipse, Hibernate, Struts, e outras tecnologias open source que não são abordadas pela Sun. O material utilizado foi elaborado durante os cursos de verão de Java na Universidade de São Paulo, em janeiro de 2004, pelos instrutores da Caelum.

Em 2008, a empresa foca seus esforços em duas grandes áreas:

• Consultoria, mentoring e coaching de desenvolvimento • Treinamento com intuito de formação

Sobre a apostila

Esta apostila da Caelum visa ensinar Java de uma maneira elegante, mostrando apenas o que é necessário e quando é necessário, no momento certo, poupando o leitor de assuntos que não costumam ser de seu interesse em determinadas fases do aprendizado.

A Caelum espera que você aproveite esse material e que ele possa ser de grande valia para auto-didatas e estudantes. Todos os comentários, críticas e sugestões serão muito bem-vindos.

O material aqui contido pode ser publicamente distribuído, desde que seu conteúdo não seja alterado e que seus créditos sejam mantidos. Ele não pode ser usado para ministrar qualquer outro curso, porém pode ser utilizado como referência e material de apoio. Caso você esteja interessado em usá-lo para fins comerciais, entre em contato com a empresa.

Atenção: Você pode verificar a versão da apostila no fim do índice. Não recomendamos imprimir a apostila que você receber de um amigo ou pegar por e-mail, pois atualizamos constantemente esse material, quase que mensalmente. Vá até nosso site e veja a última versão.

w.caelum.com.br

Índice

1.1 O que é realmente importante?1
1.2 Sobre os exercícios2
1.3 Tirando dúvidas2
1.4 Bibliografia2

1 Como Aprender Java 1

2.1 Java3
2.2 Máquina Virtual4
2.3 Java lento? Hotspot e JIT6
2.4 Versões do Javae a confusão do Java2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.5 JVM? JRE? JDK?7
2.6 Onde usar e os objetivos do Java7
2.7 Especificação versus implementação8
2.8 Como o FJ-1 está organizado8
2.9 Compilando o primeiro programa9
2.10 Executando seu primeiro programa10
2.1 O que aconteceu?10
2.12 E o bytecode?10
2.13 Exercícios: Modificando o Hello World1
2.14 O que pode dar errado?1
2.15 Um pouco mais12
2.16 Exercícios adicionais13

2 O que é Java 3 i

3.1 Declarando e usando variáveis14
3.2 Tipos primitivos e valores16
3.3 Exercícios: Variáveis e tipos primitivos17
3.4 Discussão em aula: convenções de código e código legível18
3.5 Casting e promoção18
3.6 O If-Else20
3.7 O While2
3.8 O For2
3.9 Controlando loops23
3.10 Escopo das variáveis24
3.1 Um bloco dentro do outro25
3.12 Um pouco mais25
3.13 Exercícios: Fixação de sintaxe26
3.14 Desafios: Fibonacci27

3 Variáveis primitivas e Controle de fluxo 14

4.1 Motivação: problemas do paradigma procedural28
4.2 Criando um tipo29
4.3 Uma classe em Java31
4.4 Criando e usando um objeto31
4.5 Métodos32
4.6 Métodos com retorno3
4.7 Objetos são acessados por referências35
4.8 O método transfere()37
4.9 Continuando com atributos39
4.10 Para saber mais: Uma Fábrica de Carros41
4.1 Um pouco mais43
4.12 Exercícios: Orientação a Objetos43
4.13 Desafios47
4.14 Fixando o conhecimento47

4 Orientação a objetos básica 28 i

5.1 O problema49
5.2 Arrays de referências50
5.3 Percorrendo uma array51
5.4 Percorrendo uma array no Java 5.052
5.5 Exercícios: Arrays52
5.6 Um pouco mais54
5.7 Desafios5
5.8 Testando o conhecimento5

5 Um pouco de arrays 49

6.1 Controlando o acesso56
6.2 Encapsulamento59
6.3 Getters e Setters61
6.4 Construtores62
6.5 A necessidade de um construtor64
6.6 Atributos de classe65
6.7 Um pouco mais67
6.8 Exercícios67
6.9 Desafios68

6 Modificadores de acesso e atributos de classe 56

7.1 Repetindo código?70
7.2 Reescrita de método73
7.3 Invocando o método reescrito74
7.4 Polimorfismo74
7.5 Um outro exemplo76
7.6 Um pouco mais7
7.7 Exercícios: Herança e Polimorfismo78
7.8 Dicussões em aula: Alternativas ao atributo protected82

7 Orientação a Objetos – herança, reescrita e polimorfismo 70 i

8.1 O Eclipse83
8.2 Apresentando o Eclipse83
8.3 Views e Perspective84
8.4 Criando um projeto novo86
8.5 Criando o main90
8.6 Rodando o main92
8.7 Pequenos truques93
8.8 Exercícios: Eclipse93
8.9 Discussão em aula: Refactorings95

8 Eclipse IDE 83

9.1 Repetindo mais código?96
9.2 Classe abstrata97
9.3 Métodos abstratos9
9.4 Aumentando o exemplo100
9.5 Para saber mais101
9.6 Exercícios: Classes Abstratas101
9.7 Desafios102

9 Orientação a Objetos – Classes Abstratas 96

10.1 Aumentando nosso exemplo103
10.2 Interfaces107
10.3 Dificuldade no aprendizado de interfaces110
10.4 Exemplo interessante: conexões com o banco de dados110
10.5 Um pouco mais1
10.6 Exercícios: Interfaces1
10.7 Exercícios avançados114
10.8 Discussão em aula: Favorecer composição em relação à herança115

10 Orientação a Objetos - Interfaces 103 iv

1.1 Motivação17
1.2 Exercício para começar com os conceitos18
1.3 Exceções de Runtime mais comuns123
1.4 Outro tipo de exceção: Checked Exceptions124
1.5 Um pouco da grande famíla Throwable127
1.6 Mais de um erro127
1.7 Lançando exceções128
1.8 O que colocar dentro do try?129
1.9 Criando seu próprio tipo de exceção130
1.10Para saber mais: finally132
1.1Um pouco mais132
1.12Exercícios: Exceções132
1.13Desafios134

1 Controlando os erros com Exceções 17

12.1 Organização135
12.2 Diretórios136
12.3 Import136
12.4 Acesso aos atributos, construtores e métodos138
12.5 Usando o Eclipse com pacotes139
12.6 Exercícios: Pacotes140

12 Pacotes - Organizando suas classes e bibliotecas 135

13.1 Arquivos, bibliotecas e versões141
13.2 Gerando o jar pelo Eclipse142
13.3 Javadoc146
13.4 Gerando o Javadoc147
13.5 Exercícios: Jar e Javadoc151

13 Ferramentas: jar e javadoc 141 v

14.1 Pacote java.lang152
14.2 Um pouco sobre a classe System152
14.3 java.lang.Object153
14.4 Casting de referências153
14.5 Métodos do java.lang.Object: equals e toString155
14.6 Integer e classes wrappers (box)157
14.7 Autoboxing no Java 5.0157
14.8 java.lang.String158
14.9 java.lang.Math160
14.10Exercícios: java.lang161
14.11Desafio162

14 O pacote java.lang 152

15.1 Conhecendo uma API164
15.2 Orientação a objeto164
15.3 InputStream, InputStreamReader e BufferedReader165
15.4 Lendo Strings do teclado167
15.5 A analogia na saída: OutputStream, OutputStreamWriter e BufferedWriter168
15.6 Uma maneira mais fácil: Scanner e PrintStream168
15.7 Um pouco mais169
15.8 Exercícios: Java I/O169
15.9 Discussão em aula: Design Patterns e o Template Method172

15 Pacote java.io 164

16.1 Arrays são trabalhosos, utilizar estrutura de dados174
16.2 Listas: java.util.List175
16.3 Listas no Java 5.0 com Generics178
16.4 Ordenação: Collections.sort179
16.5 Exercícios: Ordenação181
16.6 Conjunto: java.util.Set183
16.7 Principais interfaces: java.util.Collection185

16 Collections framework 174 vi

16.9 Para saber mais: Iterando sobre coleções com java.util.Iterator187
16.10Mapas - java.util.Map189
16.11Mapas no Java 5.0191
16.12Para saber mais: Properties191
16.13Para saber mais: Equals e HashCode191
16.14Para saber mais: Boas práticas192
16.15Exercícios: Collections192
16.16Desafios194
17.1 Threads195
17.2 Escalonador e trocas de contexto197
17.3 Garbage Collector199
17.4 Para saber mais: problemas com concorrência200
17.5 Para saber mais: Vector e Hashtable202
17.6 Um pouco mais203
17.7 Exercícios: Threads203
17.8 Desafios204

17 Programação Concorrente e Threads 195

18.1 Exercício prático205
18.2 Certificação205
18.3 Web205
18.4 Revistas205
18.5 Grupos de Usuários206
18.6 Falando em Java - Próximos módulos206
19.1 Bibliotecas e o Java207
19.2 Como usar uma biblioteca?207
19.3 Classpath208
19.4 JFreeChart209

19 Apêndice A - Utilizando bibliotecas e frameworks: O JFreeChart 207 vii

19.6 Utilizando o JFreeChart214
19.7 Aplicando as boas práticas de O216
19.8 Para saber mais: Design Patterns Factory Method e Builder218
19.9 Exercícios: JFreeChart218
19.10Exercícios adicionais220
19.11Desafio: Fluent Interface220
20.1 Motivação: uma API que usa os conceitos aprendidos2
20.2 Protocolo2
20.3 Porta223
20.4 Socket223
20.5 Servidor224
20.6 Cliente225
20.7 Imagem geral227
20.8 Exercícios: Sockets227
20.9 Desafio: Múltiplos Clientes229
20.10Desafio: broadcast das mensagens229
20.11Solução do sistema de chat230
21.1 Interfaces gráficas em Java234
21.2 Portabilidade234
21.3 Começando com Swing234
21.4 Nosso primeiro formulário235
21.5 Adicionando eventos237
21.6 Gerenciadores de Layout239
21.7 Look And Feel240
21.8 Para saber mais241

21 Apêndice C - Swing básico 234 viii

2.1 Import Estático242
2.2 final243
2.3 Calendar243
2.4 Date245
2.5 DateFormat245
2.6 Outras classes muito úteis245
2.7 Anotações246

2 Apêndice D - Outros conceitos e APIs importantes 242

23.1 Escolhendo a VM247
23.2 Instalando no Ubuntu e outros Linux247
23.3 No Mac OS X e Solaris247
23.4 Instalação do JDK em ambiente Windows248

23 Apêndice E - Instalação do Java 247

Índice Remissivo 253 Versão: 9.8.12

CAPÍTULO 1

Como Aprender Java

“Homens sábios fazem provérbios, tolos os repetem” – Samuel Palmer

1.1 - O que é realmente importante?

Muitos livros, ao passar dos capítulos, mencionam todos os detalhes da linguagem juntamente com seus princípios básicos. Isso acaba criando muita confusão, em especial pois o estudante não consegue distinguir exatamente o que é importante aprender e reter naquele momento daquilo que será necessário mais tempo e principalmente experiência para dominar.

Se uma classe abstrata deve ou não ter ao menos um método abstrato, se o if só a ceitar argumentos booleanos e todos os detalhes de classes internas realmente não devem ser preocupações para aquele que possui como objetivo primário aprender Java. Esse tipo de informação será adquirida com o tempo, e não é necessário até um segundo momento.

Neste curso, separamos essas informações em quadros especiais, já que são informações extras. Ou então, apenas citamos num exercício e deixamos para o leitor procurar informações se for de seu interesse.

Algumas informações não são mostradas e podem ser adquiridas em tutoriais ou guias de referência, são detalhes que para um programador experiente em Java pode ser importante, mas não para quem está começando.

Por fim falta mencionar sobre a prática, que deve ser tratada seriamente: todos os exercícios são muito importantes e os desafios podem ser feitos quando o curso acabar. De qualquer maneira recomendamos aos alunos estudar em casa, principalmente aqueles que fazem os cursos intensivos.

O curso

Para aqueles que estão fazendo o curso Java e Orientação a Objetos, é recomendado estudar em casa aquilo que foi visto durante a aula, tentando resolver os exercícios que não foram feitos e os desafios que estão lá para envolver mais o leitor no mundo de Java.

Convenções de Código

Para mais informações sobre as convenções de código-fonte Java, acesse: http://java.sun.com/ docs/codeconv/

Material do Treinamento Java e Orientação a Objetos

1.2 - Sobre os exercícios

Os exercícios do curso variam de práticos até pesquisas na Internet, ou mesmo consultas sobre assuntos avançados em determinados tópicos para incitar a curiosidade do aprendiz na tecnologia.

Existem também, em determinados capítulos, uma série de desafios. Eles focam mais no problema computacional que na linguagem, porém são uma excelente forma de treinar a sintaxe e, principalmente, familiarizar o aluno com a biblioteca padrão Java, além de proporcionar um ganho na velocidade de desenvolvimento.

1.3 - Tirando dúvidas

Para tirar dúvidas dos exercícios, ou de Java em geral, recomendamos o fórum do site do GUJ (http: //w.guj.com.br/), onde sua dúvida será respondida prontamente.

Se você já participa de um grupo de usuários java ou alguma lista de discussão, pode tirar suas dúvidas nos dois lugares.

Fora isso, sinta-se a vontade de entrar em contato conosco para tirar todas as suas dúvidas que tiver durante o curso.

1.4 - Bibliografia Bibliografia recomendada para iniciantes na plataforma Java

• Java - Como programar, de Harvey M. Deitel • Use a cabeça! - Java, de Bert Bates e Kathy Sierra

• (Avançado) Effective Java Programming Language Guide, de Josh Bloch

Capítulo 1 - Como Aprender Java - Sobre os exercícios - Página 2

CAPÍTULO 2

O que é Java

“Computadores são inúteis, eles apenas dão respostas” – Picasso

Chegou a hora de responder as perguntas mais básicas sobre Java. Ao término desse capítulo você será capaz de:

• responder o que é Java; • mostrar as vantagens e desvantagens do Java;

• compilar e executar um programa simples.

Muitos associam Java com uma maneira de deixar suas páginas da web mais bonitas, com efeitos especiais, ou para fazer pequenos formulários na web.

O que associa as empresas ao Java?

Já chegaremos neste ponto, mas antes vamos ver o motivo pelo qual as empresas fogem das outras linguagens.

Quais são os seus maiores problemas quando está programando?

• ponteiros? • gerenciamento de memória?

• organização?

• falta de bibliotecas?

• ter de reescrever parte do código ao mudar de sistema operacional?

• custo de usar a tecnologia?

Java tenta amenizar esses problemas. Alguns desses objetivos foram atingidos muito tempo atrás, porque, antes do Java 1.0, a idéia é que essa linguagem fosse usada em pequenos dispositivos, como tvs, videocassetes, aspiradores, liquidificadores e outros. Apesar disso a linguagem teve seu lançamento focado no uso em clientes web (browsers) para rodar pequenas aplicações (applets). Hoje em dia esse não é mais o foco da linguagem: apesar de ter sido idealizada com um propósito e lançada com outro, o Java ganhou destaque no lado do servidor.

Material do Treinamento Java e Orientação a Objetos

O Java é desenvolvido e mantido pela Sun http://www.sun.com e seu site principal é o http://java. sun.com. (java.com é um site mais institucional, voltado ao consumidor de produtos e usuários leigos, não desenvolvedores).

Breve história do Java

A Sun criou um time (conhecido como Green Team) para desenvolver inovações tecnológicas em 1992. Esse time foi liderado por James Gosling, considerado o pai do Java. O time voltou com a idéia de criar um interpretador (já era uma máquina virtual, veremos o que é isso mais a frente) para pequenos dispositivos, facilitando a reescrita de software para aparelhos eletrônicos, como vídeo cassete, televisão e aparelhos de tv a cabo. A idéia não deu certo. Tentaram fechar diversos contratos com grandes fabricantes de eletrônicos, como a Panasonic, mas não houve êxito devido ao conflito de interesses. Hoje sabemos que o Java domina o mercado de aplicações para celulares, porém parece que em 1994 ainda era muito cedo. Com o advento da web, a Sun percebeu que poderia utilizar a idéia criada em 1992 para possibilitar rodar pequenas aplicações dentro do browser. A semelhança era que na internet havia uma grande quantidade de sistemas operacionais e browsers, e com isso seria grande vantagem poder programar numa única linguagem, independente da plataforma. Foi aí que o Java 1.0 foi lançado: focado em transformar o browser de apenas um cliente burro para uma aplicação que possa também realizar operações, não apenas renderizar html. Sabemos que, hoje, os applets realmente não são o foco da Sun. É engraçado que a tecnologia Java nasceu com um objetivo em mente, foi lançado com outro, mas, no final, decolou mesmo no desenvolvimento de aplicações do lado do servidor. Sorte? Você pode ler a história da linguagem Java em: http://java.sun.com/java2/whatis/1996/ storyofjava.html

No Brasil, diversos grupos de usuários se juntaram para tentar disseminar o conhecimento da linguagem.

Um deles é o GUJ http://www.guj.com.br uma comunidade virtual com artigos, tutoriais e fórum para tirar dúvidas, o maior em língua portuguesa.

Encorajamos todos os alunos a usar muito os fóruns do mesmo, pois é uma das melhores maneiras para achar soluções para pequenos problemas que acontecem com grande freqüência.

2.2 - Máquina Virtual

Em uma linguagem de programação como C e Pascal, temos o seguinte quadro quando vamos compilar um programa.

O código fonte é compilado para uma plataforma e sistema operacional específicos. Muitas vezes, o próprio código fonte é desenvolvido visando uma única plataforma!

Esse código executável (binário) resultante será executado pelo sistema operacional e, por esse motivo, ele deve saber conversar com o sistema operacional em questão.

Capítulo 2 - O que é Java - Máquina Virtual - Página 4

Material do Treinamento Java e Orientação a Objetos

Isto é, temos um código executável para cada sistema operacional. É necessário compilar uma vez para Windows, outra para o Linux, etc...

Como foi dito anteriormente, na maioria das vezes, a sua aplicação se utiliza das bibliotecas do sistema operacional, como, por exemplo, a de interface gráfica para desenhar as ‘telinhas’. A biblioteca de interface gráfica do Windows é bem diferente das do Linux; resultado?

Você precisa reescrever o mesmo pedaço da aplicação para diferentes sistemas operacionais, já que eles não são compatíveis.

Já o Java, se utiliza do conceito de máquina virtual, onde existe, entre o sistema operacional e a aplicação, uma camada extra responsável por “traduzir” - mas não apenas isso - o que sua aplicação deseja fazer para as respectivas chamadas do sistema operacional onde ela está rodando no momento:

Dessa forma, a maneira com a qual você abre uma janela no Linux ou no Windows é a mesma: você ganha independência de sistema operacional. Ou, melhor ainda, independência de plataforma em geral: não é preciso se preocupar em qual sistema operacional sua aplicação está rodando, nem em que tipo de máquina, configurações etc.

Repare que uma máquina virtual é um conceito bem mais amplo que o de um interpretador. Como o próprio nome diz, uma máquina virtual é como um computador de mentira: tem tudo que um computador tem. Em outras palavras, ela é responsável por gerenciar memória e threads, a pilha de execução, etc.

Sua aplicação roda sem nenhum envolvimento com o sistema operacional! Sempre conversando apenas com a Java Virtual Machine (JVM).

Capítulo 2 - O que é Java - Máquina Virtual - Página 5

Material do Treinamento Java e Orientação a Objetos

Essa característica é interessante: como tudo passa pela JVM, ela pode tirar métricas, decidir onde é melhor alocar a memória, entre outros. Uma JVM isola totalmente a aplicação do sistema operacional. Se uma JVM termina abruptamente, só as aplicações que estavam rodando nela irão terminar: isso não afetará outras JVMs que estejam rodando no mesmo computador, nem afetará o sistema operacional.

Essa camada de isolamento também é interessante quando pensamos em um servidor que não pode se sujeitar a rodar código que possa interferir na boa execução de outras aplicações.

Para tudo isso precisamos de um “bytecode”. Bytecode é o termo dado ao código binário gerado pelo compilador Java (pois existem menos de 256 códigos de operação dessa linguagem, e cada “opcode” gasta um byte, dando origem ao nome bytecode). O compilador Java gera esse bytecode que, diferente das linguagens sem máquina virtual, vai servir para diferentes sistemas operacionais, já que ele vai ser “traduzido” pela máquina virtual.

Write once, run anywhere

Esse é um slogan que a Sun usa para o Java, já que você não precisa reescrever parte da sua aplicação toda vez que quiser mudar de sistema operacional. Muitas pessoas criticam ou criam piadas em cima desse slogan, por acharem que nem sempre uma aplicação Java pode rodar em duas plataformas diferentes sem problemas.

2.3 - Java lento? Hotspot e JIT

Hotspot é a tecnologia que a JVM utiliza para detectar pontos quentes da sua aplicação: código que é executado muito, provavelmente dentro de um ou mais loops. Quando a JVM julgar necessário, ela vai compilar aquele código para instruções nativas da plataforma, tendo em vista que isso vai provavelmente melhorar a performance da sua aplicação. Esse compilador é o JIT: Just inTime Compiler, o compilador que aparece “bem na hora” que você precisa.

Você pode pensar então: porque a JVM não compila tudo antes de executar a aplicação? É que teoricamente compilar dinamicamente, a medida do necessário, pode gerar uma performance melhor. O motivo é simples: imagine um .exe gerado pelo VisualBasic, pelo gcc ou pelo Delphi; ele é estático. Ele já foi otimizado baseado em heurísticas, o compilador pode ter tomado uma decisão não tão boa.

Já a JVM, por estar compilando dinamicamente durante a execução, pode perceber que um determinado código não está com performance adequada e otimizar mais um pouco aquele trecho, ou ainda mudar a estratégia de otimização. É por esse motivo que as JVMs mais recentes (como a do Mustang, Java 6), em alguns casos, chega a ganhar, em muitos casos, de códigos C compilados com o GCC 3.x, se rodados durante um certo tempo.

2.4 - Versões do Javae a confusão do Java2

Java 1.0 e 1.1 são as versões muito antigas do Java.

Com o Java 1.2 houve um aumento grande no tamanho da API, e foi nesse momento em que trocaram a nomenclatura de Java para Java2, com o objetivo de diminuir a confusão entre Java e Javascript. Mas lembre-se, não há versão do Java 2.0, o 2 foi incorporado ao nome: Java2 1.2.

(Parte 1 de 5)

Comentários