Pular para o conteúdo

Criação de Classes

Ciência da Computação A do AP · Tópico 3

Treinar
Videoaula para este tópico Abrir a página do vídeo
7:26

Criação de Classes

Aqui está um aluno, armazenado como três variáveis soltas: um nome, um ano e uma nota. Isso funciona. Agora adicione mil alunos. Você precisaria de três mil variáveis…

Narração em inglês · Legendas em inglês + 中文 gravadas

3.1

Abstração e Projeto de Programas

Programa

Objetivo de Aprendizagem 3.1.A: Representar o projeto de um programa usando linguagem natural ou criando diagramas que indiquem as classes no programa e as abstrações de dados e procedurais encontradas em cada classe, incluindo todos os atributos e comportamentos.

  • 3.1.A.1 Abstração é o processo de reduzir a complexidade focando na ideia principal. Ao ocultar detalhes irrelevantes para a questão em mãos e agrupar detalhes relacionados e úteis, a abstração reduz a complexidade e permite que um se foque na ideia.
  • 3.1.A.2 Abstração de dados fornece uma separação entre as propriedades abstratas de um tipo de dado e os detalhes concretos de sua representação. A abstração de dados gerencia a complexidade dando um nome aos dados sem referenciar os detalhes específicos da representação. Os dados podem assumir a forma de uma única variável ou uma coleção de dados, como em uma classe ou conjunto de dados.
  • 3.1.A.3 Um atributo é um tipo de abstração de dados definido em uma classe fora de qualquer método ou construtor. Uma variável de instância é um atributo cujo valor é único para cada instância da classe. Uma variável de classe é um atributo compartilhado por todas as instâncias da classe.
  • 3.1.A.4 Abstração procedural fornece um nome para um processo e permite que um método seja usado sabendo apenas o que ele faz, não como ele faz. Através da decomposição de métodos, um programador divide grandes comportamentos da classe em menores comportamentos criando métodos para representar cada pequeno comportamento individual. Uma abstração procedural pode extrair recursos compartilhados para generalizar funcionalidade em vez de duplicar código. Isso permite a reutilização de código, o que ajuda a gerenciar a complexidade.
  • 3.1.A.5 Usar parâmetros permite que procedimentos sejam generalizados, permitindo que os procedimentos sejam reutilizados com uma gama de valores de entrada ou argumentos.
  • 3.1.A.6 Usar abstração procedural em um programa permite que programadores alterem os internos de um método (para torná-lo mais rápido, mais eficiente, usar menos armazenamento, etc.) sem precisar notificar os usuários do método sobre a mudança, desde que a assinatura do método e o que o método faz seja preservado.
  • 3.1.A.7 Antes de implementar uma classe, é útil dedicar tempo para projetar cada classe, incluindo seus atributos e comportamentos. Esse projeto pode ser representado usando linguagem natural ou diagramas.

Fonte: College Board AP Course and Exam Description

Um quebra-cabeça em andamento: classes e métodos são peças modulares de um projeto maior de programa
Um quebra-cabeça em andamento: classes e métodos são peças modulares de um projeto maior de programa

Abstração 抽象 significa ocultar detalhes atrás de uma interface simples – você usa um String sem saber como armazena caracteres. Um bom design divide um problema em classes, cada uma responsável por uma ideia. Este tópico trata sobre escrever suas próprias classes.

Decompondo um programa em módulos e submódulos
Decompondo um programa em módulos e submódulos
3.2

O Impacto do Projeto de Programas

Programa

Objetivo de Aprendizagem 3.2.A: Explicar as implicações sociais e éticas dos sistemas computacionais.

  • 3.2.A.1 Confiabilidade do sistema refere-se à capacidade do programa de executar suas tarefas conforme esperado sob condições declaradas sem falhas. Programadores devem fazer um esforço para maximizar a confiabilidade do sistema testando o programa com uma variedade de condições.
  • 3.2.A.2 A criação de programas tem impactos na sociedade, na economia e na cultura. Esses impactos podem ser tanto benéficos quanto prejudiciais. Programas criados para atender a uma necessidade ou resolver um problema podem ter efeitos nocivos não intencionais além do seu uso pretendido.
  • 3.2.A.3 Questões legais e preocupações sobre propriedade intelectual surgem ao criar programas. Programadores frequentemente reutilizam código escrito por outros e publicado como open source e gratuito para uso. A incorporação de código que não é publicado como open source exige que o programador obtenha permissão e, muitas vezes, compre o código antes de integrá-lo ao seu programa.

Fonte: College Board AP Course and Exam Description

As escolhas de design afetam se o código está correto, legível e reutilizável. Encapsulamento 封装 – manter dados privados e expô-los apenas através de métodos – protege o estado de um objeto de mau uso e permite mudar o interior sem quebrar os usuários da classe. Nomes cuidadosos, métodos de propósito único e testes reduzem bugs.

O design também carrega responsabilidade além do código. Confiabilidade do sistema 系统可靠性 - um programa realizando suas tarefas conforme esperado, sem falhas - é algo que programadores devem maximizar através de design cuidadoso e testes. Programas têm impactos reais na sociedade, economia e cultura que podem ser benefícios e danos. E criar programas levanta preocupações legais e de propriedade intelectual 知识产权: programadores frequentemente reutilizam código publicado como open source 开源 e gratuito, mas devem respeitar sua licença e dar crédito em vez de copiar o trabalho alheio como próprio.

Vocabulário Treinar
Inglês Chinês Pinyin
Abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ 封装 fēng zhuāng
System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ 系统可靠性 xì tǒng kě kào xìng
legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ 知识产权 zhī shí chǎn quán
open source/ˈəʊpən sɔːs/ 开源 kāi yuán
instance variables/ˈɪnstəns ˈveərɪəblz/ 实例变量 shí lì biàn liàng
3.3

A Anatomia de uma Classe

Programa

Objetivo de Aprendizagem 3.3.A: Desenvolver código para designar restrições de acesso e visibilidade para classes, dados, construtores e métodos.

  • 3.3.A.1 Encapsulamento de dados é uma técnica na qual os detalhes de implementação de uma classe são mantidos ocultos de classes externas. As palavras-chave public e private afetam o acesso de classes, dados, construtores e métodos. A palavra-chave private restringe o acesso à classe declaradora, enquanto a palavra-chave public permite o acesso de classes fora da classe declaradora.
  • 3.3.A.2 Neste curso, as classes são sempre designadas public e declaradas com a palavra-chave class.
  • 3.3.A.3 Neste curso, os construtores são sempre designados public.
  • 3.3.A.4 Variáveis de instância pertencem ao objeto, e cada objeto possui sua própria cópia da variável.
  • 3.3.A.5 O acesso aos atributos deve ser mantido interno à classe para alcançar o encapsulamento. Portanto, é uma boa prática de programação designar as variáveis de instância para esses atributos como private, a menos que a especificação da classe indique o contrário.
  • 3.3.A.6 O acesso aos comportamentos pode ser interno ou externo à classe. Métodos designados como public podem ser acessados internamente ou externamente a uma classe, enquanto métodos designados como private só podem ser acessados internamente à classe.

Fonte: College Board AP Course and Exam Description

Uma classe tem três partes: variáveis de instância 实例变量 (campos – os dados do objeto), construtores (criam objetos) e métodos (comportamento). Campos geralmente são private; métodos geralmente são public:

Diagrama de classes: atributos privados e métodos públicos
Diagrama de classes: atributos privados e métodos públicos
public class Student {
    private String name;      // instance variable
    private int score;

    public Student(String n, int s) {   // constructor
        name = n;
        score = s;
    }
    public int getScore() { return score; }   // accessor
}
Uma planta baixa: uma classe é um modelo que define como objetos desse tipo são construídos
Uma planta baixa: uma classe é um modelo que define como objetos desse tipo são construídos
Explorar

Ver os campos de um objeto como caixas

Uma classe agrupa dados relacionados (seus campos) e métodos. Cada objeto recebe seu próprio conjunto de caixas de campo; atribuir a uma altera apenas esse objeto.

Vocabulário Treinar
Inglês Chinês Pinyin
constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
overloading/ˌəʊvəˈləʊdɪŋ/ 重载 zhòng zài
accessor (getter)/əkˈsesə/ 访问器 fǎng wèn qì
3.4

