(Parte 1 de 4)

Java Fundamentals Java Fundamentals

Java Fundamentals

SumárioSumárioSumárioSumário
1.1.1.1. A tecnologia Java e configuração do ambieA tecnologia Java e configuração do ambieA tecnologia Java e configuração do ambieA tecnologia Java e configuração do ambientententente1----1
Objetivos1-2
O que é Java?1-3
Simples e orientada a objetos1-5
Uma linguagem robusta1-7
Multiplataforma e interpretada1-9
A Java Virtual Machine - JVM1-1
Uma Linguagem Segura e Dinâmica1-14
Aspectos de segurança1-16
O Just in Time Compiler - JIT1-18
O Java Standard Development Kit – J2SDK1-19
Configurando o ambiente1-2
API’s da linguagem1-23
2.2.2.2. Tipos e OTipos e OTipos e OTipos e Operadoresperadoresperadoresperadores2----1
Objetivos2-2
Variáveis2-3
Tipos primitivos e tipos compostos2-4
Tipos Primitivos2-6
Declarando um tipo primitivo2-10
Tipo caracter – char2-12
Tipo booleano – boolean2-14
Tipos inteiros - byte, short, int e long2-15
Tipos de ponto flutuante - float e double2-17
Tipo composto – String2-19
Conversões de tipos – casting2-20
Tipos de referência2-2
Expressões e operadores2-23
Sumário de operadores2-25
Precedência2-27
Associatividade2-28
Tipos de operadores: unários e binários2-29
3.3.3.3. Criando classes e objetosCriando classes e objetosCriando classes e objetosCriando classes e objetos3----1
Objetivos3-2
Classes e Objetos3-3
Criando uma classe3-4

Java Fundamentals

Criando e importando pacotes3-9
Static import3-1
Criando objetos3-12
O que é a referência null?3-13
Atribuindo referências3-15
Visibilidade aplicada a classes3-16
Definindo operações3-18
Comando return3-21
Visibilidade para operações3-2
Definindo atributos3-25
Visibilidade aplicada a atributos3-26
Acessando atributos3-32
Comentários no código fonte3-3
Escopo das variáveis3-36
Passando Tipos Primitivos para Métodos3-39
Passando Referências para Métodos3-40
Exercícios3-42
4.4.4.4. Comandos da LinguagemComandos da LinguagemComandos da LinguagemComandos da Linguagem4----1
Objetivos4-2
Comandos4-3
Comando if / else / else if4-4
Seqüência de Cláusulas else if4-7
Operador ternário4-9
Comando switch4-10
Comando while4-13
Comando do4-14
Comando for4-15
Comando “for-each”4-18
Comando break4-19
Comando continue4-21
Exercícios4-24
5.5.5.5. Aprofundando o estudo sobre ClassesAprofundando o estudo sobre ClassesAprofundando o estudo sobre ClassesAprofundando o estudo sobre Classes5----1
Objetivos5-2
Visão Geral5-3
Overloading – sobrecarga de operação5-4
Métodos construtores5-6
Referência this5-9
Compartilhando código entre Construtores5-1
Método destrutor – finalize()5-12
Variáveis de instância5-13
Métodos de instância5-15
Variáveis de classe5-16
Inicializando Variáveis de Classe5-19

Java Fundamentals

Exemplos de variáveis e métodos estáticos5-2
O mecanismo de herança entre classes5-23
Herdando estrutura e comportamento5-24
Especificando herança em Java5-25
Objetos de subclasses5-26
Chamando construtores da superclasse5-27
Overloading e Overriding de métodos5-29
Redefinindo métodos – overriding5-30
Referência super5-3
Invocando métodos da superclasse5-35
Visibilidade protected5-36
Varargs5-37
Polimorfismo5-39
Modificador final5-41
Enums5-43
Exercícios5-46
6.6.6.6. Coleções, Arrays, Strings, e Wrapper ClassesColeções, Arrays, Strings, e Wrapper ClassesColeções, Arrays, Strings, e Wrapper ClassesColeções, Arrays, Strings, e Wrapper Classes6----1
Objetivos6-2
Strings6-3
Criando Strings6-4
Concatenando Strings6-5
Executando operações em objetos String6-6
Comparando duas Strings6-8
Obtendo strings a partir de objetos6-9
Convertendo tipos primitivos em strings6-10
Wrapper Classes6-1
Conversões com Wrapper Classes6-12
StringBuffer e StringBuilder6-13
Arrays6-14
Arrays de tipos primitivos6-15
Declarando arrays de tipos primitivos6-16
Criando arrays6-17
Inicializando arrays6-18
Arrays de objetos6-20
Declarando arrays de objetos6-21
Inicializando arrays de objetos6-2
Utilizando arrays de objetos6-23
Arrays e Exceções6-24
Arrays multidimensionais6-25
O método main(String[] args)6-26
API Colletion6-27
A interface Iterator6-28
A interface Enumeration6-29
Interfaces do framework6-30
A classe ArrayList6-31

Java Fundamentals

A classe Hashtable6-34
A classe LinkedList6-35
Generics6-36
Autoboxing6-39
Exercícios6-43
7.7.7.7. Tratamento de ExceçõesTratamento de ExceçõesTratamento de ExceçõesTratamento de Exceções7----1
Objetivos7-2
Introdução7-3
1a Vantagem: Separação de Código7-4
2a Vantagem: Propagação de Erros7-6
3a Vantagem: Agrupar Tipos de Erros7-8
4a Vantagem: Exceções não são Ignoradas7-10
Manipulando Exceções7-1
Tratando Exceções7-13
Manipulando Exceções7-14
Manipulando Exceções: Exemplo Prático7-16
Propagando Exceções7-17
Lançando Exceções7-18
Criando Exceções7-19
Capturando Exceções e Levantando Exceções Diferentes7-20
Exercícios7-2
8.8.8.8. Classes abstratas e InterfacesClasses abstratas e InterfacesClasses abstratas e InterfacesClasses abstratas e Interfaces8----1
Objetivos8-2
Abstração8-3
Definindo classes abstratas8-4
Métodos Abstratos8-6
Definindo métodos abstratos8-7
Interfaces8-8
Exemplos de interfaces8-9
Definindo Interfaces8-10
Implementando Interfaces8-1

Java Fundamentals

1A tecnologia Java e

1-1 configuração do ambiente

A tecnologia java e configuração do ambiente

Objetivos

• Compreender os fundamentos da tecnologia Java • Discutir vantagens da tecnologia

• Entender o funcionamento da JVM (Java Virtual Machine)

• Configurar o ambiente de desenvolvimento para o programador

A tecnologia java e configuração do ambiente

O que é Java?

• Linguagem orientada a objetos, simples, portável, interpretada, distribuída, robusta, segura, dinâmica, de alto desempenho, multi-thread e independente de plataforma

• Projetada pela Sun Microsystems inicialmente para dispositivos eletrônicos

• Utilizada posteriormente em navegadores web, para permitir que uma aplicação pudesse ser desenvolvida e “executada na web”. Aqui é o nascimento da tecnologia applet

• Uma linguagem muito utilizada atualmente para desenvolvimento de sistemas que precisam rodar na web bem como sistemas desktop

Breve Histórico

Java começou em 1991, quando um grupo de analistas da Sun, liderados por Patrick Naughton e James Gosling, procurou desenvolver uma linguagem de computador que fosse usada em equipamentos domésticos, tais como comutadores de canais para TV a cabo, videocassetes e outros.

Como estes equipamentos não dispõem de muita memória ou velocidade, a linguagem tinha de ser reduzida e gerar código eficiente. Além disto, como diferentes fabricantes poderiam escolher diferentes CPUs, tal linguagem não poderia se restringir a uma única arquitetura.

O projeto ficou conhecido como Green Project.

DUKE, um dos símbolos do Java

Visando satisfazer todas estas exigências, a equipe de analistas optou por uma linguagem que gerasse código intermediário (os famosos bytecodes Java), e que a interpretação deste código não fosse feita diretamente pelo hardware e sim por uma máquina virtual disposta sobre ele (conhecida hoje como JVM – Java Virtual Machine).

Esta linguagem foi batizada inicialmente com o nome Oak (que, em português significa carvalho). Possivelmente o nome escolhido por Gosling se deve a um carvalho que existia em frente a sua janela na Sun MicroSystems.

