Sie sind auf Seite 1von 14

Características e diferenciais

Histórico da Linguagem Java

Interessada em dispositivos eletrônicos inteligentes,


a Sun Microsystems financiou uma pesquisa interna com o
codinome Green em 1991. O projeto resultou no
desenvolvimento de uma linguagem baseada em C e C++ que seu
criador, James Gosling, chamou de Oak (carvalho) em
homenagem a uma árvore que dava para a janela do seu
escritório na Sun.

Descobriu-se mais tarde que já havia uma linguagem de


computador chamada Oak. Quando uma equipe da Sun visitou
uma cafeteria local, o nome Java (cidade de origem de um
tipo de café importado) foi sugerido e pegou.

Mas o projeto Green atravessava algumas dificuldades.


O mercado para dispositivos eletrônicos inteligentes
destinados ao consumidor final não estava se desenvolvendo
tão rapidamente como a Sun tinha previsto. Pior ainda, um
contrato importante pelo qual a Sun competia fora concedido
a outra empresa. Então, o projeto estava em risco de
cancelamento. Por pura sorte, a World Wide Web explodiu em
popularidade em 1993 e as pessoas da Sun viram o imediato
potencial de utilizar Java para criar páginas da Web com o
chamado conteúdo dinâmico. Isso deu nova vida ao projeto.

Em maio de 1995, a Sun anunciou Java formalmente em


uma conferência importante. Normalmente, um evento como
esse não teria gerado muita atenção. Entretanto, Java gerou
interesse imediato na comunidade comercial por causa do
fenomenal interesse pela World Wide Web.

Java é agora utilizada para criar páginas da Web com


conteúdo interativo e dinâmico, para desenvolver
aplicativos corporativos de grande porte, para aprimorar a
funcionalidade de servidores da World Wide Web, fornecer
aplicativos para dispositivos destinados ao consumidor
final (como telefones celulares, pagers e assistentes
pessoais digitais) e para muitas outras finalidades.

O Processo de desenvolvimento de Software em Java

Na linguagem de programação Java, todo código fonte é


primeiramente escrito em arquivos texto com a extensão
.java. Estes arquivos texto são então compilados pelo
compilador javac, gerando arquivos com extensão .class. Um
arquivo .class não contém código de máquina nativo para o
processador, na verdade ele contém "bytecodes" (linguagem

1
de máquina da Máquina Virtual Java - JVM). O aplicativo
inicializador Java então roda a sua aplicação com uma
instância da Máquina Virtual Java.

Pelo fato da Máquina Virtual Java (JVM) estar


disponível em diferentes sistemas operacionais, o mesmo
arquivo .class gerado no sistema operacional "X" é capaz de
ser executado em qualquer outro sistema operacional como:
Microsoft Windows, Solaris, Linux ou MAC OS.

O Compilador javac e principais parâmetros de compilação

Detalhes:
http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javac.html

O compilador javac tem por objetivo ler definições de


classes e interfaces, escritas na linguagem de programação
Java, e compilar as mesmas em arquivos bytecode (.class).

Existem duas maneiras de passar, como parâmetro, para


o aplicativo javac os nomes de arquivos de código fonte:

1) Para um número pequeno de arquivos fonte,


simplesmente liste os nomes dos arquivos na linha
de comando.

2
2) Para um número grande de arquivos fonte, liste os
nomes dos arquivos em um arquivo texto, separando
os nome por branco ou quebras de linha. Então
utilize o nome do arquivo que contém a lista como
parâmetro para o aplicativo javac, precedido por
um caracter "@" (arroba).

Nomes de arquivos fonte devem obrigatoriamente ter a


extensão .java, já os arquivos compilados são gerados
obrigatoriamente com a extensão .class e ambos devem
obrigatoriamente ter um nome raiz que identifica a classe.

Por exemplo: Uma classe chamada MinhaClasse poderia ser


escrita em um arquivo fonte chamado MinhaClasse.java e
compilado em um arquivo bytecode chamado MinhaClasse.class.

Opções padrão:

–classpath classpath
Esta opção define o caminho (diretório) onde
o compilador Java procura por arquivos que já foram
previamente compilados (com extensão class) e outros
recursos.

O classpath ajusta o class path do usuário.


Se este parâmetro for definido, o mesmo terá prioridade
sobre a variável de ambiente CLASSPATH. Se nem a variável
de ambiente CLASSPATH nem o parâmetro -classpath forem
definidos, o class path do usuário será o diretório
corrente.

