Componentes básicos de um diagrama de classes
Dependendo do contexto, as classes em um diagrama de classes podem representar os objetos principais, as interações no aplicativo ou as classes a serem programadas. Para responder à pergunta "O que é um diagrama de classes na UML?", você deve primeiro entender sua composição básica.
- Classes: um modelo para criar objetos e implementar comportamento em um sistema. Na UML, uma classe representa um objeto ou um conjunto de objetos que compartilham uma estrutura e um comportamento comuns. Elas são representadas por um retângulo que inclui linhas com o nome da classe, seus atributos e suas operações. Ao desenhar uma classe em um diagrama de classes, você só precisa preencher a linha superior — as outras são opcionais caso queira fornecer mais detalhes.
- Sinais: símbolos que representam comunicações assíncronas e unidirecionais entre objetos ativos.
- Tipos de dados: classificadores que definem valores de dados. Os tipos de dados podem modelar tanto tipos primitivos quanto enumerações.
- Pacotes: formas projetadas para organizar classificadores relacionados em um diagrama. Eles são simbolizados por uma forma de retângulo grande com guias.
- Interfaces: uma coleção de assinaturas de operação e/ou definições de atributos que definem um conjunto coeso de comportamentos. As interfaces são semelhantes às classes, exceto que uma classe pode ter uma instância do seu tipo, e uma interface deve ter pelo menos uma classe para implementá-la.
- Enumerações: representações de tipos de dados definidos pelo usuário. Uma enumeração inclui grupos de identificadores que representam valores da enumeração.
- Objetos: instâncias de uma ou mais classes. Os objetos podem ser adicionados a um diagrama de classes para representar instâncias concretas ou prototípicas.
- Artefatos: elementos de modelo que representam as entidades concretas em um sistema de software, como documentos, bancos de dados, arquivos executáveis, componentes de software etc.
Seções de uma classe
A classe padrão éposta por três seções:
Seção superior
Contém o nome da classe. Esta seção é sempre obrigatória, seja falando do classificador ou de um objeto. O nome da classe deve:
- Começar com letra maiúscula.
- Estar formatado em negrito.
- Estar centralizado na seção superior.
- Ser descritivo.
Seção central
Contém os atributos da classe. Use esta seção para descrever as qualidades da classe. Isso só é obrigatório ao descrever uma instância específica de uma classe.
Seção inferior
Inclui as operações (métodos) da classe. Exibida em formato de lista, cada operação ocupa sua própria linha. As operações descrevem como uma classe interage com os dados. O texto nas duas seções inferiores geralmente é alinhado à esquerda e digitado com as primeiras letras minúsculas.
Modificadores de acesso de membros
Todas as classes têm níveis de acesso diferentes dependendo do modificador de acesso (visibilidade). Aqui estão os níveis de acesso com seus respectivos símbolos:
- Público (+)
- Privado (-)
- Protegido (#)
- Pacote (~)
- Derivado (/)
- Estático (sublinhado)
Escopos de membros
Existem dois escopos para membros: classificadores e instâncias.
Os classificadores costumam ser reconhecidos como estáticos, o que significa que os valores dos atributos permanecem os mesmos em todas as instâncias e a invocação do método não afeta o estado da instância. Em comparação, as instâncias contêm métodos que podem alterar o estado da instância e valores de atributos que podem variar entre as instâncias. Para indicar um classificador, basta sublinhar seu nome; deixe o texto sem formatação para indicar uma instância.
Interações
O termo "interações" refere-se aos vários relacionamentos e links que podem existir em diagramas de classes e objetos. Algumas das interações mais comuns incluem:
Herança: o processo de uma classe filha ou subclasse assumir a funcionalidade de uma classe pai ou superclasse, também conhecida como generalização. É simbolizada por uma linha reta conectada com uma ponta de seta fechada apontando para a superclasse.

Neste exemplo, o objeto "Carro" herdaria todos os atributos (velocidade, número de passageiros e combustível) e métodos (go(), stop(), changeDirection()) da classe pai ("Veículo"), além dos atributos específicos (tipo de modelo, número de portas e fabricante) e métodos de sua própria classe (Radio(), windshieldWiper(), ac/heat()). A herança é mostrada em um diagrama de classes usando uma linha sólida com uma seta fechada e vazia.
Associação bidirecional: o relacionamento padrão entre duas classes. Ambas as classes têm conhecimento uma da outra e de seu relacionamento com a outra. Essa associação é representada por uma linha reta entre duas classes.

No exemplo acima, a classe Car e a classe RoadTrip estão inter-relacionadas. Em uma extremidade da linha, o Car assume a associação de "assignedCar" com o valor de multiplicidade de 0..1, de modo que, quando a instância de RoadTrip existir, ela poderá ter uma instância de Car associada a ela ou nenhum Car associado a ela. Nesse caso, uma classe Caravan separada com um valor de multiplicidade de 0..* é necessária para demonstrar que uma RoadTrip poderia ter múltiplas instâncias de Cars associadas a ela. Como uma instância de Car poderia ter múltiplas associações "getRoadTrip" — em outras palavras, um carro poderia fazer várias viagens — o valor da multiplicidade é definido como 0..*
Associação unidirecional: um relacionamento um pouco menos comum entre duas classes. Uma classe tem conhecimento da outra e interage com ela. A associação unidirecional é modelada com uma linha de conexão reta que aponta uma ponta de seta aberta da classe que conhece para a classe conhecida.

Como exemplo, em sua viagem pelo Arizona, você pode se deparar com um radar de velocidade onde uma câmera registra sua atividade de direção, mas você não saberá disso até receber uma notificação pelo correio. Não está desenhado na imagem, mas, neste caso, o valor da multiplicidade seria 0..*, dependendo de quantas vezes você passar pelo radar.