Menu
Coddy logo textTech

Membros de Instância vs. Estáticos

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 17 de 110.

Nas classes do Dart, os membros (variáveis e métodos) podem pertencer a objetos individuais ou à própria classe. Entender essa distinção é fundamental para organizar seu código de maneira eficaz.

Membros de instância pertencem a cada objeto que você cria. Cada objeto recebe sua própria cópia das variáveis de instância, e os métodos de instância operam nos dados desse objeto específico:

class Dog {
  String name;  // Variável de instância
  
  Dog(this.name);
  
  void bark() {  // Método de instância
    print('$name says woof!');
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

dog1.bark();  // Buddy diz woof!
dog2.bark();  // Max diz woof!

Cada objeto Dog tem seu próprio name. Alterar o name de um cão não afeta o outro.

Membros estáticos pertencem à própria classe, não a nenhum objeto específico. Eles são compartilhados entre todas as instâncias e acessados usando o nome da classe:

class Dog {
  String name;
  static int totalDogs = 0;  // Variável estática
  
  Dog(this.name) {
    totalDogs++;
  }
}

Dog dog1 = Dog('Buddy');
Dog dog2 = Dog('Max');

print(Dog.totalDogs);  // 2

A variável totalDogs é compartilhada — há apenas uma cópia, independentemente de quantos objetos Dog existam. Você a acessa por meio do nome da classe Dog.totalDogs, não por meio de uma instância.

challenge icon

Desafio

Fácil

Vamos criar um sistema de contagem de visitantes para um museu que registre tanto as visitas individuais às exposições quanto as estatísticas gerais do museu.

Você organizará seu código em dois arquivos:

  • exhibit.dart: defina uma classe Exhibit que represente uma exposição do museu. Cada exposição deve ter:
    • Uma variável de instância name (String) para o nome da exposição
    • Uma variável de instância visitorCount (int) começando em 0 para registrar quantas pessoas visitaram essa exposição específica
    • Uma variável estática totalVisitors (int) começando em 0 para registrar o total de visitas em todas as exposições
    • Um construtor que receba o nome da exposição
    • Um método recordVisit() que incremente tanto o visitorCount da exposição quanto o totalVisitors da classe
    • Um método displayStats() que imprima as informações da exposição
  • main.dart: importe sua classe de exposição e crie duas exposições:
    • Uma exposição 'Dinosaur Bones'
    • Uma exposição 'Ancient Egypt'
    Registre 3 visitas à exposição Dinosaur Bones e, em seguida, registre 2 visitas à exposição Ancient Egypt. Depois de todas as visitas, chame displayStats() em cada exposição na ordem em que foram criadas e, em seguida, imprima o total de visitantes em todas as exposições.

O método displayStats() deve imprimir neste formato exato:

[name]: [visitorCount] visitors

Para a linha do total de visitantes, imprima:

Total museum visitors: [totalVisitors]

Acesse a variável estática usando o nome da classe Exhibit.totalVisitors.

Saída esperada:

Dinosaur Bones: 3 visitors
Ancient Egypt: 2 visitors
Total museum visitors: 5

Experimente você mesmo

import 'exhibit.dart';

void main() {
  // TODO: Create a 'Dinosaur Bones' exhibit
  
  // TODO: Create an 'Ancient Egypt' exhibit
  
  // TODO: Record 3 visits to the Dinosaur Bones exhibit
  
  // TODO: Record 2 visits to the Ancient Egypt exhibit
  
  // TODO: Chame displayStats() em cada exhibit em ordem
  
  // TODO: Print total museum visitors using Exhibit.totalVisitors
  // Format: Total museum visitors: [totalVisitors]
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de Dart online