A tecnologia java e configuração do ambiente

Posteriormente se descobriu que Oak já era o nome de uma outra linguagem, e o nome foi então trocado para Java.

Java não obteve muito sucesso como linguagem de controle de eletrodomésticos (e isto nós podemos muito bem atestar :-). Em vão, a equipe do Green Project tentou vender a idéia para fabricantes de tais dispositivos. Dissolvida a equipe, por absoluta falta de êxito econômico, alguns dos antigos componentes perceberam que uma das possíveis utilidades para tal linguagem seria embuti-la em navegadores, como os encontrados no mercado.

Tais aplicativos exigiam justamente uma linguagem independente de plataforma, confiável, segura e em tempo real: todas as características “estranhas” que Java possuía.

A tecnologia java e configuração do ambiente

Simples e orientada a objetos

• Uma linguagem simples e orientada a objetos • Baseada em Smalltalk e C++

• A tecnologia de objetos para esta linguagem foi baseada em Smalltalk

• Reaproveitou grande parte da sintaxe utilizada pelo C e C++

• Eliminou construções de C++ consideradas complexas ou desnecessárias

• Reduzido conjunto de palavras reservadas e um grande poder de expressão

Uma Linguagem Orientada a Objetos

Problemas surgidos na área de engenharia de software, tais como aumento explosivo da complexidade dos sistemas, dificuldades na manutenção e evolução dos softwares existentes, fraca robustez apresentada pelos aplicativos e outros, fizeram com que os paradigmas de análise e desenvolvimento de software fossem alterados.

Java surge junto com o “boom” da orientação por objetos, à ampla aceitação deste paradigma pelos técnicos de informática como o mais adequado a enfrentar os problemas encontrados.

A cultura dos técnicos da equipe de desenvolvimento da Sun Microsystems fez com que, entre as linguagens orientadas por objetos conhecidas, escolhessem C++ como modelo para o desenvolvimento de Java. C++ era então uma das mais difundidas linguagens de programação orientada por objetos em voga no mundo UNIX.

Mas C++ era complexa demais. Várias construções em C++ eram de questionável utilidade e de difícil implementação por parte dos construtores de compiladores.

Herança múltipla e sobrecarga de operadores, por exemplo, eram construções que demandavam grande esforço por parte dos implementadores e que não fazem parte do núcleo mínimo exigido pelo paradigma. Desta forma alguns recursos ficaram de fora e decidiu-se manter inicialmente uma gama menor de recursos para viabilizar o projeto e manter o mesmo mais somples. Atualmente alguns recuros mais sofisticados como “Generics” foram incluídos. Os recursos básicos que foram atendidos na época são:

• Abstração

A tecnologia java e configuração do ambiente

• Encapsulamento • Herança

• Polimorfismo Decidiram então simplificar:

• A linguagem não seria compilada para uma plataforma nativa e sim para uma máquina virtual. Esta técnica que dá ao java a possibilidade de rodar em múltiplas plataformas foi baseada no Smalltalk

• Não haveria programação genérica (na época, mas a partir da versão 1.5 este recurso já é suportado)

• Não haveria sobrecarga de operadores

• Herança múltipla seria substituída pelo mecanismo de interfaces, mais simples e com poder de expressão equivalente

• A velha sintaxe, tomada de empréstimo da linguagem C, seria enxugada, de modo a conter somente as palavras reservadas necessárias

Destas idéias iniciais surge então a tecnologia Java. Claro que há muito mais coisas presentes no java do que as listadas acima. Atualmente o java é uma tecnologia tão completa que permite você desenvolver aplicações para rodar na Web, em máquinas cliente, Celulares, Palm Tops e muito mais.

A tecnologia java e configuração do ambiente

Uma linguagem robusta

• Java é uma linguagem fortemente tipada

• Ampla verificação de erros e checagem de tipos em tempo de compilação

• Não existem apontadores na linguagem

• Linguagem multiplataforma

• Gerência automática da memória (garbage collection)

Erro de Ponteiro?

Um dos principais objetivos dos projetistas da linguagem era conseguir conciliar a flexibilidade e o poder da orientação por objetos com a segurança e a robustez da checagem de tipos e erros em tempo de compilação.

