← → navega · N notas · F tela cheia
Módulo 1 de 5

Classes, Objetos
e Memória

Do paradigma da Orientação a Objetos à anatomia da classe, à instanciação com new e ao que realmente acontece na memória.

Programação Orientada a Objetos em Java  ·  Docente: Profa. Andréa Barboza Proto Sardi
Abertura. Este módulo assume que o ambiente (Módulo 0) já está instalado. O objetivo é o aluno sair sabendo modelar uma entidade simples como classe, criar objetos e explicar onde cada coisa vive na memória. Diga à turma que tudo aqui converge para um projeto único — o Sistema de Gestão Acadêmica — que começa hoje com a classe Aluno.
Módulo 1 · Abertura

Objetivos de aprendizagem

Ao final deste módulo, você será capaz de:

🧩Modelar

Transformar uma entidade do mundo real em uma classe com atributos e métodos.

⚙️Instanciar

Criar objetos com new e acessar seu estado e comportamento.

🧠Explicar a memória

Diferenciar stack e heap e o papel das referências.

🔧Inicializar bem

Usar construtores, a palavra-chave this e toString.

Objetivos. Leia os quatro verbos: modelar, instanciar, explicar a memória, inicializar. Eles são também os critérios de avaliação do módulo. Reforce que "explicar a memória" é o que separa quem decora sintaxe de quem entende POO.
Retomada · Situação-problema

Por que mudar de paradigma?

Você já programa: variáveis, funções, laços, vetores. Isso é o paradigma procedural. Ele funciona — até o sistema crescer.

💥
o problema
Num cadastro com 500 linhas no main, qualquer função acessa qualquer dado. Adicionar um campo quebra dezenas de pontos, e nada impede uma nota -50.

🎯A ideia da POO

Agrupar dados e comportamento que andam juntos dentro de uma mesma unidade — o objeto. O mundo já é feito de objetos; vamos programar assim.

?
Verificação
Cite um problema do código procedural que a POO promete resolver.
Gancho. Pergunte quem já teve um main gigante que ninguém mais entendia. Valide a dor. A POO não é "mais difícil" — é uma forma de organizar que espelha como pensamos sobre o mundo. Não entre em encapsulamento ainda (é Módulo 2); aqui só plantamos a semente "dados + comportamento juntos".
O paradigma OO

Molde e instância

A POO modela aplicações por meio de objetos do mundo real. E todo objeto nasce de um molde.

📐O Molde — a Classe

Define as características e ações possíveis. É a planta do projeto. Existe uma vez.

🚗A Instância — o Objeto

A materialização do molde com dados reais. Você cria quantas quiser.

🔑
ponto central
Uma classe Carro → milhares de carros, cada um com sua cor e placa. A classe determina o objeto.
Analogia. Forma de bolo (classe) × bolos (objetos): mesma forma, recheios diferentes. Outra: planta da casa × casas construídas. Deixe a turma propor exemplos (caneta, celular, conta bancária). Não confunda: a planta não "mora" em lugar nenhum físico; quem ocupa espaço é a casa (o objeto na memória — veremos em heap).
Conceito 1

O que é uma classe

Uma classe é a definição de um novo tipo. Além de int e String, você passa a criar seus próprios tipos: Cachorro, Conta, Aluno.

Aluno.javajava
class Aluno {
    // corpo da classe: atributos e métodos virão aqui
}
📄
regra do arquivo
Uma classe pública mora num arquivo de mesmo nome + extensão .java. A classe Aluno → arquivo Aluno.java.
Tipo novo. O insight poderoso: a linguagem é extensível. Quando escrevemos class Aluno, ensinamos ao Java um substantivo novo do nosso domínio. A partir daí podemos declarar variáveis do tipo Aluno, exatamente como fazemos com int. Mostre o paralelo com banco de dados: classe ≈ tabela/entidade.
Conceito 2

Estado e comportamento

📦Atributos = ESTADO

O que o objeto tem. Variáveis que guardam os dados: tamanho, raça, saldo, nome.

Métodos = COMPORTAMENTO

O que o objeto faz. Ações que ele executa: latir(), creditar(), calcularMedia().

