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.

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

Membros de instância pertencem a cada objeto que você cria. Cada objeto recebe sua própria cópia de variáveis de instância, e 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 says woof!
dog2.bark();  // Max says woof!

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

Membros estáticos pertencem à própria classe, não a nenhum objeto em particular. 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 - existe apenas uma cópia, independentemente de quantos objetos Dog existam. Você a acessa através do nome da classe Dog.totalDogs, não através de uma instância.

challenge icon

Desafio

Fácil

Vamos construir um sistema de contador de visitantes para um museu que rastreia tanto as visitas a exibições individuais quanto as estatísticas gerais do museu.

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

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

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

[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

Folha de consulta

Os membros de classe em Dart podem ser membros de instância (pertencentes a objetos individuais) ou membros estáticos (pertencentes à própria classe).

Membros de instância são únicos para cada objeto. Cada objeto tem sua própria cópia das variáveis de instância:

class Dog {
  String name;  // Instance variable
  
  Dog(this.name);
  
  void bark() {  // Instance method
    print('$name says woof!');
  }
}

Membros estáticos são compartilhados entre todas as instâncias e acessados usando o nome da classe com a palavra-chave static:

class Dog {
  String name;
  static int totalDogs = 0;  // Static variable
  
  Dog(this.name) {
    totalDogs++;
  }
}

// Access static members through the class name
print(Dog.totalDogs);  // 2

Variáveis estáticas mantêm um único valor compartilhado, independentemente de quantos objetos sejam criados.

Experimente você mesmo

import 'exhibit.dart';

void main() {
  // TODO: Criar uma exibição 'Dinosaur Bones'
  
  // TODO: Criar uma exibição 'Ancient Egypt'
  
  // TODO: Registrar 3 visitas à exibição Dinosaur Bones
  
  // TODO: Registrar 2 visitas à exibição Ancient Egypt
  
  // TODO: Chamar displayStats() em cada exibição em ordem
  
  // TODO: Imprimir o total de visitantes do museu usando 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