Java é uma linguagem fortemente tipada. E o que queremos dizer com isto?

Que, em tempo de compilação, são checados todos os problemas referentes à passagem de parâmetros e atribuições de variáveis no que diz respeito à compatibilidade de tipos entre a variável que recebe o valor e a variável atribuída.

Outra importante característica da linguagem Java é fato de não possuir apontadores, com o sentido que tal termo possui em C ou em C++.

Em C ou C++ é perfeitamente possível navegarmos despreocupadamente pela memória do processo: basta, para tal, declararmos um apontador para uma região de memória e sairmos a incrementá-lo ou decrementá-lo.

Toda a aritmética com apontadores não só é permitida pela linguagem, como também incentivada.

Em Java não há apontadores explícitos, nem tampouco aritmética de apontadores, mas sim referências feitas a objetos criados.

Objetos são criados através do operador new e o espaço de memória que ocupam é automaticamente gerenciado por um sistema de coleta de lixo (garbage collection) , que o libera tão logo não haja mais referências a um objeto.

A tecnologia java e configuração do ambiente

Com isto, não existem em Java os erros de ponteiro (dangling pointers, memory leak e outros) tão conhecidos de linguagens como C e C++.

A tecnologia java e configuração do ambiente

Multiplataforma e interpretada

Ao contrário das outras tecnologias onde os programas são compilados para um sistema operacional específico, os fontes Java são compilados para uma máquina virtual. Isto significa que após a compilação os mesmos, são executados por uma máquina virtual (JVM) e não diretamente pelo sistema operacional. Abaixo veja a forma tradicional de compilação dos programas e mais abaixo a forma como funciona o Java.

Figura 1-1: Compilação em C++.

Em linguagens tradicionais como C, C++ ou pascal, o código fonte é convertido para um conjunto de instruções de máquina da plataforma de hardware onde a compilação teve lugar. Este programa é executado diretamente pela CPU da máquina e está vinculado à plataforma em que foi compilado: só poderá ser executado por CPUs que compartilhem o mesmo conjunto de instruções, o que geralmente significa ficar limitado a um determinado fabricante de hardware ou a uma família de produtos.

Figura 1-2: Compilação em Java.

A tecnologia java e configuração do ambiente

Java adota uma filosofia diferente. Os fontes Java não são convertidos diretamente para instruções de máquina. Ao contrário, a partir da compilação dos fontes são gerados arquivos contendo código intermediário que independe de plataforma.

O código intermediário Java, conhecido como “bytecode” Java, foi projetado para uma máquina hipotética. Contém instruções similares a de uma máquina real (operações aritméticas, controle de fluxo, etc.), mas não tem em vista, e nem se limita, a uma determinada arquitetura de computador.

Em vez de ser executado diretamente pelo hardware, este código é interpretado por uma JVM (Máquina Virtual Java Java Virtual Machine). Desta forma, em qualquer arquitetura onde exista uma JVM será possível executar um programa Java sem a necessidade de se re-compilar os fontes.

Os binários Java (código intermediário ou Java bytecode) são independentes de plataforma ou, dito de outra maneira, neutros quanto à arquitetura da máquina.

Os fontes Java são armazenados em arquivos com a extensão .java. A compilação dos arquivos .java trará como resultado arquivos com a extensão .class.

Arquivos com a extensão .class contém somente Java bytecodes e são também conhecidos como binários Java. Cabe novamente ressaltar que os binários Java (arquivos .class) não são executados diretamente pelo hardware e sim interpretados pela JVM.

Sem a JVM não há como executar nenhum programa Java.

A tecnologia java e configuração do ambiente

A Java Virtual Machine - JVM

• Camada intermediária e isolante entre o sistema operacional e as aplicações Java.

• Elimina a dependência do código quanto à arquitetura e quanto às facilidades do SO.

• Responsável pela interpretação dos bytecodes Java.

• Traduz os bytecodes em instruções de máquina e em chamadas de sistema (API do SO).

• Pode ser implementada através de um programa avulso ou estar embutida em um navegador (Browser).

A máquina virtual Java (ou, como é comumente chamada, JVM, Java

Virtual Machine) integra o ambiente de programação e execução Java. Ela é responsável por interpretar os bytecodes Java e traduzi-los em instruções reais de máquina e em chamadas de sistema (syscalls).