Construtores

Programa

Objetivo de Aprendizagem 3.4.A: Desenvolver código para declarar variáveis de instância para os atributos a serem inicializados no corpo dos construtores de uma classe.

  • 3.4.A.1 O estado de um objeto refere-se aos seus atributos e seus valores em um momento dado e é definido por variáveis de instância pertencentes ao objeto. Isso define uma relação has-a (tem-um) entre o objeto e suas variáveis de instância.
  • 3.4.A.2 Um construtor é usado para definir o estado inicial de um objeto, o que deve incluir valores iniciais para todas as variáveis de instância. Quando um construtor é chamado, memória é alocada para o objeto e a referência associada ao objeto é retornada. Parâmetros do construtor, se especificados, fornecem dados para inicializar variáveis de instância.
  • 3.4.A.3 Quando um objeto mutável é um parâmetro de construtor, a variável de instância deve ser inicializada com uma cópia do objeto referenciado. Dessa forma, a variável de instância não mantém uma referência ao objeto original, e os métodos são impedidos de modificar o estado do objeto original.
  • 3.4.A.4 Quando nenhum construtor é escrito, o Java fornece um construtor sem parâmetros, e as variáveis de instância são definidas com valores padrão de acordo com o tipo de dado do atributo. Este construtor é chamado de construtor padrão.
  • 3.4.A.5 O valor padrão para um atributo do tipo int é 0. O valor padrão de um atributo do tipo double é 0.0. O valor padrão de um atributo do tipo boolean é false. O valor padrão de um tipo de referência é null.

Fonte: College Board AP Course and Exam Description

Um construtor 构造函数 tem o mesmo nome da classe e nenhum tipo de retorno. Ele roda quando você escreve new, e seu trabalho é inicializar os campos. Uma classe pode ter vários construtores com listas diferentes de parâmetros (sobrecarga 重载); um construtor sem argumentos define valores padrão.

3.5

Métodos: Como Escrevê-los

Programa

Objetivo de Aprendizagem 3.5.A: Desenvolver código para definir comportamentos de um objeto através de métodos escritos em uma classe usando valores primitivos e determinar o resultado de chamar esses métodos.

  • 3.5.A.1 Um método void não retorna um valor. Seu cabeçalho contém a palavra-chave void antes do nome do método.
  • 3.5.A.2 Um método não void retorna um único valor. Seu cabeçalho inclui o tipo de retorno no lugar da palavra-chave void.
  • 3.5.A.3 Em métodos não void, uma expressão de retorno compatível com o tipo de retorno é avaliada e o valor é retornado. Isso é referido como retorno por valor.
  • 3.5.A.4 A palavra-chave return é usada para retornar o fluxo de controle para o ponto onde o método ou construtor foi chamado. Qualquer código que esteja sequencialmente após uma instrução de retorno nunca será executado. Executar uma instrução de retorno dentro de uma instrução de seleção ou iteração interromperá a instrução e sairá do método ou construtor.
  • 3.5.A.5 Um método acessor permite que objetos de outras classes obtenham uma cópia do valor das variáveis de instância ou variáveis de classe. Um método acessor é um método não-void.
  • 3.5.A.6 Um métutor (modificador) método é um método que altera os valores das variáveis de instância ou variáveis de classe. Um mutator method é frequentemente um método void.
  • 3.5.A.7 Métodos com parâmetros recebem valores através desses parâmetros e usam esses valores para cumprir a tarefa do método.
  • 3.5.A.8 Quando um argumento é um valor primitivo, o parâmetro é inicializado com uma cópia desse valor. Alterações no parâmetro não têm efeito sobre o argumento correspondente.

Fonte: College Board AP Course and Exam Description

Um método tem uma assinatura, um tipo de retorno e um corpo. Um acessor (getter) 访问器 retorna informações sem alterar o objeto; um mutator (setter) 修改器 altera um campo. Um método que retorna valor deve ter um return do tipo certo em todo caminho; um void método não retorna nada.

public void setScore(int s) { score = s; }   // mutator
public String toString() { return name + ": " + score; }
Explorar

