Algoritmos e Programação I

Aula de Laboratório

Objetivos: Entender o funcionamento dos programas Java via linha de comando

1. A Linha de Comando: DOS ou Shell

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.

2. Modelo de Funcionamento da Linguagem 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:

3. Compilando e Executando programas Java na linha de comando

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.

4. Exercício

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.

5. Conclusão

Você chegou ao final do estudo dirigido: não saia desta aula sem ter conseguido cumprir todas estas etapas.

As etapas são: