118 pág.

Pré-visualização | Página 12 de 37
para applets remotos. 2.7.3 Desenvolvimento de aplicações Aplicações Java são programas autônomos, cujo código gerado a partir de um programa fonte pode ser interpretado diretamente pela Máquina Virtual Java. Como tudo em Java está estruturado através de classes e objetos, para desenvolver uma aplicação é preciso desenvolver pelo menos uma classe que contenha um método denominado main. Assim, uma classe que vá estabelecer o ponto de partida para a execução de uma aplicação na JVM deve conter pelo menos esse método. Esse exemplo clássico define uma aplicação que simplesmente envia uma string para a saída padrão, identificada pelo objeto público System.out: c � 2001 FEEC/UNICAMP 35 Programação orientada a objetos com Java 2.7. O ambiente de Java 1 public class Hello { 2 public static void main(String[] args) { 3 System.out.println("Oi!"); 4 System.exit(0); 5 } 6 } Uma vez que o programa tenha sido salvo em um arquivo com extensão .java, é preciso compilá-lo. Para compilar um programa Java, a ferramenta oferecida pelo kit de desenvolvimento Java é o compilador Java, javac. Na forma mais básica de execução, o javac é invocado da linha de comando tendo por argumento o nome do arquivo com o código Java a ser compilado: > javac Hello.java A unidade de compilação é o arquivo com extensão .java; esse arquivo pode conter a definição de várias classes, mas apenas uma delas pode ser pública. A classe pública em um arquivo fonte define o nome desse arquivo, que obrigatoriamente deve ter o mesmo nome dessa classe. Para cada definição de classe na unidade de compilação, o compilador Java irá gerar um arquivo com bytecodes com a extensão .class, tendo como nome o próprio nome da classe. Uma vez que um programa Java tenha sido compilado e esteja pronto para ser executado, isto se dá através do comando java — o interpretador Java, que ativa a máquina virtual Java, carrega a classe especificada e ativa seu método main. Por exemplo, para interpretar o arquivo Hello.class contendo o bytecode correspondente ao código fonte do arquivo Hello.java, utiliza-se a linha de comando > java Hello Observe que a extensão .class não é incluída nessa linha de comando — se o for, uma mensa- gem de erro será gerada, pois para a máquina virtual Java o caráter ’.’ está associado à definição de uma hierarquia de pacotes. Se a máquina virtual Java do interpretador não encontrar um método de nome main com a assinatura correta (public, static, void e com um argumento do tipo String[]) na classe especificada, uma exceção será gerada em tempo de execução: Exception in thread "main" java.lang.NoSuchMethodError: main Essa mensagem pode ser emitida pela ausência completa de um método main na classe ou por uma declaração incorreta para o método. Se um programa Java for desenvolvido como applet (ver Seção 4.3), ele não poderá ser executado diretamente através do interpretador Java mas sim através da ativação de uma página HTML. Para executar esse tipo de aplicação pode-se utilizar um navegador; porém, o ambiente de desenvolvimento Java oferece a aplicação appletviewer que extrai da página HTML apenas o espaço de exibição do applet e permite controlar sua execução através de comandos em sua interface gráfica. c � 2001 FEEC/UNICAMP 36 Capítulo 3 Uso das classes da API padrão de Java Um dos grandes atrativos da programação orientada a objetos é a possibilidade de adaptar funcio- nalidades oferecidas em classes existentes às necessidades de cada aplicação. Java, não diferentemen- te, oferece essa facilidade, aliando-a ao oferecimento de um amplo conjunto de classes organizadas nos pacotes da API padrão. As classes que compõem o núcleo de funcionalidades Java estão organizadas em pacotes, grupos de classes, interfaces e exceções afins ou de uma mesma aplicação. Entre os principais pacotes oferecidos como parte do núcleo Java estão: java.lang, java.util, java.io, java.awt, java.applet e java.net. Observe que esses nomes seguem a convenção Java, pela qual nomes de pacotes (assim como nomes de métodos) são grafados em letras minúsculas, enquanto nomes de classes têm a primeira letra (de cada palavra, no caso de nomes compostos) grafada com letra maiúscula. 3.1 Funcionalidades básicas O pacote java.lang contém as classes que constituem recursos básicos da linguagem, necessários à execução de qualquer programa Java. A classe Object expressa o conjunto de funcionalidades comuns a todos os objetos Java, sendo a raiz da hierarquia de classes Java. As classes Class e ClassLoader representam, respectivamente classes Java e o mecanismo para carregá-las dinamicamente para a Máquina Virtual Java. A classe String permite a representação e a manipulação de strings cujo conteúdo não pode ser modificado. Para manipular string modificáveis — por exemplo, através da inserção de um caráter na string — a classe StringBuffer é oferecida. A classe Math contém a definição de métodos para cálculo de funções matemáticas (trigono- métricas, logarítimicas, exponenciais, etc.) e de constantes, tais como E e PI. Todos os métodos e constantes definidos nessa classe são estáticos, ou seja, para utilizá-los basta usar como prefixo o nome da classe. O pacote oferece também um conjunto de classes wrappers. Um objeto de uma classe wrapper contém um único valor de um tipo primitivo da linguagem, permitindo assim estabelecer uma ponte entre valores literais e objetos. Essas classes são Boolean, Character, Byte, Short, Inte- ger, Long, Float e Double. Além dos métodos para obter o valor associado ao objeto de cada 37 Programação orientada a objetos com Java 3.2. Entrada e saída uma dessas classes, métodos auxiliares como a conversão de e para strings são suportados. As classes System, Runtime e Process permitem interação da aplicação Java com o ambi- ente de execução. Por exemplo, a classe System tem três atributos públicos e estáticos associados aos arquivos padrão de um sistema operacional: System.in, para a entrada padrão; System.out, para a saída padrão; e System.err, para a saída padrão de erros. Adicionalmente, as classes Th- read e ThreadGroup, assim como a interface Runnable, dão suporte à execução de múltiplas linhas de execução que podem ser associadas a um processo. As classes que definem erros e exceções, respectivamente Error e Exception, são também definidas nesse pacote. A classe Error é a raiz para condições de erro não-tratáveis, tais como Ou- tOfMemoryError. Já a classe Exception está associada à hierarquia de condições que podem ser detectados e tratados pelo programa, como ArithmeticException (divisão inteira por zero) e ArrayIndexOutOfBoundsException (acesso a elemento de arranjo além da última posição ou antes da primeira posição). Ambas as classes são derivadas de Throwable, também definida nesse pacote. Sub-pacotes relacionados à java.lang incluem java.lang.ref, de referências a objetos, e o pacote java.lang.reflect, que incorpora funcionalidades para permitir a manipulação do conteúdo de classes, ou seja, identificação de seus métodos e campos. Deve-se ressaltar ainda que funções matemáticas são definidas em java.lang.Math. Outro pacote, java.math, contém funcionalidades para manipular números inteiros e reais de precisão arbitrária. 3.2 Entrada e saída Por entrada e saída subentende-se o conjunto de mecanismos oferecidos para que um programa executando em um computador consiga respectivamente obter e fornecer informação de dispositivos externos ao ambiente de execução, composto pelo processador e memória principal. De forma genérica, havendo um dispositivo de entrada de dados habilitado, o programa obtém dados deste dispositivo através de uma operação read(). Similarmente, um dado pode ser enviado para um dispositivo de saída habilitado através de uma operação write(). A manipulação de entrada e saída de dados em Java é suportada através de classes do paco-