Seguir uma chamada de método e seu retorno

Chamar um método empurra um quadro com seus parâmetros; quando ele atinge return, o quadro é removido e o valor volta para o chamador.

Vocabulário Treinar
Inglês Chinês Pinyin
mutator (setter)/mjuːˈteɪtə/ 修改器 xiū gǎi qì
static (class) variable/ˈstætɪk ˈveərɪəbl/ 类变量 lèi biàn liàng
3.6

Passando e Retorando Referências de um Objeto

Programa

Objetivo de Aprendizagem 3.6.A: Desenvolver código para definir comportamentos de um objeto através de métodos escritos em uma classe usando referências de objetos e determinar o resultado de chamar esses métodos.

  • 3.6.A.1 Quando um argumento é uma referência de objeto, o parâmetro é inicializado com uma cópia dessa referência; ele não cria uma nova cópia independente do objeto. Se o parâmetro se refere a um objeto mutável, o método ou construtor pode usar essa referência para alterar o estado do objeto. É uma boa prática de programação não modificar objetos mutáveis que são passados como parâmetros, a menos que seja exigido na especificação.
  • 3.6.A.2 Quando a expressão de retorno avalia para uma referência de objeto, a referência é retornada, não uma referência para uma nova cópia do objeto.
  • 3.6.A.3 Métodos não podem acessar os dados privados e métodos de um parâmetro que segura uma referência para um objeto, a menos que o parâmetro seja do mesmo tipo que a classe envolvente do método.

Fonte: College Board AP Course and Exam Description

= copia a referência, não o objeto

Quando você passa um objeto para um método, Java copia a referência, então o método age sobre o mesmo objeto – alterações em seus campos são visíveis para quem chamou. (Primitivos são copiados por valor, então alterações neles não.) Um método também pode retornar uma referência para um objeto. Porque um String é imutável, passar um é seguro; passar um objeto mutável permite que o método o altere.

Java passa por valor: o método recebe uma cópia; verdadeiro passed by reference, do qual Java carece, permitiria reatribuir a variável do chamador
Java sempre passa por valor (esquerda): o método recebe uma cópia da referência. Verdadeiro passed by reference (direita) — do qual Java não dispõe — permitiria que o método reatribuísse a própria variável do chamador.

Habilidade para prova: saiba que mutar campos de um objeto dentro de um método afeta o original, mas reatribuir o parâmetro (param = new...) não afeta o chamador.

Exemplo resolvido. Suponha que s seja um Student com pontuação 50, e chamamos tweak(s):

public static void tweak(Student a) {
    a.setScore(100);          // (1) mutates the shared object
    a = new Student("Z", 0);  // (2) repoints the local copy only
    a.setScore(5);            // (3) changes only the new local object
}

A linha (1) altera o objeto que s aponta, então o chamador agora vê 100. A linha (2) faz a cópia própria do método apontar para um novo objeto – o s do chamador permanece intacto – e a linha (3) afeta apenas esse novo objeto. Após a chamada, s.getScore() é 100: a mutação permaneceu, a reatribuição não.

3.7

Variáveis e Métodos de Classe

Programa

Objetivo de Aprendizagem 3.7.A: Desenvolver código para definir comportamentos de uma classe através de métodos de classe.

  • 3.7.A.1 Métodos de classe não podem acessar ou alterar os valores de variáveis de instância ou chamar métodos de instância sem receber uma instância da classe via parâmetro.
  • 3.7.A.2 Métodos de classe podem acessar ou alterar os valores de variáveis de classe e podem chamar outros métodos de classe.

Objetivo de Aprendizagem 3.7.B: Desenvolver código para declarar as variáveis de classe que pertencem à classe.

  • 3.7.B.1 Variáveis de classe pertencem à classe, com todos os objetos de uma classe compartilhando uma única cópia da variável de classe. Variáveis de classe são designadas com a palavra-chave static antes do tipo da variável.
  • 3.7.B.2 Variáveis de classe designadas public são acessadas fora da classe usando o nome da classe e o operador ponto, já que elas estão associadas a uma classe, não a objetos de uma classe.
  • 3.7.B.3 Quando uma variável é declarada final, seu valor não pode ser modificado.

