Classe, Objeto e UML
A anatomia de uma classe: nome, atributos e métodos. Como ler um diagrama de classes UML, a diferença entre molde e instância, sua primeira classe do zero e o que acontece na memória quando um objeto nasce.
Anatomia de uma classe
Na Aula 01 vimos que um objeto tem atributos e ações. A classe é onde declaramos isso. Toda classe precisa, inicialmente, de três coisas: um nome, seus atributos e seus métodos.
A sintaxe mínima de uma classe em Java é só uma "casca" com nome e um corpo entre chaves:
class nome_da_classe { // corpo da classe: atributos e métodos vêm aqui }
.java. A classe Cachorro → arquivo Cachorro.java.Diagrama de Classes UML
Antes de escrever código, a UML deixa modelar o sistema visualmente. O Diagrama de Classes é o mapa da estrutura: usa exatamente as três partes que você acabou de ver — nome, atributos e métodos —, só que com uma notação padrão.
Classe vs Objeto — molde vs instância
Classe é o molde — define estrutura e comportamento. Objeto é a instância — ocupa memória, tem estado próprio. Uma classe pode gerar milhares de objetos distintos, cada um com seus próprios valores.
new — cada new reserva memória e cria uma instância independenteSeu primeiro código: a classe Cachorro
Vamos do jeito mais simples possível. Aqui os atributos ficam abertos (acessíveis direto) — sem private, sem getters. Isso é de propósito: proteger os dados é o tema da próxima aula. Por enquanto, só queremos criar e usar um objeto.
public class Cachorro { // atributos (campos) — o estado do objeto int tamanho; String raça; // método (ação) — o comportamento do objeto void latir() { System.out.println("Au, Au, Au!!"); } }
Em outro arquivo, a classe Main cria um objeto Cachorro, preenche seus atributos e chama sua ação:
public class Main { public static void main(String[] args) { // new cria o objeto; pitbull guarda a referência a ele Cachorro pitbull = new Cachorro(); pitbull.raça = "Pit Bull"; // acessa o atributo direto pitbull.tamanho = 40; pitbull.latir(); // chama a ação → Au, Au, Au!! } }
javac *.java (compila os dois arquivos) e depois java Main. Saída: Au, Au, Au!!O que acontece na memória
Quando você escreve new Cachorro(), duas coisas acontecem na memória RAM. O objeto (com seus dados) é criado no heap. A variável pitbull fica na stack e guarda apenas o endereço (a referência) desse objeto — não o objeto em si.
new cria no heap e devolve a referência.Cachorro c2 = pitbull; não copia o objeto — copia o endereço. Os dois nomes apontam para o MESMO cachorro no heap. Mudar c2.tamanho muda pitbull.tamanho também.new de novo — cada new é um endereço diferente no heapEvoluindo a classe: métodos com lógica
O Cachorro tinha um método simples. Agora a Conta do diagrama UML: os métodos recebem parâmetros e fazem contas. Note que os atributos continuam abertos — vamos manter assim até a Aula 03.
public class Conta { String titular; // atributos abertos (por enquanto) double saldo; int numero; void creditar(double valor) { saldo = saldo + valor; // soma ao saldo } double debitar(double valor) { saldo = saldo - valor; // subtrai do saldo return saldo; // devolve o novo saldo } }
Conta c = new Conta(); c.titular = "Ana"; c.creditar(100.0); c.debitar(30.0); System.out.println(c.saldo); // 70.0 // PROBLEMA: nada impede isto 👇 c.saldo = -9999; // saldo inválido, e ninguém barra!
saldo = -9999. A solução — esconder os atributos com private e controlar o acesso por métodos — é o encapsulamento, o assunto da próxima aula.Tipos primitivos vs Wrapper
Java tem 8 tipos primitivos (int, double, boolean...) que NÃO são objetos. Para usar em coleções genéricas, use os Wrappers correspondentes.
| Primitivo | Wrapper | Uso típico |
|---|---|---|
| int | Integer | variável, cálculo (mais rápido) |
| double | Double | ponto flutuante |
| boolean | Boolean | flag |
| char | Character | caractere |
| long | Long | valores grandes |