Java Orientação a Objeto

Java Orientação a Objeto

(Parte 1 de 5)

FJ-1 Java e Orientação a Objetos

A Caelum atua no mercado com consultoria, desenvolvimento e ensino em computação. Sua equipe participou do desenvolvimento de projetos em vários clientes e, após apresentar os cursos de verão de Java na Universidade de São Paulo, passou a oferecer treinamentos para o mercado. Toda a equipe tem uma forte presença na comunidade através de eventos, artigos em diversas revistas, participação em muitos projetos open source como o VRaptor e o Stella e atuação nos fóruns e listas de discussão como o GUJ.

Com uma equipe de mais de 60 profissionais altamente qualificados e de destaque do mercado, oferece treinamentos em Java, Ruby on Rails e Scrum em suas três unidades - São Paulo, Rio de Janeiro e Brasília. Mais de 8 mil alunos já buscaram qualificação nos treinamentos da Caelum tanto em nas unidades como nas próprias empresas com os cursos incompany.

O compromisso da Caelum é oferecer um treinamento de qualidade, com material constantemente atualizado, uma metodologia de ensino cuidadosamente desenvolvida e instrutores capacitados tecnicamente e didaticamente. E oferecer ainda serviços de consultoria ágil, mentoring e desenvolvimento de projetos sob medida para empresas.

Comunidade

Nossa equipe escreve constantemente artigos no Blog da Caelum que já conta com 150 artigos sobre vários assuntos de Java, Rails e computação em geral. Visite-nos e assine nosso RSS:

➡ blog.caelum.com.br

Acompanhe também a equipe Caelum no Twitter:

➡ twitter.com/caelumdev/equipe

O GUJ é maior fórum de Java em língua portuguesa, com 700 mil posts e 70 mil usuários. As pessoas da Caelum participam ativamente, participe também:

➡ w.guj.com.br

Assine também nossa Newsletter para receber as novidades e destaques dos eventos, artigos e promoções da Caelum:

➡ w.caelum.com.br/newsletter

No site da Caelum há algumas de nossas Apostilas disponíveis gratuitamente para download e alguns dos artigos de destaque que escrevemos:

➡ w.caelum.com.br/apostilas

➡ w.caelum.com.br/artigos

Conheça alguns de nossos cursos

FJ-1:

Java e Orientação a objetos

FJ-26:

Laboratório Web com JSF2 e CDI

FJ-16:

Laboratório Java com Testes, XML e Design Patterns

FJ-19:

Preparatório para Certificação de Programador Java

FJ-21:

Java para Desenvolvimento Web

FJ-31:

Java E avançado e Web Services

FJ-91:

Arquitetura e Design de Projetos Java

R-71:

Desenvolvimento Ágil para Web 2.0 com Ruby on Rails

R-75:

Ruby e Rails avançados: lidando com problemas do dia a dia

✓ Mais de 8000 alunos treinados;

✓ Reconhecida nacionalmente;

✓ Conteúdos atualizados para o mercado e para sua carreira;

✓ Aulas com metodologia e didática cuidadosamente preparadas;

✓ Ativa participação nas comunidades Java, Rails e Scrum;

✓ Salas de aula bem equipadas;

✓ Instrutores qualificados e experientes;

✓ Apostilas disponíveis no site.

Para mais informações e outros cursos, visite: caelum.com.br/cursos

FJ-25:

Persistência com JPA2 e Hibernate

Sobre esta apostila

Esta apostila da Caelum visa ensinar 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. Todos os comentários, críticas e sugestões serão muito bem-vindos.

Essa apostila é constantemente atualizada e disponibilizada no site da Caelum. Sempre consulte o site para novas versões e, ao invés de anexar o PDF para enviar a um amigo, indique o site para que ele possa sempre baixar as últimas versões. Você pode conferir o código de versão da apostila logo no final do índice.

Baixe sempre a versão mais nova em: w.caelum.com.br/apostilas

Esse material é parte integrante do treinamento Java e Orientação a Objetos e distribuído gratuitamente exclusivamente pelo site da Caelum. Todos os direitos são reservados à Caelum. A distribuição, cópia, revenda e utilização para ministrar treinamentos são absolutamente vedadas. Para uso comercial deste material, por favor, consulte a Caelum previamente.

w.caelum.com.br

Índice

1.1 O que é realmente importante?1
1.2 Sobre os exercícios1
1.3 Tirando dúvidas1
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 Java e a confusão do Java26
2.5 JVM? JRE? JDK? O que devo baixar?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 Para saber mais: como é o bytecode?1
2.13 Exercícios: Modificando o Hello World1
2.14 O que pode dar errado?12
2.15 Um pouco mais13
2.16 Exercícios adicionais13

2 O que é Java 3 i

3.1 Declarando e usando variáveis14
3.2 Tipos primitivos e valores17
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 Para saber 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 retorno34
4.7 Objetos são acessados por referências35
4.8 O método transfere()38
4.9 Continuando com atributos39
4.10 Para saber mais: Uma Fábrica de Carros42
4.1 Um pouco mais43
4.12 Exercícios: Orientação a Objetos4
4.13 Desafios48
4.14 Fixando o conhecimento48

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: Arrays53
5.6 Um pouco mais5
5.7 Desafios56
5.8 Testando o conhecimento57

