Apesar dos usuários geralmente não enxergarem esse recurso, a linha de comando (chamada de "Caminho do DOS" no Windows e, genericamente, de "Shell" no Unix/Linux) permite que se interaja diretamente com o sistema operacional, através de um conjunto de comandos pré-determinados. Até o momento, os programas que fizemos no BlueJ só funcionam DENTRO do ambiente: não é possível executar um programa Java a não ser que tenhamos o respectivo projeto.
O objetivo desta aula, então, é praticar o uso da linguagem Java através da linha de comando, ou seja, fora de qualquer ambiente de desenvolvimento.
Para tanto, primeiramente é preciso entender um pouco mais sobre o funcionamento dos programas Java.
A linguagem Java tem uma característica interessante: os programas são compilados e interpretados.
O compilador gera um código composto por instruções chamadas de bytecodes. O bytecode é um código da máquina virtual Java (JVM - Java Virtual Machine).
A JVM interpreta os bytecodes para serem executados no computador. Portanto, a utilização de código em Java é composta por dois processos: compilação e interpretação.
A máquina virtual Java é um interpretador que transforma as instruções (bytecodes) em linguagem de máquina.
Existem implementações da JVM para Solaris, Windows, Apple, Unix e Linux. Também existem versões disponíveis para Windows CE e PalmOS.
O interessante na plataforma Java é a portabilidade do código: uma vez produzidos os bytecodes, teoricamente o programa pode ser executado em qualquer sistema que possua um interpretador Java:
Para que seja possível compilar e executar um programa Java (composto por um certo número de classes), na linha de comando, é preciso indicar de alguma forma por onde o programa deve começar a sua execução. No BlueJ, convencionamos criar uma classe App, contendo um método executa. Porém, isso é apenas uma convenção, e deve haver uma forma padrão de fazer isso para qualquer programa. Essa forma é através de um método especial, chamado main.
O método main deve ser escrito preferencialmente na classe que contém o programa principal, ou seja, a própria classe App. Para que seja identificado como o ponto de início do programa, ele tem uma assinatura especial:
public class App {
public void executa() {
...
}
public static void main(String args[])
{
App app = new App();
app.executa();
}
}
Observe que os passos executados dentro do método main são exatamente o que faríamos no BlueJ para instanciar a aplicação e executar o programa.
Agora, para compilar o programa, abra a janela da linha de comando, vá até o diretório contendo o código-fonte (arquivos .java) e digite:
javac App.java
Esse comando irá ativar o compilador Java (javac), que produzirá um arquivo contendo os bytecodes necessários: neste caso, chamado de App.class. Observe que o compilador identifica automaticamente as dependências e compila as demais classes do programa.
Se não ocorrerem erros de compilação, o sistema não dá nenhuma mensagem. Nesse caso, para executar o programa, ou seja, ativar o interpretador Java, digite:
java App
Portanto, deve-se usar o nome da classe que contém o método main, SEM o sufixo .class.
Para praticar, recuperaremos o projeto da Conta (ou digitaremos novamente) e faremos com que o método executa realize as seguintes ações: instanciar 2 objetos Conta, perguntar ao usuário a quantia a ser depositada em cada um inicialmente, depois perguntar ao usuário a quantia que deve ser transferida da primeira para a segunda, realizar a transferência, e finalmente exibir o saldo das duas contas na tela.
// Classe Conta
public class Conta
{
private double saldo;
public Conta() {
saldo = 0;
}
public void depositar(double valor) {
saldo = saldo + valor;
}
public void sacar(double valor) {
saldo = saldo - valor;
}
public void transferir(Conta destino, double valor) {
sacar(valor);
destino.depositar(valor);
}
public double getSaldo() {
return saldo;
}
}
// Classe App
import pucrs.alpro.*;
public class App
{
public void executa() {
Conta conta1, conta2;
conta1 = new Conta();
conta2 = new Conta();
Terminal.print("Digite o saldo inicial da conta 1: ");
double saldo1 = Terminal.readDouble();
conta1.depositar(saldo1);
Terminal.print("Digite o saldo inicial da conta 2: ");
double saldo2 = Terminal.readDouble();
conta2.depositar(saldo2);
Terminal.print("Digite o valor a ser transferido: ");
double valor = Terminal.readDouble();
conta1.transferir(conta2,valor);
Terminal.println("O saldo final da conta 1 é: "+conta1.getSaldo());
Terminal.println("O saldo final da conta 2 é: "+conta2.getSaldo());
}
public static void main(String args[]) {
App app1 = new App();
app1.executa();
}
}
O programa também pode ser executado diretamente de dentro do BlueJ. Para tanto, clique com o botão direito sobre a classe App e selecione o método main. Então clique no botão OK e o programa será executado normalmente.
Faça o exercício apresentado logo após esta aula no Moodle, seguindo as instruções para entregá-lo no final da aula - NÃO VALE NOTA dessa vez.
Você chegou ao final do estudo dirigido: não saia desta aula sem ter conseguido cumprir todas estas etapas.
As etapas são: