Daremos continuidade aos assuntos tratados na aula 1. Caso você não tenha lido o material da aula 1, recomendo dar uma passada no link http://linubr.blogspot.com.br/2012/08/aula-1-mundo-java-e-abstracao.html
O último assunto que tratamos foi um exemplo de classe Carro modelada através da UML e programada na linguagem Java. Por conveniência do aprendizado, vou repetir abaixo a classe na UML.

Chegamos a codificar essa classe. Mas vocês devem estar se perguntando: beleza, e agora, como eu vou rodar essa classe? É exatamente sobre isso que vamos tratar agora. Faremos um exemplo de instalação da JDK, criaremos um diretório para estudo, criaremos os arquivos necessários e, enfim, executaremos nossa classe.
Instalando a JDK (no Windows)
Caros leitores, devo mostrar minha preferência absoluta do Linux em relação ao Windows.
Aluno rebelde perguntado: Putz... então porque você vai mostrar como instalar no Windows?
Como disse, esse material esta sendo elaborado paralelamente às aulas que temos feito na empresa, e os participantes Walmir, Sirley, Ludmilla e agora também Ana Gláucia, todos trabalham com Windows. Portanto, vamos ao que interessa.
O primeiro passo é instalar a JDK. Sempre é ruim falarmos em versões de programas em documentos que ficarão disponíveis na net, pois em poucos meses (ou dias) estaremos desatualizados. Portanto não vou deixar explícita a versão da JDK que baixarei agora. Vamos lá! Entre no link abaixo:
Dentro do site, vamos clicar no botão indicado pela seta (vide abaixo).

Você será submetido para uma página de aceite da licença do Java e para selecionar a versão do JDK. Marque a opção “Accept License Agreement” e selecione a JDK versão Windows x86 através do link “jdk-6u25-windows-i586.exe”. É claro que se seu computador possuir um processador de 64 bits, você deverá baixar a versão Windows x64.

Salve o arquivo num local qualquer e depois execute-o. Vou exibir as janelas de instalação do JDK, mas dependendo da versão que você baixou, elas podem ser diferentes.
Nessa primeira tela apenas aguarde para ele carregar a instalação.

Em seguida, clique em Next >

Nessa próxima tela, deixe a configuração padrão de instalação. Não há necessidade de modificar o diretório padrão de instalação do Java. Portanto, clique em Next >

Em seguida aguarde o término da instalação do JDK.

Após esse processo, a instalação da JRE será realizada. Clique em Next >

Aguarde...

Por fim, clique em Finish

Pronto! Nossa JDK e JRE já estão instaladas. Vamos testá-las. Abra o prompt de comando (MS-DOS) e execute o comando abaixo:
java -version
Através desse comando nos será mostrada a versão da JRE que está instalada no sistema.

Lembre-se que através do comando java nós executamos a JVM (que é a Runtime JRE). Vamos agora testar o comando de compilação.
O comando de compilação javac não fica, por default, disponível no PATH do sistema operacional. Para facilitar nosso trabalho de desenvolvimento, vamos acrescentá-lo no PATH.
Mas quem é esse tal de PATH?
Seguinte: o sistema operacional oferece ao usuário uma série de programas (comandos) disponíveis no MS-DOS. Esses comandos ficam guardados nas pastas internas do próprio Windows. Mas para evitar que o usuário tenha que acessar diretamente esses diretórios, o SO faz com que eles fiquem disponíveis em qualquer diretório do sistema. Ele faz isso através de uma variável de ambiente do sistema operacional chamada PATH. No nosso caso, o comando javac do JDK foi instalado no diretório C:\Arquivos de programas\Java\jdk1.6.0_25\bin. Portanto, para que esse comando fique disponível em qualquer outro diretório do sistema, vamos acrescentar esse caminho na variável PATH.
Para configurar o PATH, siga os passos a seguir. Clique com o botão direito no ícone do Meu Computador, e na opção Propriedades

Na aba Avançado, clique no botão Variáveis de ambiente

De dois cliques na variável Path

Agora você poderá definir o valor dessa variável. Vá ao final do valor coloque um ponto-e-vírgula para separar a texto e acrescente o caminho de instalação da sua JDK. No meu caso, o caminho é:
C:\Arquivos de programas\Java\jdk1.6.0_25\bin
Não se esqueça do ponto-e-vírgula

Depois de colar o caminho da JDK, minha Path ficou assim:

Clique em OK. Depois em OK na janela de Variáveis de Ambiente e OK na janela de Propriedades do Meu Computador. Pronto! A PATH está configurada.
Volte agora no MS-DOS e digite o comando abaixo. Atenção: caso você tenha mantido seu MS-DOS aberto (que usamos para fazer o comando java), feche-o e abra novamente (para carregar essa nova configuração de PATH).
javac
Serão exibidas as opções conforme abaixo.