🧭
como decidir
É um substantivo que descreve o objeto? Vira atributo. É um verbo, uma ação? Vira método.
?
Atividade
Para um objeto Lâmpada, dê 2 atributos e 2 métodos.
Estado × comportamento. Repita o mantra "atributo = tem (substantivo); método = faz (verbo)". Faça a atividade ao vivo: Lâmpada → atributos (ligada, potência, cor); métodos (ligar(), desligar()). Esse vocabulário vai sustentar o módulo inteiro.
Conceito 3

A anatomia de uma classe

Cachorro tamanho : int raça : String latir() : void correr() : void Tipo Atributoso estado Métodoso comportamento
Diagrama UML de classe: três compartimentos — nome, atributos, métodos.
forma geral
class NomeDaClasse {
  // 1. Atributos (estado)
  tipo nomeDoAtributo;

  // 2. Métodos (comportamento)
  tipoRetorno nomeDoMetodo(args) {
    // instruções
  }
}
🔎
leia sempre assim
Nome no topo, estado no meio, comportamento embaixo.
Anatomia. Mostre que o diagrama UML e o código são a mesma informação em duas linguagens. A assinatura do método (tipo de retorno + nome + parâmetros) será detalhada adiante. Aqui ainda não usamos +/- (visibilidade) — isso é encapsulamento, Módulo 2.
Conceito 4

A classe principal e o main

Todo programa Java começa a executar em um único ponto: o método main.

Main.javajava
public class Main {
    public static void main(String[] args) {
        System.out.println("Olá, POO!");
    }
}
▶️
a assinatura é fixa
public static void main(String[] args) — a JVM procura exatamente esta assinatura para iniciar.
main. Não destrinche static agora (vem no Módulo 2) — diga apenas "é o ponto de entrada que a JVM chama". String[] args são parâmetros de linha de comando. Rode ao vivo: javac Main.javajava Main → "Olá, POO!". Conecte com o Módulo 0.
Conceito 5

Tipos primitivos

São os 8 tipos básicos do Java. Eles guardam valores diretos — não são objetos.

TipoGuardaExemplo
intinteiro40
doublereal (ponto flutuante)8.5
booleanverdadeiro/falsotrue
charum caractere'A'
TipoGuardaExemplo
longinteiro grande9000000000
floatreal (menor precisão)3.14f
byteinteiro minúsculo127
shortinteiro pequeno2000
📌
lembre-se
String não é primitivo — é uma classe. Por isso começa com letra maiúscula.
Primitivos. Foque nos quatro mais usados (int, double, boolean, char). O detalhe importante para o resto do módulo: primitivos guardam o valor; objetos guardam uma referência. Essa distinção explica a memória mais à frente. Wrappers (Integer, Double) ficam para o Módulo 3.
Conceito 6

Variáveis locais × atributos

🏠Atributo

Declarado na classe. Pertence ao objeto e vive enquanto o objeto existe. Guarda o estado.

⏱️Variável local

Declarada dentro de um método. Existe só durante a execução daquele método e some ao terminar.

🧠
prévia da memória
Variáveis locais e referências ficam na stack; o objeto e seus atributos ficam no heap. Veremos a seguir.
Escopo. Essa diferença é a ponte para stack/heap. Atributo = "memória do objeto"; variável local = "memória temporária do método". Erro comum: tentar usar uma variável local fora do método. Já anuncie que a stack guarda o efêmero e o heap guarda o duradouro.
Exemplo prático 1 · código progressivo

Modelando um Cachorro

Cachorro.javajava
public class Cachorro {
    // atributos (estado)
    int tamanho;
    String raça;

    // método (comportamento)
    void latir() {
        System.out.println("Au, Au, Au!!");
    }
}
🟢
por que void?
latir() só imprime; não devolve valor. Por isso o tipo de retorno é void.

Repare: os atributos estão abertos (sem private). É proposital — proteger dados é o tema do Módulo 2.

Cachorro. Este é o exemplo canônico da disciplina. Construa a classe ao vivo, atributo por atributo. Destaque void = "não retorna nada". Mantenha público de propósito para não introduzir encapsulamento fora de hora — avise a turma que faremos a versão protegida depois.
Conceito 7 · 8

Dando vida ao objeto

Uma classe é só o molde. Para usá-la, criamos um objeto com o operador new.

Main.java
// declara a variável de referência ......... e instancia o objeto
Cachorro pitbull          =          new Cachorro();

🏷️Cachorro pitbull