Se a opção –sourcepath não for especificada, o


class path do usuário será utilizado para procurar por
arquivos compilados (.class) e também por arquivos fonte
(.Java).

-d diretório
Ajusta o diretório de destino dos arquivos
.class. O diretório de destino deve obrigatoriamente
existir, ou seja, o aplicativo javac não irá criar o
diretório de destino.
Se o parâmetro -d não for especificado, o aplicativo
javac irá colocar o arquivo class no mesmo diretório que
estiver o arquivo fonte.

-help
Imprime um resumo das opções padrão de compilação

-sourcepath sourcepath
Especifica o caminho para procurar pelo código
fonte de classes e definições de interfaces. As entradas

3
para o Source path devem ser separadas por ponto e virgula
(;) e podem ser diretórios, arquivos JAR ou arquivos ZIP.

Exercício:

Crie uma classe:

public class PrimeiraClasse{


public static void main (String args[]){
System.out.println("Primeira Classe");
}
}

O nome do arquivo: PrimeiraClasse.java

Abra o prompt do MS-DOS e digite: javac PrimeiraClasse.java

Será gerado o arquivo: PrimeiraClasse.class (bytecode)

Volte para o prompt do MS-DOS e digite: java PrimeiraClasse

Tipos de Distribuição

A tecnologia Java não se resume a um único kit de


ferramentas (toolkit). Ela compõe-se de diversos pacotes
com finalidades singulares. A primeira dificuldade
enfrentada por quem está iniciando a aprendizagem de Java é
exatamente escolher que toolkit instalar. Essa escolha deve
levar em conta o que você pretende realizar e que recursos
estão disponíveis em cada um deles.

O primeiro passo é compreender a utilidade de cada uma


das três diferentes edições da plataforma Java 2, que são:
J2SE, J2EE, J2ME. Comece observando, a seguir, o
significado de cada uma dessas siglas:
• J2SE: Java 2 Platform Standar Edition – Edição
Padrão da Plataforma Java 2.
• J2EE: Java 2 Platform Enterprise Editon – Edição
Empresarial da Plataforma Java 2.
• J2ME: Java 2 Platform Micro Edition: Edição Micro
da Plataforma Java 2.

A tecnologia J2SE é a solução adequada para se


desenvolver uma grande gama de aplicativos e applets para
empresas. Inclui acesso a banco de dados, I/O, multithread,
network (rede) entre outras mais.

4
A tecnologia J2SE possui dois principais produtos:
• Java 2 SE Runtime Environment (JRE)
• Java development Kit (JDK)

A JRE contém bibliotecas, a máquina virtual Java (JVM)


e outros componentes para rodar applets e aplicações
escritas na linguagem de programação Java. É também o
alicerce para tecnologias que utilizam J2EE. A JRE não
contém ferramentas e utilitários como compiladores e
depuradores para desenvolvimento de applets e aplicações.

A JDK é um superconjunto da JRE, e contém tudo o que


está presente na JRE, mais ferramentas tais como compilador
e depurador necessários para desenvolvimento de applets e
aplicações.

A tecnologia J2EE e seu modelo de componentes


simplificam o desenvolvimento de aplicações para empresas.
A plataforma J2EE suporta Web Services necessários para
habilitar o desenvolvimento de aplicações de negócio
seguras e robustas. É a tecnologia mais adequada para o
desenvolvimento de aplicações complexas para rodar na
Internet. Esta tecnologia contém APIs com funcionalidades
específicas para desenvolvimento de aplicações para
servidores tais como: JSP, EJB e etc.

A tecnologia J2ME contém um ambiente de execução


altamente aperfeiçoado. Ela cobre o vasto espaço de
equipamentos eletrônicos de consumo, como cartões
inteligentes e pagers. Não se destina à programação em
computadores e sim à programação de pequenos dispositivos
eletrônicos como: agendas eletrônicas, telefone celular,
palmtop e aparelhos eletrônicos em geral que possuam uma
KVM (Máquina Virtual para pequenos dispositivos).

Evolução da plataforma Java

Java Development Kit 1.1


Java 2 Platform 1.2; (J2SE, J2EE e J2ME)
Java 2 Platform 1.3; (J2SE, J2EE e J2ME)
Java 2 Platform 1.4; (J2SE, J2EE e J2ME)
Java Platform 5.0; (JSE 5, JEE 5 e JME 5)
Java Platform 6;