Figura 1-3: Esquema de independência da JVM.

Desta forma, as requisições feitas por um programa Java a recursos do sistema são mapeadas pela JVM em requisições feita ao SO sobre o qual a JVM executa. O SO responde a tais requisições e estas respostas são encaminhadas ao código Java em execução.

Uma vez compilado um programa Java, os binários (bytecodes Java) podem ser executados em toda a plataforma para a qual já a JVM já tenha sido portada. Atualmente, a grande maioria dos sistemas operacionais conhecidos possui uma implementação da JVM (Solaris, Windows98, WindowsNT, Linux, MacOS, HP-UX, AIX, etc.).

A tecnologia java e configuração do ambiente

A JVM pode ser implementada através de um programa avulso, pode estar embutida em um navegador, fazer parte do núcleo de um banco de dados, ou mesmo integrar o kernel de um SO.

A única exigência que se faz à execução de um aplicativo Java é a existência da JVM para aquele ambiente.

Como executam os programas java

A linguagem Java é orientada a objetos, com linhas de execução (threads) dinâmicas e muitos outros recursos. Mas o que faz a diferença é o modo como os programas Java são executados. Eles rodam dentro de máquinas virtuais (virtual machines), que ficam dentro do computador. Por isso, um programa Java não tem contato com o computador real, ele conhece apenas a máquina virtual. Logo, os programas Java são independentes de plataforma. Se você já precisou desenvolver programas para vários sistemas operacionais, sabe que isso é uma grande vantagem.

Quando você escreve um programa Java e o compila, ele está pronto para ser executado em qualquer PC que contenha a máquina virtual Java. De certa forma, você está escrevendo para apenas uma plataforma: a máquina virtual.

A virtual machine determina o que os programas Java podem ou não fazer.

Os programas escritos em linguagens compiladas, como C ou C++, são executados diretamente pelo sistema operacional. Assim sendo, eles têm acesso direto a todos os recursos do sistema, incluindo memória e sistema de arquivos. Como os programas Java são executados de dentro da máquina virtual, as pessoas (programadores e desenvolvedores) que criam a máquina virtual podem decidir o que um programa pode ou não fazer no computador. O ambiente criado para os programas Java chama-se ambiente de runtime. A máquina virtual age como um firewall (barreira) entre o computador e o programa Java. Um programa nunca acessa os dispositivos de entrada e saída, o sistema de arquivos ou mesmo a memória do seu computador. Em vez disso, ele pede que a máquina virtual faça isso.

Quando rodamos as applets, elas são descarregadas para uma máquina virtual que proíbe o acesso ao sistema de arquivos. Assim, ela só permite acesso indireto aos recursos do sistema.

Por ser uma linguagem interpretada, isso explica a independência de plataforma Java.

A tecnologia java e configuração do ambiente

Por que interpretada?

Porque o compilador Java gera o bytecode (código especial Java), que será executado por uma máquina virtual implementada em software, chamada de JVM – Java Virtual Machine (Máquina Virtual Java).

A diferença entre o Java que é uma linguagem interpretada, comparada com uma linguagem compilada, como o caso do C ou C++ é que enquanto nessas linguagens tradicionais, para cada plataforma precisamos que o compilador gere um código especifico, como por exemplo, para um PC. Se quisermos que o mesmo programa rode em um Macintosh, precisaremos compilá-lo para rodar em Macintosh e assim por diante. Já com o Java isso não aconteceria, pois para rodarmos um programa feito em Java, usamos o interpretador Java (contido na JVM) para executar o bytecode resultante da compilação. Como o bytecode Java é independente de plataforma, os programas Java podem rodar em qualquer plataforma para a qual a JVM tenha sido portada. A JVM inclui o interpretador mais o sistema de runtime.

Em um ambiente interpretado, a fase de linkagem que existem no desenvolvimento de programas tradicionais compilados praticamente desaparece. O equivalente em Java à fase de linkagem consiste apenas do processo de carregar novas classes no ambiente de execução da JVM.

Esse é um processo leve e incremental, que ocorre em tempo de execução.

(Parte 1 de 4)

Comentários