Programação Orientada a Objetos: Uma Abordagem com Java/Princípios da programação na linguagem Java/Classes Java/Definição de classes em Java

Definição de classes em JavaEditar

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.

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 sequê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 é:

[modificador] tipo nome [ = default];

onde

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).
tipo
deve ser um dos tipos primitivos da linguagem Java ou o nome de uma classe;
nome
deve ser um identificador válido da linguagem Java;
valor default
é opcional; se presente, especifica um valor inicial para a variável.

Métodos implementam as operações de uma classe. 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

modificador
é opcional e pode ser uma combinação de: public, protected ou private; abstract ou final; e static.
tipo
é um indicador do valor de retorno, sendo void se o método não tiver um valor de retorno;
nome do método
deve ser um identificador válido na linguagem Java;
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 em uma mesma classe desde que a lista de argumentos 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;
   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

x = 0; 
y = 0;

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;

Usualmente, métodos definidos em uma classe 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. 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. A expressão de retorno do método que calcula a distância entre dois pontos ilustra a utilização de um método estático da classe Math do pacote java.lang para o cômputo da raiz quadrada. Outros 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.