OBS1: A partir da versão 1.2, ficou conhecido como Java 2.


OBS2: A partir da versão 1.5, ficou conhecido como Java 5.
OBS3: A partir da versão 1.6, ficou conhecido como Java 6.

5
Download e instalação do JDK (Java Development Kit) 5.0

1) Faça o donwload a partir da URL:


http://java.sun.com/javase/downloads/index_jdk5.jsp
2) Procure pela versão: JDK 5.0 Update 14 (ou superior);
3) Clique no botão: "»Download";
4) Na página que irá abrir selecione a opção: "Accept
License Agreement";
5) Depois clique no link:
"Windows Offline Installation, Multi-language" (jdk-1_5_0_14-windows-i586-
p.exe)

6) Após o download, crie o seguinte diretório no drive


C: C:\jdk1.5.0_14
7) Clique duas vezes no arquivo que você acabou de fazer
o download;
8) A instalação é bem simples, clique em "Next" do
começo ao fim. Em algum momento da instalação será
solicitado o diretório onde será instalado o JDK
1.5.0, informe o diretório que foi criado: C:\
jdk1.5.0_14
9) Devemos colocar o diretório da JVM no "path" da sua
máquina:
a. Clique com o botão direito em "meu computador", e
em seguida clique em "propriedades";
b. Clique na aba "avançado" e depois no botão
"variáveis de ambiente";
c. Em "variáveis do sistema" procura pela variável
"path", selecione a mesma e clique no botão
"Editar";
d. Irá abrir uma janela com uma caixa de texto
"Valor da variável";
e. Nesta caixa de texto coloque o seguinte diretório
"C:\jdk1.5.0_14\bin". Cuidado para não apagar o
conteúdo que já estiver lá;
f. Clique no botão OK;
10)Agora clique no botão "Nova" e na janela que irá
abrir escreva "JAVA_HOME" para a caixa de texto "Nome
da variável". Em seguida, escreva " C:\jdk1.5.0_14"
para a caixa de texto "Valor da variável";
11)Abra um prompt do MS-DOS e digite: java –version.
Você deverá ver a seguinte mensagem:
java version "1.5.0_14"
12)Bem vindo ao mundo Java!!

6
JVM – Java Virtual Machine

A máquina virtual Java (JVM) é uma máquina imaginária


que é implementada para emulação, em software, de uma
máquina real. O código para a JVM está armazenado em
arquivos .class.

Os arquivos .class são gerados a partir do processo de


compilação e linkedição. O código binário gerado na
compilação (também chamado de bytecode) é comum a todos os
sistemas operacionais que tenham uma JVM instalada.

Um programa Java é multiplataforma porque um mesmo


binário Java pode ser executado nas diferentes plataformas
que implementam a JVM.

Compiladores Java JVM Máquinas

Win32 Win32 Win32

Solaris Solaris Solaris

fonte Linux ByteCode Linux Linux

OS2 OS2 OS2

MacOS MacOS MacOS

Características da JVM
• Gerenciar alocação e desalocação de memória;
• Class loader – carregar arquivos class para a
memória;
• Verificar se os bytecodes aderem às especificações
da JVM e se não violam a integridade e segurança do
sistema;
• Interpretar o bytecode para a plataforma em
questão.

7
Garbage Collector

A maioria das linguagens modernas permite a alocação


de memória em tempo de execução. Em Java, isto ocorre
sempre que criamos um objeto com o operador "new" ou
indiretamente quando chamamos um método que tem variáveis
locais.

Variáveis locais e argumentos de métodos alocam espaço


na pilha de memória somente enquanto o método existir, no
entanto, atributos têm um ciclo de vida maior.

A liberação de memória utilizada pelos objetos em Java


nunca é feita de maneira explícita; ao invés disso, a JVM
provê um mecanismo de liberação de espaço de memória
alocada chamado Garbage Collector (coletor de lixo).

O Garbage Collector não pode ser controlado via


código, uma vez que é uma thread de baixa prioridade e
somente a JVM juntamente com o sistema operacional são
capazes de gerenciar threads; por isto o Garbage Collector
depende da implementação utilizada.

Quando a memória é liberada?


O máximo que podemos dizer é que a memória não é
liberada enquanto o objeto estiver sendo utilizado, ou
seja, enquanto existir uma referência para o objeto em
questão.

Mesmo quando o objeto não estiver mais sendo


utilizado, não poderemos garantir quando será "coletado", e
nem mesmo se será coletado.

Existem métodos como "System.gc()" e "Runtime.gc()"


que querem dizer "Execute o Garbage Collector quando for
possível", no entanto, como o Garbage Collector é uma
thread de baixa prioridade, não podemos garantir que ela
será executada.

Executando a JVM (Como executar classes Java por intermédio


da JVM)

Para executar classes Java por intermédio da JVM é


necessário abrir um prompt do MS-DOS e digitar:
C:>java nomeDaClasse

8
Passagem de parâmetros na execução da classe.

Crie a seguinte classe Java:

public class TesteParametro{


public static void main (String args[]){

//percorre o array de strings e imprime todos os argumentos


for (int nCont = 0; nCont < args.length; nCont++){
System.out.println(args[nCont]);
}
}
}

Utilize o compilador para compilar a classe:


C:>javac TesteParametro.java

Utilize a JVM para executar a classe e informe alguns


parâmetros:
C:>Java TesteParametro Par1 Par2 Par3 Par4

Sistema de Arquivos da JVM

Pacotes

Para entender o que é um pacote vamos primeiramente


fazer uma analogia com a estrutura de diretórios do seu
disco rígido.

Imagine que você tenha 500 (quinhentos) arquivos e


todos estão em um único diretório. Estes arquivos são de
diversos tipos e diversos assuntos.

Seria muito mais fácil organizar estes arquivos em


subdiretórios de forma a colocar em um único diretório
apenas os arquivos que tivessem uma relação em comum.
Exemplo:

9
Com os pacotes acontece a mesma coisa. Um pacote pode
ser entendido como um diretório ou como um recipiente para
as classes e são utilizados para agrupa-las, organiza-las e
dividi-las em espaços menores. Logo não seria nada
organizado colocar todas as classes do seu projeto em um
único diretório (pacote).

As classes em Java são organizadas da mesma forma como


organizamos os arquivos, ou seja, em diretórios. No
entanto, a JVM precisa de alguma diretiva para localizar
arquivos que estão em diretórios diferentes, e, por isto,
utilizamos a estrutura de pacotes.

A estrutura de pacotes está baseada na estrutura de


diretórios. No entanto, quando nos referimos a pacotes
dentro do código não utilizamos a barra, mas um ponto
separando os diretórios.

A declaração package

A declaração package é opcional. Se estiver presente,


deve ser a primeira a figurar em um arquivo fonte Java e
indica o pacote que abrigará os arquivos compilados das
classes e interfaces implementadas nesse arquivo. Se essa
declaração for omitida, os arquivos compilados serão
armazenados no mesmo diretório em que se encontra o arquivo
fonte.

Existe uma convenção para a declaração de nomes de


pacotes que é a utilização de uma URL invertida.
Normalmente a URL do proprietário da classe como, por
exemplo, sua empresa ou a empresa para quem você está
desenvolvendo.

Vamos utilizar como exemplo a URL da Uniban: uniban.br


e, portanto, teremos a estrutura de pacotes br.uniban

Como exemplo, vamos criar a classe abaixo


(TestePacote.java) utilizando um arquivo texto:

package br.uniban;

public class TestePacote{


public static void main (String args[]){
System.out.println("Dentro do Pacote br.uniban");
}
}

Crie agora um diretório "projetos", dentro dele um


subdiretório "br" e um subdiretório "uniban" dentro de
"br".

10
A estrutura ficaria assim:

projetos
br
uniban

Copie o arquivo TestePacote.java para dentro do


diretório "uniban".

Abra um prompt do MS-DOS e vá para o diretório


c:\projetos. Dentro deste diretório utilize o compilador
javac para compilar a classe TestePacote.java:

C:\projetos>javac br\uniban\TestePacote.java

OBS: Sempre que for compilar uma classe deve-se utilizar a


barra para separar os diretórios.
Para executar a classe, basta digitar o seguinte
comando:
C:\projetos>java br.uniban.TestePacote

OBS: Sempre que for executar uma classe deve-se utilizar um


ponto para separar os diretórios, pois agora estamos
trabalhando com pacotes.

A declaração import

Para utilizar uma classe que está em um outro pacote


e, conseqüentemente, em um outro diretório, utilizamos a
instrução "import", seguida do nome do pacote que queremos
utilizar, seguido de ponto e virgula.

Podemos importar apenas uma classe do pacote,


indicando o nome da classe:

import java.util.Date;

Ou podemos importar todas as classes do pacote


utilizando um "*":
import java.util.*;

package br.uniban;
//podemos importar apenas a classe de interesse
import java.util.Date;
//ou podemos importar todas as classes do pacote
//import java.util.*;
public class TesteImport{
public static void main (String args[]){
Date d = new Date();
System.out.println(d);
}
}

11
OBS: A utilização do import com * (importar todas as
classes de um mesmo pacote) não afeta a performance, pois a
JVM carrega as classes sob demanda e não quando um import é
realizado.

Dica:
Por padrão deve-se declarar explicitamente o
import individual das classes, porém quando uma classe
emprega mais de 6 (seis) classes de um mesmo pacote, é
recomendável importa-lo por completo.

Classpath

O classpath é uma opção tanto do compilador javac


quanto da JVM. A opção –classpath é utilizada para
especificar onde devem ser procurados os arquivos class do
usuário.

Imagine que você queira disponibilizar uma classe para


a utilização de várias aplicações.
Para realizar esta tarefa basta colocar o diretório
onde está localizado o pacote na variável de ambiente
CLASSPATH.

Exemplo:
Imagine que no diretório c:\Aplicacao> exista uma
classe chamada TesteClassPath.java

import br.uniban.ImprimeMensagem;

public class TesteClassPath{


public static void main (String args[]){
ImprimeMensagem im = new ImprimeMensagem("Isto é um teste");

im.imprimir();
}
}

E que no diretório c:\projetos\br\uniban\ exista a


classe ImprimeMensagem.java. Esta é a classe que se deseja
disponibilizar para várias aplicações.

package br.uniban;

public class ImprimeMensagem{


String mensagem;
public ImprimeMensagem (String m){
this.mensagem = m;
}
public void imprimir(){
System.out.println(mensagem);
}
}

12
Compile a classe "TesteClassPath.java": passando o
argumento "–classpath .;c:\projetos".
Este argumento indica que se deve compilar a classe
TesteClassPath.java que está no diretório local, indicada
pelo "." logo depois do "-classpath" e que também se deve
compilar a classe ImprimeMensagem.java do pacote br.uniban
que está no diretório c:\projetos>

(1) C:\aplicacao>javac -classpath .;c:\projetos TesteClassPath.java

Uma outra forma de fazer isto é definir uma variável


de ambiente chamada CLASSPATH, veja:
C:\>set CLASSPATH=.;c:\projetos

Em seguida basta compilar o arquivo java.


(2) C:\aplicacao>javac -classpath %CLASSPATH% TesteClassPath.java

As linhas (1) e (2) fazem exatamente a mesma coisa, a


diferença é que na linha (1) o caminho para o pacote está
sendo declarado de forma explícita, já na linha (2) o
caminho está definido em uma variável de ambiente.

Após o processo de compilação devemos executar a


classe Java "TesteClassPath":
C:\aplicacao>java -classpath .; c:\projetos TesteClassPath
Ou
C:\aplicacao>java -classpath %CLASSPATH% TesteClassPath

Note a utilização de um ponto "." logo depois do


parâmetro "-classpath" isto indica para a JVM utilizar
também o diretório corrente, pois a classe TesteClassPath
está no diretório corrente.

Exercícios Sobre Linguagem Java: A plataforma

1) Qual é a função do utilitário "javac"

2) O arquivo .class gerado é um arquivo executável que


contém código nativo? Sim? Não? Porque?

3) Crie uma classe com um nome qualquer, compile e


execute a mesma. Esta classe deve imprimir uma
mensagem qualquer.

4) Comente a respeito da distribuição J2ME.

5) Como você definiria a JVM (Java Virtual Machine)

13
6) Crie uma classe de nome ImprimeNomes que receba
parâmetros de entrada, que são nomes de pessoas e
imprima estes nomes.

7) Utilize a mesma classe feita no exercício anterior,


só que desta vez utilize a declaração package, ou
seja, crie um pacote "br.uniban", coloque a classe
dentro deste pacote, compile e execute a classe.

8) Crie uma classe de nome "ImprimeMsg" com um único


método chamado "imprimir" e coloque a mesma no
pacote "br.uniban". Em um outro diretório qualquer
crie uma classe com o método "main" e dentro do
mesmo, crie um objeto da classe ImprimeMsg e chame o
método imprimir da mesma passando uma mensagem
qualquer. Compile e execute a classe principal
utilizando o parâmetro –classpath.

14