Programação Orientada a Objetos - JAVA

Programação Orientada a Objetos - JAVA

(Parte 4 de 12)

Para gerar esse tipo de documentação, os comentários devem estar localizados imediatamente antes da definição da classe ou membro (atributo ou método) documentado. Cada comentário pode conter uma descrição textual sobre a classe ou membro, possivelmente incluindo tags HTML, e diretrizes para o programa javadoc. As diretrizes para javadoc são sempre precedidas por @, como em

@see nomeClasseOuMembro que gera na documentação um link para a classe ou membro especificado, precedido pela frase “See also ”.

A documentação de uma classe pode incluir as diretrizes @author, que inclui o texto na seqüência como informação sobre o autor do código na documentação; e @version, que inclui na documentação informação sobre a versão do código.

A documentação de um método pode incluir as diretrizes @param, que apresenta o nome e uma descrição de cada argumento do método; @return, que apresenta uma descrição sobre o valor de retorno; e @exception,que indica que exceções podem ser lançadas pelo método (ver Seção 2.6.1).

Para maiores informações, veja o texto How to Write Doc Comments for Javadoc3 .

2.4 Operações sobre objetos

A criação de um objeto dá-se através da aplicação do operador new. Dada uma classe Cls, é possível (em princípio) criar um objeto dessa classe usando esse operador:

Cls obj = new Cls();

O “método” à direita do operador new é um construtor da classe Cls. Um construtor é um (pseudo-)método especial, definido para cada classe. O corpo desse método determina as atividades associadas à inicialização de cada objeto criado. Assim, o construtor é apenas invocado no momento da criação do objeto através do operador new.

A assinatura de um construtor diferencia-se das assinaturas dos outros métodos por não ter nenhum tipo de retorno — nem mesmo void. Além disto, o nome do construtor deve ser o próprio nome da classe.

O construtor pode receber argumentos, como qualquer método. Usando o mecanismo de sobrecarga, mais de um construtor pode ser definido para uma classe.

Toda classe tem pelo menos um construtor sempre definido. Se nenhum construtor for explicitamente definido pelo programador da classe, um construtor default, que não recebe argumentos, é criado pelo compilador Java. No entanto, se o programador da classe criar pelo menos um método construtor, o construtor default não será criado automaticamente — se ele o desejar, deverá criar um construtor sem argumentos explicitamente.

No momento em que um construtor é invocado, a seguinte seqüência de ações é executada para a criação de um objeto:

1. O espaço para o objeto é alocado e seu conteúdo é inicializado (bitwise) com zeros.

2. O construtor da classe base é invocado. 3urlhttp://java.sun.com/products/jdk/javadoc/writingdoccomments.html

Programação orientada a objetos com Java 2.4. Operações sobre objetos

3. Os membros da classe são inicializados para o objeto, seguindo a ordem em que foram declarados na classe.

4. O restante do corpo do construtor é executado.

Seguir essa seqüência é uma necessidade de forma a garantir que, quando o corpo de um construtor esteja sendo executado, o objeto já terá à disposição as funcionalidades mínimas necessárias, quais sejam aquelas definidas por seus ancestrais. O primeiro passo garante que nenhum campo do objeto terá um valor arbitrário, que possa tornar erros de não inicialização difíceis de detectar. Esse passo é que determina os valores default para atributos de tipos primitivos, descritos na Seção 2.1.

Uma vez que um objeto tenha sido criado e haja uma referência válida para ele, é possível solicitar que ele execute métodos que foram definidos para objetos dessa classe. A aplicação de um método meth(int), definido em uma classe Cls, a um objeto obj, construído a partir da especificação de Cls, se dá através da construção obj.meth(varint); onde varint é uma expressão ou variável inteira anteriormente definida.

Em uma linguagem tradicional, a forma correspondente seria invocar uma função ou procedimento passando como argumento a estrutura de dados sobre a qual as operações teriam efeito:

meth(obj, varint);

Esse “atributo implícito” — a referência para o próprio objeto que está ativando o método — pode ser utilizado no corpo dos métodos quando for necessário fazê-lo explicitamente. Para tanto, a palavra-chave this é utilizada. Quando se declara uma variável cujo tipo é o nome de uma classe, como em

String nome; não está se criando um objeto dessa classe, mas simplesmente uma referência para um objeto da classe String, a qual inicialmente não faz referência a nenhum objeto válido.

Quando um objeto dessa classe é criado, obtém-se uma referência válida, que é armazenada na variável cujo tipo é o nome da classe do objeto. Por exemplo, quando cria-se uma string como em nome = new String("POO/Java"); nome é uma variável que armazena uma referência válida para um objeto específico da classe String — o objeto cujo conteúdo é a string POO/Java. É importante ressaltar que a variável nome mantém apenas a referência para o objeto e não o objeto em si. Assim, uma atribuição como

