Classes e objetos
Java Completo • Módulo 2: Orientação a objetos • Codding — material para estudo offline
Aluno: ______________________________ Data: ____ / ____ / ______
Nesta aula, você vai compreender Classes e objetos com explicação progressiva, exemplo resolvido, checagens e prática. Nada de apenas copiar: cada etapa prepara a próxima.
Objetivos da aula
- Explicar Classes e objetos com suas próprias palavras
- Reconhecer as partes importantes em um exemplo real
- Identificar e corrigir os erros mais frequentes
- Aplicar o conteúdo em uma atividade prática
Pré-requisito: Leia a aula anterior do módulo se algum termo parecer novo. Você pode testar o exemplo antes de continuar. • Duração: 50–75 min
Explicação passo a passo
1. O que é Classes e objetos
Classe é o molde; objeto é a instância. POO junta dados e comportamento no mesmo lugar para que o resto do programa não precise conhecer os detalhes internos.
Checkpoint: Polimorfismo permite: — Resposta: Chamar o mesmo método em tipos diferentes sem saber qual implementação roda
2. Como pensar antes de fazer
Encapsulamento: exponha métodos, esconda campos. Se qualquer parte do sistema pode alterar o saldo direto, nenhuma regra de negócio sobrevive.
Dica: Não decore a forma. Tente explicar com suas palavras qual problema “Classes e objetos” resolve.
3. Exemplo completo, do início ao resultado
Herança expressa 'é um tipo de' e deve ser rara; composição ('tem um') costuma ser mais flexível. Herdar só para reaproveitar código gera hierarquias impossíveis de mudar.
public class Main {
static abstract class Conta {
protected double saldo; // escondido do mundo
void depositar(double v) { if (v > 0) saldo += v; }
abstract double taxa();
double saldoFinal() { return saldo - taxa(); }
}
static class Corrente extends Conta { double taxa() { return 10; } }
static class Poupanca extends Conta { double taxa() { return 0; } }
public static void main(String[] args) {
Conta[] contas = { new Corrente(), new Poupanca() };
for (Conta c : contas) { c.depositar(100); System.out.println(c.saldoFinal()); }
}
}| Trecho | O que faz |
|---|
public class Main { | Cria uma estrutura reutilizável para organizar comportamento. |
static abstract class Conta { | Cria uma estrutura reutilizável para organizar comportamento. |
protected double saldo; // escondido do mundo | Contribui para a transformação principal mostrada neste exemplo. |
void depositar(double v) { if (v > 0) saldo += v; } | Decide qual caminho será executado de acordo com uma condição. |
abstract double taxa(); | Contribui para a transformação principal mostrada neste exemplo. |
double saldoFinal() { return saldo - taxa(); } | Cria ou atualiza um valor que será usado pelo restante do exemplo. |
} | Contribui para a transformação principal mostrada neste exemplo. |
static class Corrente extends Conta { double taxa() { return 10; } } | Cria uma estrutura reutilizável para organizar comportamento. |
Dica: saldoFinal é escrito uma vez e funciona para qualquer conta futura: quem adiciona uma nova classe só implementa taxa().
Checkpoint: Encapsulamento serve para: — Resposta: Proteger o estado interno, expondo só operações válidas
4. Do detalhe para o todo
Polimorfismo é a parte que compensa: várias classes implementam o mesmo método e o chamador não precisa saber qual é qual. É a base de interfaces e de código extensível sem if gigante.
5. Erros comuns e como corrigi-los
1. Campos públicos que permitem estados inválidos.
2. Herança profunda usada como reaproveitamento de código.
3. Classe que faz tudo (God class) em vez de responsabilidades separadas.
Dica: Quando algo der errado, compare uma diferença por vez com o exemplo. Evite mudar várias partes ao mesmo tempo.
Prática guiada
1. 1. Faça funcionar
Laboratório de Classes e objetos: execute o exemplo, identifique entrada, processamento e saída e altere pelo menos um valor para observar como o resultado muda.
public class Main {
static abstract class Conta {
protected double saldo; // escondido do mundo
void depositar(double v) { if (v > 0) saldo += v; }
abstract double taxa();
double saldoFinal() { return saldo - taxa(); }
}
static class Corrente extends Conta { double taxa() { return 10; } }
static class Poupanca extends Conta { double taxa() { return 0; } }
public static void main(String[] args) {
Conta[] contas = { new Corrente(), new Poupanca() };
for (Conta c : contas) { c.depositar(100); System.out.println(c.saldoFinal()); }
}
}Dica: Volte ao exemplo resolvido e compare a estrutura. Campos públicos que permitem estados inválidos.
2. 2. Preveja antes de testar
Sem executar, explique qual resultado o exemplo de Classes e objetos deve produzir e qual parte é responsável por ele.
Minha previsão:
A parte responsável pelo resultado:
Como vou conferir:
Dica: Use o modelo mental da aula: entrada, transformação e evidência observável.
3. 3. Encontre e corrija o erro
Use o exemplo de Classes e objetos, identifique um risco citado na aula e registre ou implemente a correção.
public class Main {
static abstract class Conta {
protected double saldo; // escondido do mundo
void depositar(double v) { if (v > 0) saldo += v; }
abstract double taxa();
double saldoFinal() { return saldo - taxa(); }
}
static class Corrente extends Conta { double taxa() { return 10; } }
static class Poupanca extends Conta { double taxa() { return 0; } }
public static void main(String[] args) {
Conta[] contas = { new Corrente(), new Poupanca() };
for (Conta c : contas) { c.depositar(100); System.out.println(c.saldoFinal()); }
}
}Dica: Campos públicos que permitem estados inválidos.
4. 4. Aplique em um caso novo
Crie uma variação própria usando Classes e objetos. Mude os dados ou o cenário e demonstre que o resultado continua correto.
public class Main {
static abstract class Conta {
protected double saldo; // escondido do mundo
void depositar(double v) { if (v > 0) saldo += v; }
abstract double taxa();
double saldoFinal() { return saldo - taxa(); }
}
static class Corrente extends Conta { double taxa() { return 10; } }
static class Poupanca extends Conta { double taxa() { return 0; } }
public static void main(String[] args) {
Conta[] contas = { new Corrente(), new Poupanca() };
for (Conta c : contas) { c.depositar(100); System.out.println(c.saldoFinal()); }
}
}Dica: Mantenha a estrutura que já funcionou e altere uma decisão por vez.
Revisão
- Classe é o molde; objeto é a instância. POO junta dados e comportamento no mesmo lugar para que o resto do programa não precise conhecer os detalhes internos.
- saldoFinal é escrito uma vez e funciona para qualquer conta futura: quem adiciona uma nova classe só implementa taxa().
- Evite: Campos públicos que permitem estados inválidos.
- Evite: Herança profunda usada como reaproveitamento de código.
Exemplo comentado
public class Main {
static abstract class Conta {
protected double saldo; // escondido do mundo
void depositar(double v) { if (v > 0) saldo += v; }
abstract double taxa();
double saldoFinal() { return saldo - taxa(); }
}
static class Corrente extends Conta { double taxa() { return 10; } }
static class Poupanca extends Conta { double taxa() { return 0; } }
public static void main(String[] args) {
Conta[] contas = { new Corrente(), new Poupanca() };
for (Conta c : contas) { c.depositar(100); System.out.println(c.saldoFinal()); }
}
}saldoFinal é escrito uma vez e funciona para qualquer conta futura: quem adiciona uma nova classe só implementa taxa().
Erros comuns
- Campos públicos que permitem estados inválidos.
- Herança profunda usada como reaproveitamento de código.
- Classe que faz tudo (God class) em vez de responsabilidades separadas.
Quiz e gabarito completo
1. Polimorfismo permite:
- a) Ter vários construtores
- b) Chamar o mesmo método em tipos diferentes sem saber qual implementação roda
- c) Criar objetos mais rápido
- d) Herdar de várias classes
Gabarito: b) Chamar o mesmo método em tipos diferentes sem saber qual implementação roda — O chamador depende do contrato, não da classe concreta.
2. Encapsulamento serve para:
- a) Deixar o código menor
- b) Proteger o estado interno, expondo só operações válidas
- c) Acelerar a execução
- d) Permitir herança
Gabarito: b) Proteger o estado interno, expondo só operações válidas — Regras de negócio ficam garantidas em um único lugar.
Codding • Java Completo • Classes e objetos • Prova final e certificado em codding.lovable.app/cursos/java/prova