5 Um pouco de arrays 49

6.1 Controlando o acesso58
6.2 Encapsulamento61
6.3 Getters e Setters63
6.4 Construtores65
6.5 A necessidade de um construtor6
6.6 Atributos de classe68
6.7 Um pouco mais69
6.8 Exercícios: Encapsulamento, construtores e static70
6.9 Desafios71

6 Modificadores de acesso e atributos de classe 58

7.1 Repetindo código?73
7.2 Reescrita de método76
7.3 Invocando o método reescrito7
7.4 Polimorfismo78
7.5 Um outro exemplo80
7.6 Um pouco mais81
7.7 Exercícios: Herança e Polimorfismo82
7.8 Discussões em aula: Alternativas ao atributo protected86

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

8.1 O Eclipse87
8.2 Apresentando o Eclipse87
8.3 Views e Perspective8
8.4 Criando um projeto novo90
8.5 Criando o main94
8.6 Rodando o main96
8.7 Pequenos truques97
8.8 Exercícios: Eclipse98
8.9 Discussão em aula: Refactoring100

8 Eclipse IDE 87

9.1 Repetindo mais código?101
9.2 Classe abstrata102
9.3 Métodos abstratos104
9.4 Aumentando o exemplo105
9.5 Para saber mais106
9.6 Exercícios: Classes Abstratas106
9.7 Desafios107

9 Orientação a Objetos – Classes Abstratas 101

10.1 Aumentando nosso exemplo108
10.2 Interfaces112
10.3 Dificuldade no aprendizado de interfaces115
10.4 Exemplo interessante: conexões com o banco de dados115
10.5 Um pouco mais116
10.6 Exercícios: Interfaces116
10.7 Exercícios avançados opcionais120
10.8 Discussão em aula: Favorecer composição em relação à herança121

10 Orientação a Objetos - Interfaces 108 iv

1.1 Motivação122
1.2 Exercício para começar com os conceitos124
1.3 Exceções de Runtime mais comuns128
1.4 Outro tipo de exceção: Checked Exceptions129
1.5 Um pouco da grande famíla Throwable132
1.6 Mais de um erro132
1.7 Lançando exceções133
1.8 O que colocar dentro do try?134
1.9 Criando seu próprio tipo de exceção136
1.10Para saber mais: finally137
1.1Exercícios: Exceções137
1.12Desafios139
1.13Discussão em aula: catch e throws em Exception139

1 Controlando os erros com Exceções 122

12.1 Organização141
12.2 Diretórios142
12.3 Import142
12.4 Acesso aos atributos, construtores e métodos144
12.5 Usando o Eclipse com pacotes145
12.6 Exercícios: Pacotes146

12 Pacotes - Organizando suas classes e bibliotecas 141

13.1 Arquivos, bibliotecas e versões148
13.2 Gerando o JAR pelo Eclipse149
13.3 Javadoc153
13.4 Gerando o Javadoc154
13.5 Exercícios: Jar e Javadoc158

13 Ferramentas: jar e javadoc 148 v

14.1 Pacote java.lang160
14.2 Um pouco sobre a classe System160
14.3 java.lang.Object161
14.4 Casting de referências162
14.5 Métodos do java.lang.Object: equals e toString163
14.6 Integer e classes wrappers (box)165
14.7 Autoboxing no Java 5.0166
14.8 java.lang.String167
14.9 java.lang.Math169
14.10Exercícios: java.lang170
14.11Desafio173
14.12Discussão em aula: O que você precisa fazer em Java?173

14 O pacote java.lang 160

15.1 Conhecendo uma API174
15.2 Orientação a objetos no java.io174
15.3 InputStream, InputStreamReader e BufferedReader175
15.4 Lendo Strings do teclado177
15.5 A analogia para a escrita: OutputStream178
15.6 Uma maneira mais fácil: Scanner e PrintStream178
15.7 Um pouco mais179
15.8 Exercícios: Java I/O179
15.9 Discussão em aula: Design Patterns e o Template Method183

15 Pacote java.io 174

16.1 Arrays são trabalhosos, utilizar estrutura de dados185
16.2 Listas: java.util.List186
16.3 Listas no Java 5.0 com Generics189
16.4 A importância das interfaces nas coleções189
16.5 Ordenação: Collections.sort190
16.6 Exercícios: Ordenação193
16.7 Conjunto: java.util.Set196

16 Collections framework 185 vi

16.9 Percorrendo coleções no Java 5198
16.10Para saber mais: Iterando sobre coleções com java.util.Iterator199
16.11Mapas - java.util.Map200
16.12Para saber mais: Properties202
16.13Para saber mais: Equals e HashCode203
16.14Para saber mais: Boas práticas203
16.15Exercícios: Collections204
16.16Desafios206
17.1 Threads207
17.2 Escalonador e trocas de contexto209
17.3 Garbage Collector211
17.4 Para saber mais: problemas com concorrência212
17.5 Para saber mais: Vector e Hashtable214
17.6 Um pouco mais215
17.7 Exercícios215
17.8 Exercícios avançados de programação concorrente e locks216

17 Programação Concorrente e Threads 207

18.1 Praticando Java e usando bibliotecas218
18.2 Web218
18.3 Certificação218
18.4 Revistas219
18.5 Grupos de Usuários219
18.6 Falando em Java - Próximos módulos219
19.1 Motivação: uma API que usa os conceitos aprendidos220
19.2 Protocolo220
19.3 Porta221
19.4 Socket221

19 Apêndice - Sockets 220 vii

19.6 Cliente223
19.7 Imagem geral225
19.8 Exercícios: Sockets225
19.9 Desafio: Múltiplos Clientes227
19.10Desafio: broadcast das mensagens227
19.11Solução do sistema de chat229
20.1 Escolhendo a VM232
20.2 Instalando no Ubuntu e outros Linux232
20.3 No Mac OS X e Solaris232
20.4 Instalação do JDK em ambiente Windows233
21.1 O que é debugar238
21.2 Debugando no Eclipse238
21.3 Perspectiva de debug240
21.4 Debug avançado244
21.5 Profiling251
21.6 Profiling no Eclipse251

21 Apêndice - Debugging 238 Versão: 13.5.14 viii

CAPÍTULO 1

Como Aprender Java

“Busco um instante feliz que justifique minha existência” – Fiodór Dostoievski

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 porque o estudante não consegue distinguir exatamente o que é primordial aprender no início daquilo que pode ser estudado mais a frente.

Se uma classe abstrata deve ou não ter ao menos um método abstrato, se o if só aceita 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 no início.

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.

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, e praticar bastante código e variações.

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 opcionais e os desafios apresentados.

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 GUJ http://www.guj com.br/), onde sua dúvida será respondida prontamente. O GUJ foi fundado por desenvolvedores da Caelum, e hoje conta com mais de um milhão de mensagens.

Material do Treinamento Java e Orientação a Objetos

Fora isso, sinta-se a vontade de entrar em contato com seu instrutor para tirar todas as suas dúvidas que aparecerem 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 - 2nd edition, de Joshua Bloch

Capítulo 1 - Como Aprender Java - Bibliografia - 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;

• entender bem o conceito de máquina virtual;

• compilar e executar um programa simples.

Entender um pouco da história da plataforma Java é essencial para enxergar os motivos que a levaram ao sucesso.

Quais eram os seus maiores problemas quando programava na década de 1990?

• ponteiros? • gerenciamento de memória?

• organização?

• falta de bibliotecas?

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

• custo financeiro de usar a tecnologia?

A linguagem Java resolve bem esses problemas, que até então apareciam com frequência nas outras linguagens. Alguns desses problemas foram particularmente atacados porque uma das grandes motivações para a criação da plataforma Java era de que essa linguagem fosse usada em pequenos dispositivos, como tvs, video-cassetes, 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 é o grande mercado do Java: apesar de ter sido idealizado com um propósito e lançado com outro, o Java ganhou destaque no lado do servidor.

O Java é desenvolvido e mantido pela Sun http://www.sun.com através de um comitê http://www.jcp org) 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). Com a compra da Sun pela Oracle em 2009, muitas URLs e nomes tem sido trocados para refletir a marca da Oracle.

Material do Treinamento Java e Orientação a Objetos

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 Panasonic, mas não houve êxito devido ao conflito de interesses e custos. Hoje, sabemos que o Java domina o mercado de aplicações para celulares com mais de 2.5 bilhões de dispositivos compatíveis, porém em 1994 ainda era muito cedo para isso. Com o advento da web, a Sun percebeu que poderia utilizar a idéia criada em 1992 para 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 fino (thin client ou terminal burro) para uma aplicação que possa também realizar operações, não apenas renderizar html. Atualmente os applets realmente não são o foco da Sun. É curioso notar 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://www.java.com/en/javahistory/ E um vídeo interessante: http://tinyurl.com/histjava Em 2009 a Oracle comprou a Sun, fortalecendo a marca. A Oracle sempre foi, junto com a IBM, uma das empresas que mais investiram e fizeram negócios através do uso da plataforma Java.

No Brasil, diversos grupos de usuários se formaram 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 com mais de cem mil usuários e 1 milhão de mensagens.

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 a seguinte situação quando vamos compilar um programa:

O código fonte é compilado para código de máquina específico de uma plataforma e sistema operacional. 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, e assim por diante, caso a gente queira que esse nosso software possa ser utilizado em várias plataformas. Esse é o caso de aplicativos como o OpenOffice, Firefox e outros.

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 “telas”. A biblioteca de interface gráfica do Windows é bem diferente das do Linux: como criar então uma aplicação que rode de forma parecida nos dois sistemas operacionais?

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

Já o Java 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, 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.

Essa camada, a máquina virtual, não entende código java, ela entende um código de máquina específico.

Esse código de máquina é gerado por um compilador java, como o javac, e é conhecido por “bytecode”, pois existem menos de 256 códigos de operação dessa linguagem, e cada “opcode” gasta um byte. 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 JVM.

(Parte 1 de 5)

Comentários