declara uma variável de referência — uma "etiqueta" que vai apontar para um objeto.

new Cachorro()

aloca um objeto novo na memória e devolve seu endereço para a etiqueta.

new. Separe os dois lados do =: à esquerda a etiqueta (referência), à direita a criação do objeto. new faz três coisas: reserva memória no heap, executa o construtor e devolve a referência. A etiqueta guarda o endereço, não o objeto — chave para o próximo bloco.
Exemplo prático 1 · continuação

Vários objetos do mesmo molde

Main.java
Cachorro pitbull = new Cachorro();
pitbull.raça = "Pit Bull";   // operador ponto (.)
pitbull.tamanho = 40;
pitbull.latir();

Cachorro viralata = new Cachorro();
viralata.raça = "Vira-Lata";
viralata.tamanho = 30;
viralata.latir();
🟢
operador ponto
O . acessa atributos e invoca métodos daquela instância específica.
# saída
Au, Au, Au!!
Au, Au, Au!!
?
Verificação
Mudar pitbull.tamanho altera o viralata.tamanho? Por quê?
Independência. Resposta da verificação: não — são objetos distintos, com estados independentes, em endereços diferentes do heap. A mesma classe gerou dois objetos sem qualquer relação de dados. Esse é o ponto que muitos confundem; reforce.
Conceito 9 · memória

Onde cada coisa mora

Ao executar new, o Java separa duas memórias:

📚STACK (pilha)

Guarda variáveis locais e referências. Rápida, organizada, ligada ao método em execução. A variável pitbull vive aqui — e guarda só o endereço.

🗄️HEAP (monte)

Guarda os objetos e seus atributos. Área dinâmica, sem tamanho fixo. É aqui que o Cachorro realmente existe.

⚠️
representação didática
Mostramos endereços como 0x7A3F só para ilustrar. Em Java você não manipula endereços diretamente — trabalha com referências.
Stack × Heap. Metáfora: a stack é uma pilha de pratos do método atual (some quando o método acaba); o heap é o depósito onde os objetos ficam guardados. A variável é um bilhete com o "número da prateleira". Deixe claro o aviso didático: nada de aritmética de ponteiros como em C.
Diagrama de memória

Cachorro pitbull = new Cachorro();

STACK · pilha variáveis locais e referências main() { pitbull → referência (0x7A3F) } aponta para HEAP · monte onde os objetos vivem : Cachorro @0x7A3F tamanho = 40 raça = "Pit Bull"
A variável na stack guarda o endereço; o objeto com os dados vive no heap.
Leitura do diagrama. Aponte a seta: "pitbull não contém o cachorro, contém o caminho até ele". Quando o método main terminar, a referência sai da stack; se ninguém mais apontar para o objeto, ele vira candidato à coleta de lixo (próximos slides).
Conceito · aliasing

Duas referências, um só objeto

Main.java
Cachorro c2 = pitbull;  // copia o endereço,
                       // NÃO o objeto
⚠️
cuidado
c2 = pitbull não cria um cachorro novo. Os dois nomes apontam para o mesmo objeto no heap.
pitbull c2 : Cachorrotamanho=40
Aliasing. Esse é um dos pontos mais escorregadios para iniciantes (e cai em prova). Desenhe na lousa: dois bilhetes apontando para a mesma prateleira. Para realmente copiar, seria preciso criar outro objeto com new e copiar atributo a atributo (construtor cópia) — mas isso é assunto futuro.
Demonstração

Mexeu em uma, mudou nas duas

Main.java
Cachorro pitbull = new Cachorro();
pitbull.tamanho = 40;

Cachorro c2 = pitbull;
c2.tamanho = 50;            // mexe pelo c2

System.out.println(pitbull.tamanho);
// → 50  (mesmo objeto!)
# saída
50
?
Atividade
Antes de rodar: o que será impresso? Justifique pela memória.
Demonstração ao vivo. Peça a previsão antes de executar (50). Como há um único objeto no heap, alterá-lo por qualquer das referências reflete em ambas. Ligue de novo ao diagrama do slide anterior. Esse "aha!" consolida o conceito de referência.
Conceito · coleta de lixo

Objeto sem referência

Quando nenhuma variável aponta mais para um objeto, ele se torna inalcançável — um "órfão".

1
Objeto fica órfão — a última referência recebeu null ou saiu de escopo.
2
O Garbage Collector age — a JVM detecta que ninguém alcança o objeto.
3
Memória é liberada — automaticamente, sem você chamar free().
🧹
vantagem do Java
Você não gerencia memória manualmente. O GC cuida disso — menos bugs de vazamento.
Garbage Collector. Contraste com C/C++ (malloc/free manual). Em Java o GC é automático e roda em segundo plano. Não prometa "quando" ele roda — é não determinístico. Mensagem: objetos do heap têm vida mais longa que o método, e somem quando ninguém os alcança.
Conceito 10 · 11 · 12

Métodos: entrada e saída

Conta.java
public class Conta {
    String cliente;
    double saldo;

    void deposita(double valor) {  // parâmetro
        saldo = saldo + valor;
    }

    double getSaldo() {
        return saldo;          // retorno
    }
}

📥Parâmetro × argumento

Parâmetro: a variável na assinatura (valor). Argumento: o valor real passado na chamada — deposita(100.0).

📤Retorno

return devolve um resultado. O tipo antes do nome diz o que volta (double); void = nada.

Vocabulário. Fixe a diferença parâmetro (declaração) × argumento (chamada) — confundir é comum. return encerra o método e entrega o valor. Mostre que void e tipo-de-retorno são decisões de projeto: "esse método responde algo ou só faz?".
Mensageria entre objetos

Objetos chamam métodos de outros objetos

Conta.java
void transferePara(Conta destino, double valor) {
    this.saca(valor);        // tira de mim (conta origem)
    destino.deposita(valor); // coloca na conta destino
}
🤝
a essência da POO
Um objeto resolve um problema pedindo a outros objetos que façam sua parte — via métodos.
Colaboração. transferePara recebe outra Conta como parâmetro (um objeto como argumento!) e coordena duas ações. this aparece aqui naturalmente (a conta que chamou). Aprofundamos this no próximo slide. Mensagem: sistemas reais são redes de objetos colaborando.
Conceito 13

Construtores

O construtor é um método especial, com o mesmo nome da classe, chamado no momento do new. Ele inicializa o objeto.

Empregado.java
public class Empregado {
    public int idade;
    public double salario;

    // Construtor — mesmo nome da classe, sem tipo de retorno
    public Empregado(int idade, double salario) {
        this.idade = idade;
        this.salario = salario;
    }
}
🔧
por que existe
Garante que o objeto nasça pronto: new Empregado(30, 4000) já cria com idade e salário.
Construtor. Regras: mesmo nome da classe, sem tipo de retorno (nem void). Se você não escrever nenhum, o Java fornece um padrão sem argumentos (foi o que usamos no Cachorro). Aqui também aparece this, que explicamos a seguir. Mostre a chamada com new e argumentos.
Conceito 14

A palavra-chave this

🐛
o problema
idade = idade; — qual é qual? O parâmetro tem o mesmo nome do atributo. Ambiguidade!
solução
public Empregado(int idade) {
    this.idade = idade;
}

👈this = "este objeto"

this.idade é o atributo do objeto atual; idade sozinho é o parâmetro. this desfaz a ambiguidade.

💡
leia assim
"o idade deste objeto recebe o idade que chegou como parâmetro".
this. Sem this, idade = idade atribui o parâmetro a ele mesmo (o atributo fica zerado) — bug clássico e silencioso. this é uma referência ao objeto que está executando o método. Reaproveite o exemplo do construtor. Muito comum em provas práticas.
Conceito 15 · já na fase inicial

toString — descrevendo o objeto

Pessoa.java
public String toString() {
    return "Nome: " + nome
         + " | Idade: " + idade;
}
# sem toString próprio:
Pessoa@1b533b0
# com toString próprio:
Nome: Vitor | Idade: 34
🔍
para que serve
Dá ao objeto uma descrição textual legível. System.out.println(objeto) chama o toString automaticamente.

Ótimo para depuração: você "enxerga" o estado do objeto sem imprimir atributo por atributo.

toString (introdução). Apresente agora pela utilidade prática (depurar/imprimir). Sem ele, o println mostra o tipo + um código de hash ilegível. No Módulo 2 voltamos a ele formalmente como sobrescrita de um método da classe Object (com @Override). Hoje basta: "é o cartão de visita textual do objeto".
Erros frequentes

Onde iniciantes tropeçam

💥Esquecer o new

Cachorro c; e já usar c.latir()NullPointerException. A etiqueta não aponta para objeto algum.

📄Arquivo ≠ classe

Classe Aluno pública precisa estar em Aluno.java. Nome errado → não compila.

🔁idade = idade

Sem this, o atributo nunca recebe o valor. Bug silencioso.

📋c2 = c1 não copia

Achar que duplicou o objeto. Na verdade, são duas referências para o mesmo.

Erros. Esses quatro cobrem ~80% dos tropeços do módulo. O NullPointerException merece atenção: explique que "null" é "etiqueta apontando para o nada". Mostre a mensagem de erro real para a turma reconhecê-la depois. Relacione cada erro ao conceito que o evita.
Prática guiada

Conta Bancária completa

Conta.java
public class Conta {
    String cliente;
    double saldo;

    void deposita(double v) { saldo += v; }
    void saca(double v)     { saldo -= v; }
    void exibeSaldo() {
        System.out.println(cliente + " → " + saldo);
    }
}
Main.java
Conta c = new Conta();
c.cliente = "Ricardo";
c.saldo = 10000.0;
c.saca(1000);
c.deposita(6000);
c.exibeSaldo();
# saída
Ricardo → 15000.0
Prática guiada. Construam juntos, passo a passo, rodando a cada método adicionado. Peça à turma que preveja o saldo final (15000). Note que saldo está aberto — qualquer um pode fazer c.saldo = -9999. Deixe essa "ferida" exposta: ela motiva o encapsulamento do Módulo 2.
Exercício autônomo · início do projeto

Sua vez: a classe Aluno

Primeiro tijolo do Sistema de Gestão Acadêmica.

📋Requisitos

• Classe Aluno com atributo nome (String).
• Método calcularMedia(double n1, double n2, double n3) que imprime a média das três notas.
• Em Main: criar um aluno, definir o nome e chamar o método.

esqueleto
class Aluno {
    String nome;
    public void calcularMedia(double n1,
                    double n2, double n3) {
        // média = (n1+n2+n3)/3 ; imprima-a
    }
}
!
Entrega
Rode com notas 6, 6 e 6 — a saída deve ser 6.0. Guarde: evoluiremos este Aluno no Módulo 2.
Exercício autônomo. Tempo sugerido: 10–15 min. É de propósito que media seja uma variável local (não atributo) e que nada esteja encapsulado ainda — isso prepara o "antes/depois" do Módulo 2 (quando somaNotas vira atributo private com getter). Recolha as soluções; elas alimentam a próxima aula.
Revisão · questões de verificação

Revisão relâmpago

Classe é o molde; objeto é a instância.
Atributos = estado · métodos = comportamento.
new cria no heap; a referência mora na stack.
Construtor + this inicializam; toString descreve.
?
Questão 1
O que new retorna e onde o objeto é criado?
?
Questão 2
Por que this é necessário em this.idade = idade?
?
Questão 3
Após b = a, mudar b afeta a? Por quê?
Revisão. Respostas: (1) new devolve a referência (endereço) do objeto criado no heap. (2) sem this, o parâmetro se autoatribui e o atributo fica zerado. (3) sim — são duas referências ao mesmo objeto. Use como ticket de saída: cada aluno responde uma antes de sair.
Síntese do Módulo 1

O que levamos deste módulo

🧩O Paradigma

Pensamos em entidades com estado (atributos) e comportamento (métodos), não em funções soltas.

🧠A Memória

Referência na stack, objeto no heap, e o GC cuidando do resto.

🔧O Nascimento

new + construtor + this fazem o objeto nascer pronto e válido.

➡️
próximo módulo
Encapsulamento — nossos atributos estão abertos demais (lembra do saldo = -9999?). Vamos protegê-los com private, getters e setters.
Síntese. Feche amarrando os três pilares do dia (paradigma, memória, nascimento do objeto). A ponte para o Módulo 2 nasce de uma dor concreta deste módulo: o estado aberto. Peça que tragam a solução do exercício do Aluno — ela será encapsulada na próxima aula. Encerramento positivo: "vocês já sabem criar e usar objetos; agora vamos torná-los seguros".
módulos
Nota de apresentação para a docente