Programação Orientada a Objetos - JAVA

Programação Orientada a Objetos - JAVA

(Parte 5 de 12)

Programação orientada a objetos com Java 2.5. Classes em Java

String substring(int pos_inicial); String substring(int pos_inicial, int pos_final);

A localização de uma substring dentro de uma string pode ocorrer de diversas formas. O método indexOf(), com quatro assinaturas distintas, retorna a primeira posição na string onde o caráter ou substring especificada no argumento ocorre. É possível também especificar uma posição diferente da inicial a partir de onde a busca deve ocorrer. Similarmente, lastIndexOf() busca pela última ocorrência do caráter ou substring a partir do final ou da posição especificada.

É possível também verificar se uma string começa com um determinado prefixo ou termina com um sufixo através respectivamente dos métodos startsWith() e endsWith(). Ambos recebem como argumento uma string e retornam um valor booleano.

2.5 Classes em Java

Como descrito na Seção 1.1, a definição de classes é a base da programação orientada a objetos.

Em Java, classes são definidas em arquivos fonte (extensão .java) e compiladas para arquivos de classes (extensão .class). Classes são organizadas em pacotes.

No desenvolvimento de pequenas atividades ou aplicações, é viável manter o código da aplicação e suas classes associadas em um mesmo diretório detrabalho — em geral, o diretório corrente. No entanto, para grandes aplicações é preciso organizar as classes de maneira a evitar problemas com nomes duplicados de classes e permitir a localização do código da classe de forma eficiente.

Em Java, a solução para esse problema está na organização de classes e interfaces em pacotes.

Um pacote é uma unidade de organização de código que congrega classes, interfaces e exceções relacionadas. O código-base de Java está todo estruturado em pacotes e as aplicações desenvolvidas em Java também devem ser assim organizadas.

Essencialmente, uma classe Xyz que pertence a um pacote nome.do.pacote tem um “nome completo” que é nome.do.pacote.Xyz. Assim, se outra aplicação tiver uma classe de mesmo nome não haverá conflitos de resolução, pois classes em pacotes diferentes têm nomes completos distintos.

A organização das classes em pacotes também serve como indicação para o compilador Java para encontrar o arquivo que contém o código da classe. O ambiente Java normalmente utiliza a especificação de uma variável de ambiente CLASSPATH, a qual define uma lista de diretórios que contém os arquivos de classes Java. No entanto, para não ter listas demasiadamente longas, os nomes dos pacotes definem subdiretórios de busca a partir dos diretórios em CLASSPATH.

No mesmo exemplo, ao encontrar no código uma referência para a classe Xyz, o compilador deverá procurar o arquivo com o nome Xyz.class; como essa classe faz parte do pacote nome.do.pacote, ele irá procurar em algum subdiretório nome/do/pacote. Se o arquivo Xyz.class estiver no diretório /home/java/nome/do/pacote, então o diretório /home/ java deve estar incluído no caminho de busca de classes definido por CLASSPATH.

Para indicar que as definições de um arquivo fonte Java fazem parte de um determinado pacote, a primeira linha de código deve ser a declaração de pacote:

Programação orientada a objetos com Java 2.5. Classes em Java package nome.do.pacote;

Caso tal declaração não esteja presente, as classes farão parte do “pacote default”, que está mapeado para o diretório corrente.

Para referenciar uma classe de um pacote no código fonte, é possível sempre usar o “nome completo” da classe; no entanto, é possível também usar a declaração import. Por exemplo, se no início do código estiver presente a declaração import nome.do.pacote.Xyz; então a classe Xyz pode ser referenciada sem o prefixo nome.do.pacote no restante do código. Alternativamente, a declaração import nome.do.pacote.*; indica que quaisquer classes do pacote especificado podem ser referenciadas apenas pelo nome no restante do código fonte.

A única exceção para essa regra refere-se às classes do pacote java.lang — essas classes são consideradas essenciais para a interpretação de qualquer programa Java e, por este motivo, o correspondente import é implícito na definição de qualquer classe Java.

2.5.2 Definição de classes em Java

Em Java, classes são definidas através do uso da palavra-chave class. Para definir uma classe, utiliza-se a construção:

[modif] class NomeDaClasse { // corpo da classe... }

A primeira linha é um comando que inicia a declaração da classe. Após a palavra-chave class, segue-se o nome da classe, que deve ser um identificador válido para a linguagem (ver Seção 2.2). O modificador modif é opcional; se presente, pode ser uma combinação de public e abstract ou final.

A definição da classe propriamente dita está entre as chaves { e }, que delimitam blocos na linguagem Java. Este corpo da classe usualmente obedece à seguinte seqüência de definição:

1. As variáveis de classe (definidas como static), ordenadas segundo sua visibilidade: iniciando pelas public, seguidos pelas protected, pelas com visibilidade padrão (sem modificador) e finalmente pelas private.

2. Os atributos (ou variáveis de instância) dos objetos dessa classe, seguindo a mesma ordenação segundo a visibilidade definida para as variáveis de classe.

3. Os construtores de objetos dessa classe.

4. Os métodos da classe, geralmente agrupados por funcionalidade.

A definição de atributos de uma classe Java reflete de forma quase direta a informação que estaria contida na representação da classe em um diagrama UML. Para tanto, a sintaxe utilizada para definir um atributo de um objeto é:

Programação orientada a objetos com Java 2.5. Classes em Java [modificador] tipo nome [ = default]; onde o modificador é opcional, especificando a visibilidade diferente da padrão (public, protected ou private), alteração da modificabilidade (final) e se o atributo está associado à classe (static).o tipo deve ser um dos tipos primitivos da linguagem Java ou o nome de uma classe;o nome deve ser um identificador válido da linguagem Java;o valor default é opcional; se presente, especifica um valor inicial para a variável.

Métodos são essencialmente procedimentos que podem manipular atributos de objetos para os quais o método foi definido. Além dos atributos de objetos, métodos podem definir e manipular variáveis locais; também podem receber parâmetros por valor através da lista de argumentos. A forma genérica para a definição de um método em uma classe é

[modificador] tipo nome(argumentos) { corpo do método } onde o modificador (opcional) é uma combinação de: public, protected ou private; abstract ou final; e static.o tipo é um indicador do valor de retorno, sendo void se o método não tiver um valor de retorno;o nome do método deve ser um identificador válido na linguagem Java;os argumentos são representados por uma lista de parâmetros separados por vírgulas, onde para cada parâmetro é indicado primeiro o tipo e depois (separado por espaço) o nome.

Uma boa prática de programação é manter a funcionalidade de um método simples, desempenhando uma única tarefa. O nome do método deve refletir de modo adequado a tarefa realizada. Se a funcionalidade do método for simples, será fácil encontrar um nome adequado para o método.

Como ocorre para a definição de atributos, a definição de métodos reflete de forma quase direta a informação que estaria presente em um diagrama de classes UML, a não ser por uma diferença vital: o corpo do método.

Métodos de mesmo nome podem co-existir emuma mesma classe desdeque a lista deargumentos seja distinta, usando o mecanismo de sobrecarga. O exemplo a seguir ilustra a definição de uma classe de nome Ponto2D:

public class Ponto2D { private int x; private int y;

Programação orientada a objetos com Java 2.5. Classes em Java public Ponto2D(int x, int y) { this.x = x; this.y = y; } public Ponto2D( ) { this(0,0); } public double distancia(Ponto2D p) { double distX = p.x - x; double distY = p.y - y; return Math.sqrt(distX*distX + distY*distY); }

Um objeto dessa classe tem dois atributos privativos que definem as coordenadas do ponto bidimensional, x e y — nesse caso, as coordenadas são valores inteiros.

A classe tem dois construtores. O primeiro deles recebe dois argumentos, também de nome x e y, que definem as coordenadas do ponto criado. Para diferenciar no corpo do construtor os parâmetros dos atributos, estes têm seu nome prefixado pela palavra-chave this.

O segundo construtor ilustra outro uso da palavra-chave this. Esse construtor não recebe argumentos e assume portanto o ponto tem como cordenadas a origem, ou seja, o ponto (0,0). O corpo desse construtor poderia ser simplesmente

A alternativa apresentada usa a forma this(0,0); que equivale a “use o construtor desta mesma classe que recebe dois argumentos inteiros, passando os valores aqui especificados”.

Finalmente, a classe define um método público para calcular a distância entre o ponto que invocou o método (this) e outro ponto especificado como o argumento p. Nesse caso, como não há risco de confusão, não é preciso usar a palavra-chave this antes dos atributos da coordenada do objeto. Assim, as expressões que calculam distX e distY equivalem a double distX = p.x - this.x; double distY = p.y - this.y;

A expressão de retorno ilustra ainda a utilização de um método estático da classe Math do pacote java.lang para o cômputo da raiz quadrada. Usualmente, métodos definidos em uma são aplicados a objetos daquela classe. Há no entanto situações nas quais um método pode fazer uso dos recursos de uma classe para realizar sua tarefa sem necessariamente ter de estar associado a um objeto individualmente.

Programação orientada a objetos com Java 2.5. Classes em Java

Para lidar com tais situações, Java define os métodos da classe, cuja declaração deve conter o modificador static. Um método estático pode ser aplicado à classe e não necessariamente a um objeto.

Exemplos de métodos estáticos em Java incluem os métodos para manipulação de tipos primitivos definidos nas classes Character, Integer e Double, todas elas do pacote java.lang, assim como todos os métodos definidos para a classe Math.

2.5.3 O método main

Toda classe pode também ter um método main associado, que será utilizado pelo interpretador

Java para dar início à execução de uma aplicação. Ao contrário do que acontece em C e C++, onde apenas uma função main deve ser definida para a aplicação como um todo, toda e qualquer classe Java pode ter um método main definido. Apenas no momento da interpretação o main a ser executado é definido através do primeiro argumento (o nome da classe) para o programa interpretador.

O método main é um método associado à classe e não a um objeto específico da classe — assim, ele é definido como um método estático. Adicionalmente, deve ser um método público para permitir sua execução a partir da máquina virtual Java. Não tem valor de retorno, mas recebe como argumento um arranjo de strings que corresponde aos parâmetros que podem ser passados para a aplicação a partir da linha de comando. Essas características determinam a assinatura do método:

public static void main(String[] args) ou static public void main(String[] args)

(Parte 5 de 12)

Comentários