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
classAluno {
// 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
Diagrama UML de classe: três compartimentos — nome, atributos, métodos.
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 classMain {
public static voidmain(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.java → java 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.
Tipo
Guarda
Exemplo
int
inteiro
40
double
real (ponto flutuante)
8.5
boolean
verdadeiro/falso
true
char
um caractere
'A'
Tipo
Guarda
Exemplo
long
inteiro grande
9000000000
float
real (menor precisão)
3.14f
byte
inteiro minúsculo
127
short
inteiro pequeno
2000
📌
lembre-se
Stringnã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.
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 objetoCachorro pitbull = newCachorro();
🏷️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.
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();
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.
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.
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.
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
voidtransferePara(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 classEmpregado {
public int idade;
public double salario;
// Construtor — mesmo nome da classe, sem tipo de retornopublicEmpregado(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!
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.
# 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.
Conta c = newConta();
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
classAluno {
String nome;
public voidcalcularMedia(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".