Programação Orientada a Objetos: Uma Abordagem com Java/Introdução/Classes
Classes
[editar | editar código-fonte]A definiçã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 Unified Modeling Language (UML).
Uma classe é um gabarito para a definição de objetos. Pela definição de uma classe, descrevem-se as propriedades — ou atributos — que o objeto terá. Além da especificação de atributos, a definiçã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 definidos para a classe.
Uma vez que estejam definidas 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
[editar | editar código-fonte]Na UML, a representação para uma classe no diagrama de classes é tipicamente expressa na forma gráfica 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 identificador 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 é identificado 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 especifica um valor inicial para o atributo.
As operações definem 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 identificador (o nome da operação), o tipo para o valor de retorno e sua lista de argumentos, sendo cada argumento identificado 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 conflito 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
[editar | editar código-fonte]O modificador de visibilidade pode estar presente tanto para atributos como para métodos. Em princípio, três categorias de visibilidade podem ser definidas:
- 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.