Fonte: College Board AP Course and Exam Description

campos estáticos vs instância

Uma variável estática (de classe) 类变量, marcada static, é compartilhada por todos os objetos da classe – uma única cópia total (ex.: um contador de quantos objetos existem). Um método estático pertence à classe e não pode usar campos de instância diretamente. Acesse-os pelo nome da classe: Student.getCount().

3.8

Escopo e Acesso

Programa

Objetivo de Aprendizagem 3.8.A: Explicar onde as variáveis podem ser usadas no código.

  • 3.8.A.1 Variáveis locais são variáveis declaradas nos cabeçalhos ou corpos de blocos de código. Variáveis locais só podem ser acessadas no bloco em que foram declaradas. Como construtores e métodos são blocos de código, parâmetros de construtores ou métodos também são considerados variáveis locais. Essas variáveis só podem ser usadas dentro do construtor ou método e não podem ser declaradas como public ou private.
  • 3.8.A.2 Quando há uma variável local ou parâmetro com o mesmo nome de uma variável de instância, o nome da variável referirá-se à variável local em vez da variável de instância dentro do corpo do construtor ou método.

Fonte: College Board AP Course and Exam Description

Escopo 作用域 é onde um nome é visível. Uma variável local declarada em um método existe apenas dentro dele; um parâmetro existe apenas em seu método; uma variável de instância é visível por todo o objeto. Modificadores de acesso controlam visibilidade entre classes: private (apenas esta classe) versus public (em qualquer lugar). Variáveis locais sombream campos do mesmo nome – fonte de bugs.

Uma variável global é visível em toda parte; uma variável local apenas dentro de seu bloco
Uma variável global é visível em toda parte; uma variável local apenas dentro de seu bloco
Vocabulário Treinar
Inglês Chinês Pinyin
Scope/skəʊp/ 作用域 zuò yòng yù
3.9

A Palavra-chave this

Programa

Objetivo de Aprendizagem 3.9.A: Desenvolver código para expressões que fazem referência a si mesmas e determinar o resultado dessas expressões.

  • 3.9.A.1 Dentro de um método de instância ou um construtor, a palavra-chave this atua como uma variável especial que segura uma referência ao objeto atual — o objeto cujo método ou construtor está sendo chamado.
  • 3.9.A.2 A palavra-chave this pode ser usada para passar o objeto atual como um argumento em uma chamada de método.
  • 3.9.A.3 Métodos de classe não possuem uma referência this.

Fonte: College Board AP Course and Exam Description

this é uma referência para o objeto atual. Use-o para diferenciar um campo de um parâmetro com o mesmo nome, ou para chamar outro método do mesmo objeto:

public Student(String name, int score) {
    this.name = name;      // this.name is the field; name is the parameter
    this.score = score;
}

Habilidade para prova: quando um parâmetro de construtor ou setter tem o mesmo nome de um campo, você deve escrever this.field = param – sem this, a atribuição não faz nada útil.

3.9

Dicas de prova

  • Projete com métodos e classes: encapsule dados como campos private e exponha comportamento através de métodos públicos.
  • Saiba a diferença entre um objeto e sua classe, e que objetos são passados por valor — o parâmetro recebe uma cópia da referência, então um método pode alterar o estado do objeto, mas reatribuir o parâmetro não afeta o chamador (Java não tem passed-by-reference).
  • Traverser arrays e ArrayLists com segurança — tamanho é length vs .size(), e remover durante um loop desloca índices.
  • Rastrear um método recursivo para determinar seu resultado: encontre o caso base primeiro, depois siga cada chamada recursiva até seu valor de retorno (escrever código recursivo está fora do escopo da prova).
  • Reconhecer vocabulário de herança – superclasse, subclasse, overriding de métodos, e que toda classe é uma subclasse de Object (projetar e implementar herança está fora do escopo da prova).

Aulas interativas sobre este tópico

Passe por ele passo a passo, com exercícios de verificação instantânea.

Provas Anteriores

Mais tópicos em Ciência da Computação A do AP

Entrar ou criar conta

IGCSE, A-Level & AP