Se for exibida uma mensagem similar à mostrada na figura acima, seu ambiente está pronto para continuarmos. Caso você tenha tido algum problema nesses passos de instalação ou, ainda, tenha tentado realizá-los no ambiente Linux e não teve sucesso, fique à vontade de me enviar um e-mail (lgapontes@gmail.com) ou contatar pelo Twitter (twitter.com/lgapontes). Terei prazer em ajudá-lo!
Vasculhando a JVM
Vamos entender agora alguns detalhes sobre como um programa Java é executado. Para começar a linha de raciocínio, vou repetir o código da Classe Carro aqui.
class Carro {
int velocidadeAtual;
int velocidadeMax;
int acelerar() {
if ( velocidadeAtual <= velocidadeMax )
velocidadeAtual = velocidadeAtual + 1;
return velocidadeAtual;
}
void frear() {
if ( velocidadeAtual > 0 )
velocidadeAtual = velocidadeAtual - 1;
}
}
Lembrando um pouco do que conversamos, sabemos que para rodar um programa Java nós precisamos executá-lo através da JVM. Ou seja, jogue esse programa na JVM que ela faz o resto!

Mas o que exatamente da classe Carro a JVM vai executar?
Sempre que rodamos um programa Java (na verdade, o arquivo .class ou bytecode) na JVM, ela é configurada para executar um método específico. Esse método, chamado de main (cuja tradução literal é principal), pode ser entendido como o ponto de partida para nosso programa. Na classe Carro, todavia, não definimos esse método.
Isso significa que precisaremos implementá-lo em outra classe auxiliar. Por enquanto não vamos focar nossa atenção na “classe auxiliar”. Vamos apenas assumir que a partir de outra sequência de código faremos a chamada da nossa classe Carro e instanciá-la na JVM.
O método main exige uma sintaxe padrão. Todo programa em Java dito executável deverá conter esse método exatamente com a sintaxe abaixo:
public static void main(String args[]) {
// … o código de execução entra aqui ...
}
Por enquanto apenas decore esse método! Ao longo do curso entenderemos com mais detalhes o significado de cada um dos elementos presentes na sua definição. Continuando na nossa linha simplista, imagine agora que esse método esteja em uma classe auxiliar, que só existe para executar nosso programa.
class Executora {
public static void main(String args[]) {
Carro fusca;
fusca = new Carro();
fusca.velocidadeMax = 80;
fusca.acelerar();
fusca.acelerar();
System.out.println( fusca.velocidadeAtual );
}
}
Vamos agora entender o que acontece nesse código.
A sintaxe Carro fusca; significa que criamos uma variável de instância chamada fusca do tipo classe Carro. Com esse trecho de código não estamos criando o objeto! Estamos apenas informando a partir de qual variável faremos referência ao objeto. Então, por enquanto, a JVM inicializa uma espaço na memória para guardar a referência a um objeto, que por enquanto, está vazia.

Ahh sim!! Acho que ainda não conversamos em como a JVM trabalha com a memória. A parte da memória Stack (ou pilha) é reservada para guardar as variáveis primitivas dos métodos de todo o sistema. Como falamos, fusca é uma referência para um futuro objeto. Ela guarda o chamado object id que nada mais é que uma identificação única para aquele objeto durante a execução. Como ainda não instanciamos o objeto, ela contem seu valor vazio. A Heap (ou monte - que também é uma pilha na prática, mas isso não importa) é a parte da memória aonde ficarão alocados os objetos. Ainda não temos objetos, portanto ela está vazia.
No comando fusca = new Carro(); estamos instanciando o objeto Carro e guardando sua referência em fusca. Com isso a JVM cria o objeto e guarda-o na Heap. A forma de acessá-lo pelo programa será através da variável fusca. Observe que fusca é uma palavra qualquer que usamos - poderia ser gol, casa, banana, x, tanto faz.

Veja que os atributos do objeto ficam dentro de sua instância na Heap. Por enquanto velocidadeAtual e velocidadeMax estão definidas como zero.
Pelo comando fusca.velocidadeMax = 80; podemos mostrar a forma como acessamos os dados de um objeto instanciado. Atenção: esse acesso só é possível porque o objeto já está na Heap. Se executássemos esse código antes de criar o objeto (pelo new), teríamos um erro no programa, pois estaríamos acessando o atributo de um objeto que não existe. É fácil de entender que com esse comando estamos atribuindo o valor 80 no atributo velocidadeMax do objeto fusca. A foto da nossa memória nesse instante é mostrada abaixo:

Em seguida, nas duas próximas chamadas do método acelerar() de fusca, incrementamos em 1 o valor de velocidadeAtual, se e somente se o valor de velocidadeAtual for menor ou igual ao de velocidadeMax. Como o valor de velocidadeAtual é zero e velocidadeMax é 80, em ambas as chamadas teremos o incremento. Ao final dessas operações temos o seguinte estado da memória:

Por fim, com o comando System.out.println( fusca.velocidadeAtual ); estaremos imprimindo no prompt de comando (o MS-DOS do Windows ou o shell do Linux) o valor do atributo velocidadeAtual, que é 2.
Faremos ao longo do nosso curso esse exercício de visualizar o estado da Stack e da Heap para entender como o Java trabalha com suas variáveis e seus objetos.
Exercício de fixação
Vamos fazer agora um exercício mental para reforçar os conceitos de atributos, métodos e variáveis. Veja o código abaixo:
class Xxx {
int y;
void fazAlgo(int valor) { y = valor; }
int fazOutraCoisa() {
int z = y;
return z;
}
String zzz;
}
Antes de olhar a resposta abaixo tente identificar o nome da classe, o nome dos atributos e o nome dos métodos do código apresentado.
Respostas:
Classe: lembre-se que a classe é identificada pela sintaxe class. Neste caso o nome da classe é Xxx. Vou aproveitar a oportunidade para esclarecer uma regra de formatação de código em Java: toda a classe começa com a primeira letra em maiúsculo. Para reforçar ainda mais isso: no Java, tudo que começa com letra maiúscula (desde que siga a formatação padrão da linguagem, que não é obrigatória) é uma Classe, uma Interface ou uma constante. Como por enquanto só aprendemos o conceito de classes, assuma como uma verdade absoluta que, tudo que começa com uma letra maiúscula é uma classe. Depois voltaremos a falar sobre o assunto para apresentar as Interfaces e as constantes.
Métodos: no código temos os métodos fazAlgo() que recebe como parâmetro uma variável do tipo primitivo int de nome valor. Dentro do comportamento desse método, definimos o valor do atributo y da classe como o valor passado por parâmetro. O outro método chama-se fazOutraCoisa(). Ele não possui nenhum parâmetro, porém foi definido para retornar um valor inteiro. Lembre-se que isso nos obriga a implementar o comando return em seu escopo*. Em seu código, criamos uma variável local ao método chamada z e atribuimos o valor de y. Em seguida retornamos o valor de z. Se não colocarmos o return teremos um erro de compilação!
* - um escopo é trecho do código delimitado pelas chaves { e }. Quando digo que z está no escopo do método, significa que ela só existe dentro das chaves { e } do método fazOutraCoisa(). A palavra escopo também é empregada em outros entendimentos da linguagem Java. Por enquanto entendam esse conceito de limitar o escopo pelas chaves.
Atributos: Quais são os atributos? Cuidado para não confundir int z como atributo da classe Xxx. Atributo é toda variável que foi definida no escopo (ou seja, explicitamente entre as chaves) da classe. Como z foi definida no escopo do método fazOutraCoisa(), ela não é um atributo da classe. Se nós estivéssemos executando essa classe na JVM, mais especificamente, executando o método fazOutraCoisa(), teríamos alocados na Stack duas áreas reservadas aos métodos main (de uma classe auxiliar) e fazOutraCoisa, enquanto que a instância do objeto ficaria na Heap.

Visualizando a memória acima, identificamos facilmente que os atributos do objeto instanciado Xxx são y do tipo inteiro e zzz do tipo String. Só para constar, String é uma classe. Veja que o z, que está sendo executado no fazOutraCoisa() está na Stack e não na Heap.
Criando e Compilando as Classes
Senhores, diante do que já vimos até agora, temos subsídios suficientes para criar nosso primeiro programa em Java. Podemos criar nossos fontes dentro de um diretório qualquer do sistema, mas para facilitar o aprendizado, sugiro que criem na raiz do seu sistema (C: no Windows - caso opte em fazer no Linux, seria melhor criá-lo como /opt/java) um diretório chamado java (tudo em minúsculo). Como estamos fazendo no Windows, vamos aos passos:

Depois de criado, trabalharemos diretamente no diretório C:\java. Vamos criar nossos arquivos fontes. Lembre-se que o código fonte do Java deve ser um arquivo TXT com a extensão .java. Portanto crie um arquivo chamado Carro.java dentro de C:\java. Você pode criá-lo pelo bloco de notas.

Depois defina seu nome para Carro.java

