Mobile App Development · Dart/Flutter

06 · Objetos — Exercícios

Seis exercícios progressivos: classe simples, método com formatação, lógica interna, construtor nomeado, encapsulamento com getter e lista de objetos.

Exercício

exercicio_01_pessoa.dart

Cria a classe Pessoa com dois atributos, um construtor posicional (this.nome, this.idade) e um método apresentar() que usa os atributos da instância.

// Demonstração de criação de uma classe simples em Dart.
// Uma classe é um modelo (blueprint) que define atributos e comportamentos de objetos.
// Um objeto é uma instância concreta de uma classe.

// Classe 'Pessoa' com dois atributos e um método.
class Pessoa {
  // Atributos: representam as características do objeto.
  String nome;
  int idade;

  // Construtor: inicializa os atributos quando um objeto é criado.
  // 'this.nome' e 'this.idade' são atalhos que atribuem os parâmetros diretamente.
  Pessoa(this.nome, this.idade);

  // Método: define um comportamento da classe (uma ação que o objeto pode realizar).
  void apresentar() {
    // Acessa os atributos da instância atual usando seus nomes diretamente.
    print('$nome tem $idade anos');
  }
}

void main() {
  // Cria um objeto (instância) da classe Pessoa com os valores fornecidos.
  Pessoa pessoa = Pessoa('Ana', 24);
  // Chama o método 'apresentar' no objeto criado.
  pessoa.apresentar();
}

Saída esperada

Ana tem 24 anos

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_01_pessoa.dart

Exercício

exercicio_02_produto.dart

Cria a classe Produto com construtor posicional e um método exibirResumo() que formata nome e preço com toStringAsFixed(2).

// Demonstração de classe com método de exibição formatada.
// A classe 'Produto' encapsula dados e comportamento relacionados a um produto.

class Produto {
  // Atributos públicos que definem as propriedades do produto.
  String nome;
  double preco;

  // Construtor posicional: os valores são passados na ordem declarada.
  Produto(this.nome, this.preco);

  // Método que exibe um resumo do produto com nome e preço formatado.
  void exibirResumo() {
    // \$ exibe o símbolo de real literalmente; toStringAsFixed(2) garante 2 decimais.
    print('$nome - R\$ ${preco.toStringAsFixed(2)}');
  }
}

void main() {
  // Instancia um objeto Produto com nome 'Mouse' e preço 89.90.
  Produto produto = Produto('Mouse', 89.90);
  // Chama o método de exibição — saída esperada: "Mouse - R$ 89.90".
  produto.exibirResumo();
}

Saída esperada

Mouse - R$ 89.90

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_02_produto.dart

Exercício

exercicio_03_aluno.dart

Cria a classe Aluno com dois métodos: calcularMedia() e classificarSituacao(), este último reutilizando o primeiro internamente e retornando um texto de acordo com faixas de nota.

// Demonstração de classe com múltiplos métodos e lógica interna.
// A classe 'Aluno' encapsula notas e regras de aprovação.

class Aluno {
  // Atributos: nome e as duas notas do aluno.
  String nome;
  double primeiraNota;
  double segundaNota;

  // Construtor posicional que inicializa todos os atributos.
  Aluno(this.nome, this.primeiraNota, this.segundaNota);

  // Método que calcula e retorna a média aritmética das duas notas.
  double calcularMedia() {
    return (primeiraNota + segundaNota) / 2;
  }

  // Método que classifica a situação do aluno com base na média calculada.
  // Chama internamente 'calcularMedia()' para reutilizar a lógica.
  String classificarSituacao() {
    double media = calcularMedia();

    if (media >= 7) {
      return 'Aprovado';
    }

    if (media >= 5) {
      return 'Recuperacao';
    }

    return 'Reprovado';
  }
}

void main() {
  // Cria um aluno com notas 8.0 e 6.5 → média = 7.25 → Aprovado.
  Aluno aluno = Aluno('Lucas', 8.0, 6.5);
  // Chama os métodos e exibe os resultados formatados.
  print('Media: ${aluno.calcularMedia().toStringAsFixed(2)}');
  print('Situacao: ${aluno.classificarSituacao()}');
}

Saída esperada

Media: 7.25
Situacao: Aprovado

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_03_aluno.dart

Exercício

exercicio_04_construtor_nomeado.dart

