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); // 2A 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.
Desafio
FácilVamos 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 classeExhibitque 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 em0para rastrear quantas pessoas visitaram esta exibição específica - Uma variável estática
totalVisitors(int) começando em0para 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 ovisitorCountda exibição quanto ototalVisitorsda classe - Um método
displayStats()que imprime as informações da exibição
- Uma variável de instância
main.dart: Importe sua classe de exibição e crie duas exibições:- Uma exibição
'Dinosaur Bones' - Uma exibição
'Ancient Egypt'
displayStats()em cada exibição na ordem em que foram criadas e, em seguida, imprima o total de visitantes em todas as exibições.- Uma exibição
O método displayStats() deve imprimir exatamente neste formato:
[name]: [visitorCount] visitorsPara 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: 5Folha 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); // 2Variá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]
}
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
1Fundamentos de POO
Arquivos ExternosBibliotecas e ImportaçõesIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosVariáveis de InstânciaFundamentos de ConstrutoresRecapitulação - Calculadora Simples4Null Safety
Introdução ao Null SafetyNullable vs Non-NullableOs Operadores ? e !Palavra-chave Late e Null SafetyOperadores Null-AwareNull Safety em ClassesRecapitulação - Sistema de Perfil de Usuário7Classes Abstratas e Interfaces
Classes AbstratasMétodos AbstratosInterfaces em DartInterfaces ImplícitasImplementando vs EstendendoMúltiplas InterfacesRecapitulação - Calculadora de Formas10Coleções e Generics
Visão Geral de List, Set e MapColeções Type-SafeClasses GenéricasMétodos GenéricosRestrições de GenericsIterable e IteratorRecapitulação - Armazenamento Genérico13Conceitos Avançados de POO
Composição vs HerançaMétodos de ExtensãoClasses ChamáveisClasses Seladas (Dart 3)Records (Dart 3)Patterns & Matching (3.0)Enums com Métodos16Projeto: Gerenciamento de Biblioteca
Visão Geral do ProjetoClasses Livro e Usuário2Construtores em Dart
Construtor PadrãoConstrutores NomeadosListas de InicializaçãoConstrutores ConstantesConstrutores FactoryConstrutores de RedirecionamentoRecapitulação - Shape Builder5Encapsulamento
Membros Públicos vs PrivadosA Convenção do Prefixo _Privacidade em Nível de BibliotecaAprofundamento em Getters & SettersOcultação de InformaçãoRecapitulação - Registros de Estudantes8Mixins
Introdução aos MixinsCriando MixinsUsando Múltiplos MixinsPalavra-chave on em MixinsMixin vs HerançaMixin vs InterfaceRecapitulação - Sistema Animal11Métodos Especiais
Sobrescrita de toString()Sobrescrita de hashCode & ==Interface ComparableMétodo call()Sobrescrita de noSuchMethodRecapitulação - Coleção Personalizada14Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão ObserverPadrão Strategy3Propriedades de Classe
Membros de Instância vs EstáticosCampos Final & ConstVariáveis LateMétodos e Campos EstáticosGetters e SettersRecapitulação - Gerenciador de Conta Bancária6Herança
Herança BásicaA Palavra-chave superSobrescrita de MétodoA Anotação @overrideA Palavra-chave final para ClassesConstrutores e HerançaRecapitulação - Hierarquia de Funcionários9Polimorfismo
Fundamentos do PolimorfismoPolimorfismo via InterfacesVerificação de Tipos em Tempo de ExecuçãoOs Operadores is & asPalavra-chave CovariantRecapitulação - Processador de Pagamentos12POO Assíncrona
Futures e async/awaitFundamentos de StreamsStream ControllersConstrutores AssíncronosAsync em Métodos de ClasseRecapitulação - Data Fetcher15Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Repository