# Classes

A deﬁnição de classes e seus inter-relacionamentos é o principal resultado da etapa de projeto de software. Em geral, esse resultado é expresso em termos de alguma linguagem de modelagem, tal como a Uniﬁed Modeling Language (UML).
Uma classe é um gabarito para a deﬁnição de objetos. Pela deﬁnição de uma classe, descrevem-se as propriedades — ou atributos — que o objeto terá. Além da especiﬁcação de atributos, a deﬁnição de uma classe descreve também qual o comportamento de objetos da classe, ou seja, que funcionalidades podem ser aplicadas a objetos da classe. Essas funcionalidades são definidas por operações e realizadas por métodos. Um método nada mais é que o equivalente a um procedimento ou função, com a restrição que ele manipula apenas suas variáveis locais e os atributos que foram deﬁnidos para a classe.
Uma vez que estejam deﬁnidas quais serão as classes que irão compor uma aplicação, assim como qual deve ser sua estrutura interna e comportamento, é possível criar essas classes em Java.

## Elementos de uma classe

Na UML, a representação para uma classe no diagrama de classes é tipicamente expressa na forma gráﬁca por um retângulo com divisões para o nome da classe, o conjunto de atributos e o conjunto de operações.
O nome da classe é um identiﬁcador para a classe, que permite referenciá-la posteriormente — por exemplo, no momento da criação de um objeto.
O conjunto de atributos descreve as propriedades da classe. Cada atributo é identiﬁcado por um nome e tem um tipo associado. Em uma linguagem de programação orientada a objetos pura, o tipo é o nome de uma classe. Na prática, a maior parte das linguagens de programação orientada a objetos oferecem um grupo de tipos primitivos, como inteiro, real e caráter, que também podem ser usados na descrição de atributos. O atributo pode ainda ter um valor_default opcional, que especiﬁca um valor inicial para o atributo.
As operações deﬁnem as funcionalidades da classe, ou seja, o que será possível fazer com objetos dessa classe. Cada operação tem uma assinatura, composta por um identiﬁcador (o nome da operação), o tipo para o valor de retorno e sua lista de argumentos, sendo cada argumento identiﬁcado por seu tipo e nome. Pelo mecanismo de sobrecarga (overloading), duas operações de uma classe podem ter o mesmo nome, desde que suas assinaturas sejam diferentes. Tal situação não gera conﬂito pois o compilador é capaz de detectar qual método que implementa a operação deve ser escolhido a partir da análise dos tipos dos argumentos do método. Nesse caso, diz-se que ocorre a ligação prematura (early binding) para o método correto.

## Modificadores

O modiﬁcador de visibilidade pode estar presente tanto para atributos como para métodos. Em princípio, três categorias de visibilidade podem ser deﬁnidas:

### público

    denotado em UML pelo símbolo +: nesse caso, o atributo ou método de um objeto dessa classe pode ser acessado por qualquer outro objeto (visibilidade externa total);

### privativo

    denotado em UML pelo símbolo -: nesse caso, o atributo ou método de um objeto dessa classe não pode ser acessado por nenhum outro objeto (nenhuma visibilidade externa);

### protegido

    denotado em UML pelo símbolo #: nesse caso, o atributo ou método de um objeto dessa classe poderá ser acessado apenas por objetos de classes que sejam derivadas dessa através do mecanismo de herança.
Outros modificadores podem estar presentes, mas esses serão vistos adiante.