Cria a classe Usuario com um construtor padrão e um construtor nomeado Usuario.convidado(), que inicializa os atributos com valores fixos usando lista de inicialização (:).

// Demonstração de construtores nomeados em Dart.
// Além do construtor padrão, podemos criar construtores com nomes alternativos
// para diferentes formas de inicializar o objeto.

class Usuario {
  String nome;
  bool ativo;

  // Construtor padrão: cria um usuário com nome e estado de ativo informados.
  Usuario(this.nome, this.ativo);

  // Construtor nomeado 'convidado': cria um usuário visitante com valores pré-definidos.
  // Útil para criar objetos com configurações padrão sem repetir código.
  Usuario.convidado() : nome = 'Visitante', ativo = false;

  // Método que exibe as informações do usuário de forma compacta.
  void exibir() {
    print('Usuario: $nome | Ativo: $ativo');
  }
}

void main() {
  // Usa o construtor padrão para criar um usuário normal.
  Usuario usuario = Usuario('Marina', true);
  // Usa o construtor nomeado para criar um usuário convidado.
  Usuario convidado = Usuario.convidado();

  // Exibe as informações de cada instância criada.
  usuario.exibir();
  convidado.exibir();
}

Saída esperada

Usuario: Marina | Ativo: true
Usuario: Visitante | Ativo: false

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_04_construtor_nomeado.dart

Exercício

exercicio_05_conta_bancaria.dart

Cria a classe ContaBancaria com um atributo privado _saldo, um getter somente leitura e métodos depositar()/sacar() que validam os valores antes de alterar o saldo.

// Demonstração de encapsulamento com atributo privado e getter em Dart.
// Encapsulamento: ocultar detalhes internos e expor apenas o necessário.
// Atributos privados são declarados com underscore (_) antes do nome.

class ContaBancaria {
  // Atributo privado: só pode ser acessado dentro desta classe.
  // O underscore (_) torna '_saldo' invisível fora do arquivo.
  double _saldo = 0;

  // Getter: propriedade somente leitura que expõe '_saldo' de forma segura.
  // 'get' permite ler o valor sem permitir alteração direta de fora.
  double get saldo => _saldo;

  // Método para depositar: só adiciona ao saldo se o valor for positivo.
  void depositar(double valor) {
    if (valor > 0) {
      _saldo += valor;
    }
  }

  // Método para sacar: só realiza o saque se o valor for positivo e houver saldo suficiente.
  void sacar(double valor) {
    if (valor > 0 && valor <= _saldo) {
      _saldo -= valor;
    }
  }
}

void main() {
  ContaBancaria conta = ContaBancaria();
  // Deposita R$ 200 na conta.
  conta.depositar(200);
  // Saca R$ 75 — verificação interna garante que o saldo não ficará negativo.
  conta.sacar(75);
  // Acessa o saldo via getter — resultado esperado: R$ 125.00.
  print('Saldo: R\$ ${conta.saldo.toStringAsFixed(2)}');
}

Saída esperada

Saldo: R$ 125.00

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_05_conta_bancaria.dart

Exercício

exercicio_06_lista_objetos.dart

Combina coleções com classes: cria uma List<Produto> com objetos instanciados diretamente dentro da lista e percorre com for-in.

// Demonstração de lista de objetos — combinando coleções com classes.
// Cada elemento da lista é uma instância da classe Produto.

class Produto {
  // Atributos que descrevem o produto.
  String nome;
  double preco;

  // Construtor posicional para inicializar nome e preço.
  Produto(this.nome, this.preco);
}

void main() {
  // List<Produto>: lista tipada que só aceita objetos do tipo Produto.
  // Os objetos são criados diretamente dentro da lista usando o construtor.
  List<Produto> produtos = [
    Produto('Mouse', 89.90),
    Produto('Teclado', 150.00),
    Produto('Monitor', 900.00),
  ];

  // Percorre cada produto da lista usando for-in (para cada elemento em...).
  for (Produto produto in produtos) {
    // Acessa os atributos de cada objeto individualmente.
    print('${produto.nome}: R\$ ${produto.preco.toStringAsFixed(2)}');
  }
}

Saída esperada

Mouse: R$ 89.90
Teclado: R$ 150.00
Monitor: R$ 900.00

Como executar

dart run 06-Objetos/02_Exercicios/codigo_fonte/exercicio_06_lista_objetos.dart