String outroNome = nome; não cria outro objeto, mas simplesmente uma outra referência para o mesmo objeto.

A linguagem Java permite que o programador crie e manipule objetos explicitamente. Porém, a remoção de objetos em Java é manipulada automaticamente pelo sistema, usando um mecanismo de coleta de lixo (garbage collector). O coletor de lixo é um processo de baixa prioridade que permanece verificando quais objetos não têm nenhuma referência válida, retomando o espaço despendido para

Programação orientada a objetos com Java 2.4. Operações sobre objetos cada um desses objetos. Dessa forma, o programador não precisa se preocupar com a remoção explícita de objetos.

Outra operação que pode envolver um objeto é sua verificação de tipo. Dado um objeto obj e uma classe Cls, é possível verificar dinamicamente (durante a execução do método) se o objeto pertence ou não à classe usando o operador instanceof. Este retorna true se o objeto à esquerda do operador é da classe especificada à direita do operador. Assim, obj instanceof Cls retornaria true se obj fosse da classe Cls.

2.4.1 Arranjos

Arranjos são agregados homogêneos de valores que podem agrupar literais ou objetos. A declaração de um arranjo, como int array1[]; apenas cria uma referência para um arranjo de inteiros — porém o arranjo não foi criado. Assim como objetos, arranjos são criados com o operador new:

array1 = new int[100];

Essa expressão cria espaço para armazenar 100 inteiros no arranjo array1.

As duas expressões poderiam ter sido combinadas em uma sentença incluindo a declaração e a criação de espaço:

int array1[] = new int[100];

Arranjos podem ser alternativamente criados com a especificação de algum conteúdo: int array2[] = {2, 4, 5, 7, 9, 1, 13};

O acesso a elementos individuais de um arranjo é especificado através de um índice inteiro. O elemento inicial, assim como em C e C++, tem índice 0. Assim, do exemplo acima, a expressão int x = array2[3]; faz com que a variável x receba o valor 7, o conteúdo da quarta posição.

O acesso a elementos do arranjo além do último índice permitido — por exemplo, a array2[7] — gera um erro em tempo de execução, ou uma exceção (ver Seção 2.6.1).

A dimensão de um arranjo pode ser obtida através da propriedade length presente em todos os arranjos. Assim, a expressão int y = array2.length; faz com que y receba o valor 7, o número de elementos no arranjo array2.

Programação orientada a objetos com Java 2.4. Operações sobre objetos

2.4.2 Strings

Ao contrário do que ocorre em C e C++, strings em Java não são tratadas como seqüências de caracteres terminadas por NUL. São objetos, instâncias da classe java.lang.String. Uma string pode ser criada como em:

String s = "abc"; O operador + pode ser utilizado concatenar strings: System.out.println("String s: " + s);

Se, em uma mesma expressão, o operador + combinar valores numéricos e strings, os valores numéricos serão convertidos para strings e então concatenados.

A classe String define um conjunto de funcionalidades para manipular strings através de seus métodos.

Para obter o número de caracteres em uma string, o método int length() é usado. Assim, a expressão s.length(); retornaria o valor 3.

Paracriaruma nova stringa partirda concatenar duas strings, o método String concat(String outro) pode ser usado. Por exemplo,

String t = s.concat(".java"); faria com que a string t tivesse o conteúdo “abc.java”.

Para comparar o conteúdo de duas strings há três formas básicas. O método equals(String outro) compara as duas strings, retornando verdadeiro se seus conteúdos forem exatamente iguais. Assim, t.equals(s); retornaria falso, mas s.equals("abc"); retornaria verdadeiro. O método equalsIgnoreCase(String outro) tem a mesma funcionalidade mas ignora se as letras são maiúsculas ou minúsculas. Assim, s.equalsIgnoreCase("ABC"); também retornaria verdadeiro. A terceira forma é através do método compareTo(String outro), que retorna um valor inteiro igual a zero se as duas strings forem iguais, negativo se a string à qual o método for aplicado preceder lexicograficamente a string do argumento (baseado nos valores Unicode dos caracteres) ou positivo, caso contrário. Há também um método compareToIgnore- Case(String str).

Para extrair caracteres individuais de uma string, pode-se utilizar o método charAt(int pos), que retorna o caráter na posição especificada no argumento (0 é a primeira posição). Para obter substrings de uma string, o método substring() pode ser utilizado. Esse método tem duas assinaturas:

(Parte 4 de 12)

Comentários