Digite dentro desse arquivo exatamente o código abaixo - vou fingir que você não copiou e colou... ok!?... afinal, digitar o código na mão ajuda a lembrar da sintaxe correta ;)
public class Carro {
int velocidadeAtual;
int velocidadeMax;
int acelerar() {
if ( velocidadeAtual <= velocidadeMax )
velocidadeAtual = velocidadeAtual + 1;
return velocidadeAtual;
}
void frear() {
if ( velocidadeAtual > 0 )
velocidadeAtual = velocidadeAtual - 1;
}
}
Não sei se você notou, mas existe uma sutil diferença entre o código do início desse artigo para o apresentado acima. Esté bem, eu falo! É a sintaxe public antes da palavra reservada class.
Ué... mas pra que essa frescura agora? Calma, calma! Voltarei a falar sobre isso adiante.
Salve o arquivo Carro.java e crie um outro TXT de nome Executora.java com o código abaixo:
public class Executora {
public static void main(String args[]) {
Carro fusca;
fusca = new Carro();
fusca.velocidadeMax = 80;
fusca.acelerar();
fusca.acelerar();
System.out.println( fusca.velocidadeAtual );
}
}
De forma semelhante, acrescentamos o comando public antes do class. Salve o arquivo. Ao final desse processo, teremos a seguinte estrutura:

Vamos agora compilar nossos fontes. Entre pelo prompt de comando (MS-DOS) no diretório C:\java

Veja que ao iniciar o prompt de comando você será direcionado para sua homearea (onde fica a pasta Meus Documentos). Para você navegar até a pasta C:\java digite a seguência de comandos abaixo (vide imagem - eu fiz isso também).
cd ..
cd ..
cd java
Já dentro do nosso diretório de trabalho, vamos executar o comando de compilação (lembre-se que você precisa ter configurado o PATH do sistema operacional para que isso funcione).
javac *.java
Esse comando compilará todos os fontes do Java que estiverem no diretório corrente. Você verá que surgirão (como já sabíamos) os arquivos Carro.class e Executora.class dentro desse mesmo diretório. Caso o código apresente algum erro, os programas não serão compilados. Se foi o seu caso, olhe com atenção os fontes digitados e veja se há diferença entre o exposto aqui no site.
Executando as classes
Agora que você já transformou seus fontes em bytecodes (pela compilação), nós poderemos chamar a JVM para executar nosso programa.
Fica a pergunta: devo executar a classe Carro ou a classe Executora?
Lembre-se que o Java está preparado para executar classes que contenham o método padrão de execução main. A única classe que implementamos esse método é a Executora. Portanto será através dela que vamos rodar nosso programa. Execute o comando abaixo:
java Executora
Cuidado: apesar do bytecode conter a extensão .class, ao chamá-lo pelo java omitimos essa extensão. Veja o resultado no prompt:

Ele mostrou um 2??!?! O que é isso! Um erro?
Lembre-se que ao acompanharmos passo a passo o que ocorre na execução desse programa, indicamos que nas duas chamadas de acelerar() o valor de velocidadeAtual foi incrementado, chegando a um total de 2. Sendo ainda que na última linha do public static void main() da classe Executora nós pedimos para exibir no prompt justamente o valor desse atributo. Portanto, foi exatamente isso que o programa fez!
Putzzzz.... esse trabalho todo só pra mostrar um número ridículo na tela?
Caros leitores, como conversamos, no início da aprendizagem com Java eu vou precisar da cumplicidade de vocês. Muito antes de mostrar os poderosos recursos da API do Java você precisam carregar no DNA toda a lógica de orientação a objetos e os princípios básicos do Java. Portanto, realmente é preciso ter paciência nesse momento.
Não desista!! Continue lendo essa aula, já estamos terminado...
Porque usar a sintaxe public antes do class?
Chegamos a comentar que para codificar esse exemplo nós precisamos adicionar o comando public no início da definição da classe. O comando public, quando atribuido à classe, indica que o nome da classe programada no arquivo TXT deve ser exatamente igual (até as letras maiúsculas e minúsculas) ao nome do arquivo (com exceção, é claro, da extensão .java).

Então só podemos ter uma classe por arquivo?
Não! O Java permite que você programa várias classes por arquivo .java, porém, apenas uma delas poderá conter a visibilidade public - para, é claro, ficar equivalente ao nome do arquivo. Se você optar em programar mais de uma classe no arquivo, as outras podem ter qualquer nome diferente da classe public.
Apesar de isso ser possível, é uma boa prática programa apenas uma classe por arquivo. No geral seu código ficará mais organizado.
Aos amigos Ludmilla, Walmir, Gláucia e Sirley, chegamos a tratar do entendimento do comando static e dos tipos primitivos do Java ainda na segunda aula, mas como explorei bastante as dúvidas com a instalação do Java e configuração do PATH nesse material, achei melhor tratar desse assunto no próximo documento da Aula 3, ok!
Aos demais leitores, fiquem à vontade para entrar em contato caso não tenham conseguido executar esse primeiro exemplo. Na próxima aula faremos outro exemplo, além de estudarmos mais alguns assuntos.
É isso ae pessoal! Mais uma vez obrigado pela leitura e até a próxima!
Abraços. Guilherme Pontes
Nenhum comentário:
Postar um comentário