Pular para o conteúdo

Usando Objetos e Métodos

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

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

Usando Objetos e Métodos

Aqui estão dois programas Java. O primeiro falta um ponto e vírgula. O segundo divide sete por dois e armazena a resposta em um número inteiro. O compilador para o…

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

1.1

Introdução a Algoritmos, Programação e Compiladores

Programa

Objetivo de Aprendizagem 1.1.A: Representar padrões e algoritmos encontrados no cotidiano usando linguagem escrita ou diagramas.

  • 1.1.A.1 Algoritmos definem processos passo a passo a seguir ao completar uma tarefa ou resolver um problema. Esses algoritmos podem ser representados usando linguagem escrita ou diagramas.
  • 1.1.A.2 Sequenciamento define uma ordem para quando as etapas de um processo são concluídas. As etapas de um processo são concluídas uma de cada vez.

Objetivo de Aprendizagem 1.1.B: Explicar o processo de compilação e execução de código.

  • 1.1.B.1 Código pode ser escrito em qualquer editor de texto; no entanto, um ambiente integrado de desenvolvimento (IDE) é frequentemente usado para escrever programas porque fornece ferramentas para um programador escrever, compilar e executar código.
  • 1.1.B.2 Um compilador verifica o código quanto a alguns erros. Erros detectáveis pelo compilador precisam ser corrigidos antes que o programa possa ser executado.

Objetivo de Aprendizagem 1.1.C: Identificar tipos de erros de programação.

  • 1.1.C.1 Um erro de sintaxe é um erro no programa em que as regras da linguagem de programação não são seguidas. Esses erros são detectados pelo compilador.
  • 1.1.C.2 Um erro de lógica é um erro no algoritmo ou programa que faz com que ele se comporte incorretamente ou inesperadamente. Esses erros são detectados testando o programa com dados específicos para ver se ele produz o resultado esperado.
  • 1.1.C.3 Um erro de tempo de execução é um erro no programa que ocorre durante a execução de um programa. Erros de tempo de execução geralmente causam a terminação anormal do programa.
  • 1.1.C.4 Uma exceção é um tipo de erro de tempo de execução que ocorre como resultado de um erro inesperado que não foi detectado pelo compilador. Ela interrompe o fluxo normal de execução do programa.

Fonte: College Board AP Course and Exam Description

Código-fonte em uma estação de trabalho — programas são escritos, compilados e executados como instruções precisas
Código-fonte em uma estação de trabalho — programas são escritos, compilados e executados como instruções precisas

Um algoritmo 算法 é um procedimento finito e passo a passo que resolve um problema. Um programa 程序 expressa um algoritmo em uma linguagem que um computador pode executar. Java é compilado 编译: o compilador 编译器 traduz seu código-fonte em bytecode, que a Máquina Virtual Java (JVM) executa. Um erro de sintaxe 语法错误 (quebra a gramática) é capturado pelo compilador; um erro lógico 逻辑错误 (resultado errado) não é – o programa roda, mas se comporta mal.

Um compilador traduz todo o programa de uma vez; um interpretador o executa linha por linha
Um compilador traduz todo o programa de uma vez; um interpretador o executa linha por linha
Vários chips de processador de computador vistos de baixo
Seu programa Java é compilado em instruções que uma CPU, como estas, realmente executa
Vocabulário Treinar
Inglês Chinês Pinyin
algorithm/ˈælɡərɪθəm/ 算法 suàn fǎ
program/ˈprəʊɡræm/ 程序 chéng xù
compiled/kəmˈpaɪld/ 编译 biān yì
compiler/kəmˈpaɪlə/ 编译器 biān yì qì
syntax error/ˈsɪntæks ˈerə/ 语法错误 yǔ fǎ cuò wù
logic error/ˈlɒdʒɪk ˈerə/ 逻辑错误 luó jí cuò wù
variable/ˈveərɪəbl/ 变量 biàn liàng
1.2

Variáveis e Tipos de Dados

Programa

Objetivo de Aprendizagem 1.2.A: Identificar a categoria de tipo de dado mais apropriada para uma especificação particular.

  • 1.2.A.1 Um tipo de dado é um conjunto de valores e um conjunto correspondente de operações sobre esses valores. Tipos de dados podem ser categorizados como primitivos ou referência.
  • 1.2.A.2 Os tipos de dados primitivos usados neste curso definem o conjunto de valores e operações correspondentes sobre esses valores para números e valores Booleanos.
  • 1.2.A.3 Um tipo referência é usado para definir objetos que não são tipos primitivos.

Objetivo de Aprendizagem 1.2.B: Desenvolver código para declarar variáveis para armazenar números e valores Booleanos.

  • 1.2.B.1 Os três tipos de dados primitivos usados neste curso são int, double e boolean. Um valor int é um número inteiro. Um valor double é um número real. Um valor boolean é ou true ou false.
    • Declaração de exclusão: Os outros cinco tipos de dados primitivos (long, short, byte, float e char) estão fora do escopo do curso e exame AP Computer Science A.
  • 1.2.B.2 Uma variável é um local de armazenamento que segura um valor, que pode mudar enquanto o programa está em execução. Toda variável tem um nome e um tipo de dado associado. Uma variável de um tipo primitivo armazena um valor primitivo desse tipo.

Fonte: College Board AP Course and Exam Description

Uma variável 变量 é uma caixa nomeada que armazena um valor de um tipo tipo fixo. Os principais tipos primitivos 基本类型 do Java são int (números inteiros), double (decimais) e boolean (true/false). Declare com o tipo primeiro:

Tipos de dados básicos do Java, cada um armazenando um tipo diferente de valor
Tipos de dados básicos do Java, cada um armazenando um tipo diferente de valor
int score = 90;
double price = 4.99;
boolean passed = true;
Explorar

Explorar como uma variável armazena um valor de cada vez

Uma variável é uma caixa nomeada que armazena um valor de um tipo fixo. Avance pelas linhas e observe cada caixa assumir seu valor; note que reassignar score sobrescreve o número antigo em vez de criar uma nova caixa.

Vocabulário Treinar
Inglês Chinês Pinyin
type/taɪp/ 类型 lèi xíng
primitive types/ˈprɪmɪtɪv taɪps/ 基本类型 jī běn lèi xíng
expression/ekˈspreʃn/ 表达式 biǎo dá shì
modulus/ˈmɒdjʊləs/ 取模 qǔ mó
escape sequence/eˈskeɪp ˈsiːkwəns/ 转义序列 zhuǎn yì xù liè
assignment/əˈsaɪnmənt/ 赋值 fù zhí
1.3

Expressões e Saída

Programa

Objetivo de Aprendizagem 1.3.A: Desenvolver código para gerar saída e determinar o resultado que seria exibido.

  • 1.3.A.1 System.out.print e System.out.println exibem informações na tela do computador. System.out.println move o cursor para uma nova linha após a informação ser exibida, enquanto System.out.print não faz isso.

Objetivo de Aprendizagem 1.3.B: Desenvolver código para utilizar literais de string e determinar o resultado de usar literais de string.

  • 1.3.B.1 Um literal é a representação de código de um valor fixo.
  • 1.3.B.2 Um literal de string é uma sequência de caracteres entre aspas duplas.
  • 1.3.B.3 Sequências de escape são sequências especiais de caracteres que podem ser incluídas numa string. Começam com um \ e têm um significado especial em Java. As sequências de escape usadas neste curso incluem aspas duplas \", barra invertida \\, e nova linha \n.

Objetivo de Aprendizagem 1.3.C: Desenvolver código para expressões aritméticas e determinar o resultado dessas expressões.

  • 1.3.C.1 Expressões aritméticas, que consistem em valores numéricos, variáveis e operadores, incluem expressões do tipo int e double.
  • 1.3.C.2 Os operadores aritméticos consistem em adição +, subtração -, multiplicação *, divisão / e resto %. Uma operação aritmética que usa dois valores int avaliará para um valor int. Uma operação aritmética que usa pelo menos um valor double avaliará para um valor double.
    • Declaração de exclusão: Expressões que resultam em valores double especiais (p.ex., infinitos e NaN) estão fora do escopo do curso e exame AP Computer Science A.
  • 1.3.C.3 Ao dividir valores numéricos que são ambos valores int, o resultado é apenas a porção inteira do quociente. Ao dividir valores numéricos que usam pelo menos um valor double, o resultado é o quociente.
  • 1.3.C.4 O operador de resto % é usado para calcular o resto quando um número a é dividido por outro número b.
    • Declaração de exclusão: O uso de valores menores que 0 para a e o uso de valores menores ou iguais a 0 para b está fora do escopo do curso e exame AP Computer Science A.
  • 1.3.C.5 Operadores podem ser usados para construir expressões compostas. Em tempo de compilação, valores numéricos são associados a operadores de acordo com a precedência dos operadores para determinar como eles são agrupados. Parênteses podem ser usados para modificar a precedência dos operadores. Multiplicação, divisão e resto têm precedência sobre adição e subtração. Operadores com a mesma precedência são avaliados da esquerda para a direita.
  • 1.3.C.6 Uma tentativa de dividir um inteiro pelo inteiro zero resultará em um ArithmeticException.
    • Declaração de exclusão: O uso de divisão por zero quando um valor numérico é um double está fora do escopo do curso e exame AP Computer Science A.

Fonte: College Board AP Course and Exam Description

Uma expressão 表达式 combina valores e operadores para computar um resultado: + - * / e % (módulo 取模, o resto). Divisão inteira truncata: 7 / 2 é 3, enquanto 7 % 2 é 1. Precedência de operadores segue a matemática (*,/,% antes de +,-). Imprima com:

System.out.print("no newline");
System.out.println("with newline");

Dividir um inteiro pelo inteiro 0 (como 7 / 0) não é permitido e causa um erro de ArithmeticException em tempo de execução. Dentro de uma string, uma barra invertida marca uma sequência de escape 转义序列: \" imprime uma aspa dupla, \\ uma barra invertida simples, e \n inicia uma nova linha – então System.out.println("She said \"hi\""); imprime She said "hi".

Explorar

Explorar a ordem das operações passo a passo

Java aplica *, /, % antes de + e -, trabalhando da esquerda para a direita. Observe cada etapa e veja por que 2 + 3 * 4 é $14$, não $20$ — a multiplicação acontece primeiro.

1.4

Instruções de Atribuição e Entrada

Programa

Objetivo de Aprendizagem 1.4.A: Desenvolver código para instruções de atribuição com expressões e determinar o valor que é armazenado na variável como resultado dessas instruções.

  • 1.4.A.1 Toda variável deve receber um valor antes de poder ser usada em uma expressão. Esse valor deve ser de um tipo de dado compatível. Uma variável é inicializada na primeira vez em que recebe um valor. Tipos referência podem receber um novo objeto ou null se não houver objeto. O literal null é um valor especial usado para indicar que uma referência não está associada a nenhum objeto.
  • 1.4.A.2 O operador de atribuição = permite que um programa inicialize ou mude o valor armazenado em uma variável. O valor da expressão à direita é armazenado na variável à esquerda.
    • Declaração de exclusão: O uso de operadores de atribuição dentro de expressões (p. ex., a = b = 4; ou a[i += 5]) está fora do escopo do curso e do exame de AP Computer Science A.
  • 1.4.A.3 Durante a execução, uma expressão é avaliada para produzir um único valor. O valor de uma expressão tem um tipo baseado na avaliação da expressão.

Objetivo de Aprendizagem 1.4.B: Desenvolver código para ler entrada.

  • 1.4.B.1 A entrada pode vir em várias formas, como tátil, áudio, visual ou texto. A classe Scanner é uma forma de obter entrada de texto pelo teclado.
    • Declaração de exclusão: Qualquer forma específica de entrada do usuário está fora do escopo do curso e do exame de AP Computer Science A.

Fonte: College Board AP Course and Exam Description

Uma atribuição 赋值 x = expr; avalia o lado direito e armazena na variável esquerda. Leia entrada usando um Scanner:

Scanner in = new Scanner(System.in);
int age = in.nextInt();
String name = in.next();
1.5

Cast e Faixa de Variáveis

Programa

Objetivo de Aprendizagem 1.5.A: Desenvolver código para fazer cast de valores primitivos para diferentes tipos primitivos em expressões aritméticas e determinar o valor produzido como resultado.

  • 1.5.A.1 Os operadores de cast (int) e (double) podem ser usados para converter de um valor double para um valor int (ou vice-versa).
  • 1.5.A.2 Fazer cast de um valor double para um valor int causa a truncagem dos dígitos à direita da vírgula decimal.
  • 1.5.A.3 Algum código causa que valores int sejam automaticamente convertidos (ampliados) para valores double.
  • 1.5.A.4 Valores do tipo double podem ser arredondados para o inteiro mais próximo por (int)(x + 0.5) para números não negativos ou (int)(x - 0.5) para números negativos.

Objetivo de Aprendizagem 1.5.B: Descrever condições em que uma expressão inteira avalia para um valor fora do intervalo.

  • 1.5.B.1 A constante Integer.MAX_VALUE armazena o valor do maior possível valor int. A constante Integer.MIN_VALUE armazena o valor do menor possível valor int.
  • 1.5.B.2 Valores inteiros no Java são representados por valores do tipo int, que são armazenados usando uma quantidade finita (4 bytes) de memória. Portanto, um valor int deve estar no intervalo de Integer.MIN_VALUE a Integer.MAX_VALUE inclusive.
  • 1.5.B.3 Se uma expressão avaliasse para um valor int fora do intervalo permitido, ocorre um overflow inteiro. O resultado é um valor int no intervalo permitido, mas não necessariamente o valor esperado.

Objetivo de Aprendizagem 1.5.C: Descrever condições que limitam a precisão de expressões.

  • 1.5.C.1 Computadores alocam uma quantidade especificada de memória para armazenar dados com base no tipo de dado. Se uma expressão avaliasse para um double que seja mais preciso do que pode ser armazenado na quantidade alocada de memória, ocorre um erro de arredondamento. O resultado será arredondado para o valor representável. Para evitar erros de arredondamento que ocorrem naturalmente, use valores int.
    • Declaração de exclusão: Outros tipos de dados decimais especiais que podem ser usados para evitar erros de arredondamento estão fora do escopo do curso e do exame de AP Computer Science A.

Fonte: College Board AP Course and Exam Description

Faixa de int, overflow e truncagem

Cada tipo possui um intervalo fixo; um int transborda para além de aproximadamente 2.1 bilhão. Conversão (Casting) converte entre tipos. A conversão ampliadora (de int para double) é automática; a conversão redutora exige uma conversão explícita, que trunca (não arredonda):

double avg = (double) total / count;   // force real division
int whole = (int) 3.9;                 // 3, truncated

Habilidade de prova: observe divisões inteiras produzindo resultados truncados quando um decimal era esperado – faça cast de um operando para double primeiro.

Exemplo resolvido. Rastreie cada expressão:

  • 7 / 2 → 3 (ambos int, então a divisão trunca);
  • 7.0 / 2 → 3.5 (um double força divisão real);
  • 7 % 2 → 1 (o resto);
  • (double) 7 / 2 → 3.5 (o cast se liga mais fortemente que /, portanto é 7.0 / 2);
  • (double) (7 / 2) → 3.0 (os parênteses calculam 7 / 2 = 3 em int primeiro, depois ampliam).

As duas últimas parecem iguais, mas diferem – a posição do cast decide onde a truncagem ocorre.

Explorar

Por que int e double armazenam números diferentemente

Um int armazena apenas números inteiros em uma faixa fixa; um double armazena uma mantissa e um expoente, trocando precisão por uma faixa enorme. Converter double→int descarta a fração, e um valor além da faixa de um int transborda.

Vocabulário Treinar
Inglês Chinês Pinyin
Casting/ˈkæstɪŋ/ 类型转换 lèi xíng zhuǎn huàn
library/ˈlaɪbrəri/ 库 kù
abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
Comments/ˈkɒments/ 注释 zhù shì
method signature/ˈmeθəd ˈsɪɡnɪtʃə/ 方法签名 fāng fǎ qiān míng
arguments/ˈɑːɡjuːmənts/ 实参 shí cān
class (static) method/klæs ˈmeθəd/ 类方法 lèi fāng fǎ
1.6

Operadores de Atribuição Compostos

Programa

Objetivo de Aprendizagem 1.6.A: Desenvolver código para instruções de atribuição com operadores de atribuição composta e determinar o valor armazenado na variável como resultado.

  • 1.6.A.1 Operadores de atribuição composta +=, -=, *=, /= e %= podem ser usados no lugar do operador de atribuição em expressões numéricas. Um operador de atribuição composta realiza a operação aritmética indicada entre o valor à esquerda e o valor à direita e, em seguida, atribui o resultado à variável à esquerda.
  • 1.6.A.2 O operador pós-incremento ++ e o operador pós-decremento -- são usados para adicionar 1 ou subtrair 1 do valor armazenado de uma variável numérica. O novo valor é atribuído à variável.
    • Declaração de exclusão: O uso de operadores de incremento e decremento na forma prefixa (p. ex., ++x) está fora do escopo do curso e do exame de AP Computer Science A. O uso de operadores de incremento e decremento dentro de outras expressões (p. ex., arr[x++]) está fora do escopo do curso e do exame de AP Computer Science A.

Fonte: College Board AP Course and Exam Description

Abreviações combinam uma operação com atribuição: x += 5 significa x = x + 5; semelhantemente -=, *=, /=, %=. Os operadores de incremento e decremento x++ e x-- somam ou subtraem um.

1.7

Interface de Aplicativo de Programa (API) e Bibliotecas

Programa

Objetivo de Aprendizagem 1.7.A: Identificar os atributos e comportamentos de uma classe encontrada nas bibliotecas contidas em uma API.

  • 1.7.A.1 Bibliotecas são conjuntos de classes. Uma especificação de interface de programação de aplicativos (API) informa ao programador como usar essas classes. A documentação encontrada em especificações de API e bibliotecas é essencial para entender os atributos e comportamentos de uma classe definida pela API. Uma classe define um tipo de referência específico. Classes nas APIs e bibliotecas são agrupadas em pacotes. Classes existentes e bibliotecas de classes podem ser utilizadas para criar objetos.
  • 1.7.A.2 Atributos referem-se aos dados relacionados à classe e são armazenados em variáveis. Comportamentos referem-se ao que as instâncias da classe podem fazer (ou o que pode ser feito com elas) e são definidos por métodos.

Fonte: College Board AP Course and Exam Description

Uma API (Interface de Programação de Aplicativos) é a lista publicada de classes e métodos que você pode usar. Uma biblioteca é uma coleção de classes prontas (como Math, String, Scanner). Você lê a documentação da API para aprender o que um método precisa (seus parâmetros) e retorna, sem ver seu código interno – um exemplo de abstração.

Vocabulário Treinar
Inglês Chinês Pinyin
Interface/ˈɪntəfeɪs/ 应用程序接口 yìng yòng chéng xù jiē kǒu
1.8

Documentação com Comentários

Programa

Objetivo de Aprendizagem 1.8.A: Descrever a funcionalidade e o uso do código através de comentários.

  • 1.8.A.1 Comentários são escritos tanto para o programador original quanto para outros programadores para compreender o código e sua funcionalidade, mas são ignorados pelo compilador e não são executados quando o programa é executado. Três tipos de comentários em Java incluem /* */, que gera um bloco de comentários; //, que gera um comentário em uma linha; e /** */, que são comentários Javadoc e são usados para criar documentação de API.
  • 1.8.A.2 Uma pré-condição é uma condição que deve ser verdadeira imediatamente antes da execução de um método para que ele se comporte conforme o esperado. Não há expectativa de que o método verifique se as pré-condições foram satisfeitas.
  • 1.8.A.3 Uma pós-condição é uma condição que deve sempre ser verdadeira após a execução de um método. Pós-condições descrevem o resultado da execução em termos do que está sendo retornado ou do valor atual dos atributos de um objeto.

Fonte: College Board AP Course and Exam Description

Comentários 注释 são ignorados pelo compilador, mas explicam o código aos humanos: // para uma única linha, /* ... */ para um bloco, e /** ... */ para um comentário Javadoc que documenta o propósito, parâmetros e retorno de um método. Pré-condições e pós-condições precisas são escritas aqui.

1.9

Assinaturas de Métodos

Programa

Objetivo de Aprendizagem 1.9.A: Identificar o método correto a ser chamado com base na documentação e nas assinaturas de método.

  • 1.9.A.1 Um método é um bloco de código nomeado que só é executado quando é chamado. Um bloco de código é qualquer seção de código que está envolvida em chaves. Abstração procedural permite que um programador use um método sabendo o que o método faz, mesmo que não saiba como o método foi escrito.
  • 1.9.A.2 Um parâmetro é uma variável declarada no cabeçalho de um método ou construtor e pode ser usada dentro do corpo do método. Isso permite que valores ou argumentos sejam passados e usados por um método ou construtor. Uma assinatura de método para um método com parâmetros consiste no nome do método e na lista ordenada de tipos de parâmetro. Uma assinatura de método para um método sem parâmetros consiste no nome do método e em uma lista de parâmetros vazia.

Objetivo de Aprendizagem 1.9.B: Descrever como chamar métodos.

  • 1.9.B.1 Um método void não possui valor de retorno e, portanto, não é chamado como parte de uma expressão.
  • 1.9.B.2 Um método não-void retorna um valor que é do mesmo tipo que o tipo de retorno no cabeçalho. Para usar o valor de retorno ao chamar um método não-void, ele deve ser armazenado em uma variável ou usado como parte de uma expressão.
  • 1.9.B.3 Um argumento é um valor que é passado para um método quando o método é chamado. Os argumentos passados para um método devem ser compatíveis em número e ordem com os tipos identificados na lista de parâmetros da assinatura do método. Ao chamar métodos, argumentos são passados por valor. Passagem por valor inicializa os parâmetros com cópias dos argumentos.
  • 1.9.B.4 Métodos são ditos sobrecarregados (overloaded) quando existem múltiplos métodos com o mesmo nome, mas assinaturas diferentes.
  • 1.9.B.5 Uma chamada de método interrompe a execução sequencial de instruções, fazendo com que o programa execute primeiro as instruções no método antes de continuar. Uma vez que a última instrução no método foi executada ou uma instrução return é executada, o fluxo de controle é retornado ao ponto imediatamente posterior onde o método foi chamado.

Fonte: College Board AP Course and Exam Description

Uma assinatura de método 方法签名 é o nome do método mais seus tipos de parâmetro, p. ex. nextInt() ou substring(int, int). Para chamar um método, você deve fornecer argumentos 实参 que correspondam aos parâmetros em número, tipo e ordem. O cabeçalho do método (a declaração completa) também declara o tipo de retorno – o tipo de valor que o método devolve (void se nenhum) – mas o tipo de retorno não faz parte da assinatura, por isso dois métodos não podem diferir apenas pelo tipo de retorno.

1.10

Chamando Métodos de Classe

Programa

Objetivo de Aprendizagem 1.10.A: Desenvolver código para chamar métodos de classe e determinar o resultado dessas chamadas.

  • 1.10.A.1 Métodos de classe estão associados à classe, não às instâncias da classe. Métodos de classe incluem a palavra-chave static no cabeçalho antes do nome do método.
  • 1.10.A.2 Métodos de classe são tipicamente chamados usando o nome da classe junto com o operador ponto. Quando a chamada do método ocorre na classe definidora, o uso do nome da classe é opcional na chamada.

Fonte: College Board AP Course and Exam Description

Um método de classe (estático) 类方法 pertence à própria classe, então você o chama no nome da classe: ClassName.method(args). Nenhum objeto é necessário.

Explorar

Seguir uma chamada de método de classe na pilha

Chamar um método de classe como Math.max empurra um novo quadro para a pilha de chamadas; quando o método retorna um valor, seu quadro é removido e o controle volta para o chamador. Avance para ver a pilha crescer e diminuir.

1.11

Classe Math

Programa

Objetivo de Aprendizagem 1.11.A: Desenvolver código para escrever expressões que incorporam chamadas a bibliotecas matemáticas embutidas e determinar o valor que é produzido como resultado.

  • 1.11.A.1 A classe Math faz parte do pacote java.lang. As classes no pacote java.lang estão disponíveis por padrão.
  • 1.11.A.2 A classe Math contém apenas métodos de classe. Os seguintes métodos de classe Math—incluindo o que eles fazem e quando são usados—fazem parte do Java Quick Reference:
    • static int abs(int x) retorna o valor absoluto de um valor int.
    • static double abs(double x) retorna o valor absoluto de um valor double.
    • static double pow(double base, double exponent) retorna o valor do primeiro parâmetro elevado à potência do segundo parâmetro.
    • static double sqrt(double x) retorna a raiz quadrada não negativa de um valor double.
    • static double random() retorna um valor double maior ou igual a 0.0 e menor que 1.0.
  • 1.11.A.3 Os valores retornados de Math.random() podem ser manipulados usando operadores aritméticos e de conversão de tipo para produzir um inteiro aleatório int ou ⟨float⟩ double em um intervalo definido com base em critérios especificados. Cada extremidade do intervalo pode ser inclusiva, significando que o valor é incluído, ou exclusiva, significando que o valor não é incluído.

Fonte: College Board AP Course and Exam Description

A classe Math fornece métodos matemáticos estáticos: Math.abs(x), Math.pow(base, exp), Math.sqrt(x) e Math.random() (um double dentro de $[0,1)$). Para obter um inteiro aleatório de 0 a n-1: (int)(Math.random() * n).

1.12

Objetos: Instâncias de Classes

Programa

Objetivo de Aprendizagem 1.12.A: Explicar a relação entre uma classe e um objeto.

  • 1.12.A.1 Um objeto é uma instância específica de uma classe com atributos definidos. Uma classe é a implementação formal, ou modelo, dos atributos e comportamentos de um objeto.
  • 1.12.A.2 Uma hierarquia de classes pode ser desenvolvida colocando atributos e comportamentos comuns de classes relacionadas em uma única classe chamada superclasse. Classes que estendem uma superclasse, chamadas subclasses, podem utilizar os atributos e comportamentos existentes da superclasse sem substituí-los no código. Isso cria uma relação de herança das subclasses para a superclasse.
    • Declaração de exclusão: Desenhar e implementar relações de herança estão fora do escopo do curso e exame AP Computer Science A.
  • 1.12.A.3 Todas as classes em Java são subclasses da classe Object.

Objetivo de Aprendizagem 1.12.B: Desenvolver código para declarar variáveis para armazenar tipos de referência.

  • 1.12.B.1 Uma variável de um tipo de referência armazena uma referência de objeto, que pode ser pensada como o endereço de memória desse objeto.

Fonte: College Board AP Course and Exam Description

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

Uma classe 类 é um projeto; um objeto 对象 é uma instância 实例 concreta construída a partir dela. Uma classe agrupa dados (campos) com comportamento (métodos) – o cerne da programação orientada a objetos 面向对象编程. String, Scanner e ArrayList são todas classes que você instanciará.

As classes podem ser organizadas em uma hierarquia. Um superclasse 父类 possui atributos e comportamentos compartilhados por várias subclasses 子类 que extend ela – uma relação de herança 继承关系. Toda classe em Java é, por fim, uma subclasse da classe embutida Object, que é por isso que todo objeto já possui um método toString; escrever um método de subclasse com a mesma assinatura de um de superclasse é sobrecarga de método 方法重写. (Projetar sua própria herança foge deste curso, mas espera-se que você reconheça este vocabulário.)

Diagrama de classes: atributos privados e métodos públicos
Diagrama de classes: atributos privados e métodos públicos
Uma classe é um projeto; cada objeto é uma instância construída a partir dele
Uma classe é um projeto; cada objeto é uma instância construída a partir dele
Vocabulário Treinar
Inglês Chinês Pinyin
class/klæs/ 类 lèi
object/ˈɒbdʒekt/ 对象 duì xiàng
instance/ˈɪnstəns/ 实例 shí lì
object-oriented programming/ˈɒbdʒekt ˈɔːrɪəntɪd ˈprəʊɡræmɪŋ/ 面向对象编程 miàn xiàng duì xiàng biān chéng
superclass/ˈsuːpəklæs/ 父类 fù lèi
subclasses/ˈsʌbklæsɪz/ 子类 zi lèi
inheritance relationship/ɪnˈherɪtəns rɪˈleɪʃənʃɪp/ 继承关系 jì chéng guān xì
method overriding/ˈmeθəd ˌəʊvəˈraɪdɪŋ/ 方法重写 fāng fǎ zhòng xiě
Instantiation/ˌɪnstænʃɪˈeɪʃn/ 实例化 shí lì huà
constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
reference/ˈrefrəns/ 引用 yǐn yòng
1.13

Criação e Armazenamento de Objetos (Instanciação)

Programa

Objetivo de Aprendizagem 1.13.A: Identificar, usando sua assinatura, o construtor correto sendo chamado.

  • 1.13.A.1 Uma classe contém construtores que são chamados para criar objetos. Eles têm o mesmo nome da classe.
  • 1.13.A.2 Uma assinatura de construtor consiste no nome do construtor, que é o mesmo que o nome da classe, e na lista ordenada dos tipos de parâmetro. A lista de parâmetros, no cabeçalho de um construtor, lista os tipos dos valores que são passados e seus nomes de variável.
  • 1.13.A.3 Construtores são ditos sobrecarregados quando existem múltiplos construtores com assinaturas diferentes.

Objetivo de Aprendizagem 1.13.B: Desenvolver código para declarar variáveis dos tipos corretos para armazenar referências de objeto.

  • 1.13.B.1 Uma variável de um tipo referência armazena uma referência de objeto ou, se não houver objeto, null.

Objetivo de Aprendizagem 1.13.C: Desenvolver código para criar um objeto chamando um construtor.

  • 1.13.C.1 Um objeto geralmente é criado usando a palavra-chave new seguida por uma chamada a um dos construtores da classe.
  • 1.13.C.2 Parâmetros permitem que construtores aceitem valores para estabelecer os valores iniciais dos atributos do objeto.
  • 1.13.C.3 Um argumento de construtor é um valor passado para um construtor quando este é chamado. Os argumentos passados para um construtor devem ser compatíveis em ordem e quantidade com os tipos identificados na lista de parâmetros na assinatura do construtor. Ao chamar construtores, argumentos são passados por valor. Passagem por valor inicializa os parâmetros com cópias dos argumentos.
  • 1.13.C.4 Uma chamada a um construtor interrompe a execução sequencial de instruções, fazendo com que o programa execute primeiro as instruções no construtor antes de continuar. Após a última instrução no construtor ser executada, o fluxo de controle retorna ao ponto imediatamente após onde o construtor foi chamado.

Fonte: College Board AP Course and Exam Description

Instanciação 实例化 cria um objeto com a palavra-chave new, que chama um construtor 构造函数:

Scanner in = new Scanner(System.in);
String s = new String("hi");   // or just "hi"

A variável armazena uma referência 引用 (o endereço do objeto), não o objeto em si. Duas referências podem apontar para o mesmo objeto; compará-las com == compara endereços, não conteúdos.

Uma referência também pode não apontar para nada: o valor especial null 空值 significa "não conectado a nenhum objeto". Chamar um método em uma referência nula causa erro em tempo de execução com um NullPointerException. Proteja-se testando com ==/!= e verificando null primeiro, para que && faça avaliação de curto-circuito antes do método rodar: if (s != null && s.length() > 0).

Uma variável primitiva armazena seu valor diretamente, uma referência armazena uma seta para o objeto
Uma variável primitiva armazena seu valor diretamente, uma referência armazena uma seta para o objeto
Vocabulário Treinar
Inglês Chinês Pinyin
null/nʌl/ 空值 kōng zhí
instance method/ˈɪnstəns ˈmeθəd/ 实例方法 shí lì fāng fǎ
immutable/ɪˈmjuːtəbl/ 不可变 bù kě biàn
1.14

Chamando Métodos de Instância

Programa

Objetivo de Aprendizagem 1.14.A: Desenvolver código para chamar métodos de instância e determinar o resultado dessas chamadas.

  • 1.14.A.1 Métodos de instância são chamados em objetos da classe. O operador ponto é usado junto com o nome do objeto para chamar métodos de instância.
  • 1.14.A.2 Uma chamada de método em uma referência null resultará em um NullPointerException.

Fonte: College Board AP Course and Exam Description

Um método de instância 实例方法 age sobre um objeto específico, então você o chama na referência do objeto: object.method(args). Exemplo: in.nextInt(), word.length().

1.15

Manipulação de Strings

Programa

Objetivo de Aprendizagem 1.15.A: Desenvolver código para criar objetos de string e determinar o resultado da criação e combinação de strings.

  • 1.15.A.1 Um objeto String representa uma sequência de caracteres e pode ser criado usando uma literal de string ou chamando o construtor da classe String.
  • 1.15.A.2 A classe String faz parte do pacote java.lang. Classes no pacote java.lang estão disponíveis por padrão.
  • 1.15.A.3 Um objeto String é imutável, significando que, uma vez que um objeto String é criado, seus atributos não podem ser alterados. Métodos chamados em um objeto String não alteram o conteúdo do objeto String.
  • 1.15.A.4 Dois objetos String podem ser concatenados ou combinados usando o operador + ou +=, resultando em um novo objeto String. Um valor primitivo pode ser concatenado com um objeto String. Isso causa a conversão implícita do valor primitivo para um objeto String.
  • 1.15.A.5 Um objeto String pode ser concatenado com qualquer objeto, o que chama implicitamente o método toString do objeto (um comportamento garantido pela relação de herança que toda classe tem com a classe Object). O método toString de um objeto retorna um valor de string representando o objeto. Subclasses de Object frequentemente sobrescrevem o método toString com implementação específica da classe. Sobrescrita de método ocorre quando um método público em uma subclasse possui a mesma assinatura de método que um método público na superclasse, mas o comportamento do método é específico da subclasse.
    • Declaração de exclusão: Sobrescrever o método toString de uma classe está fora do escopo do curso e exame AP Computer Science A.

Objetivo de Aprendizagem 1.15.B: Desenvolver código para chamar métodos em objetos de string e determinar o resultado dessas chamadas.

  • 1.15.B.1 Um objeto String possui valores de índice de 0 até um menos que o comprimento da string. Tentar acessar índices fora dessa faixa resultará em um StringIndexOutOfBoundsException.
  • 1.15.B.2 Os seguintes métodos String—incluindo o que fazem e quando são usados—fazem parte da Referência Rápida Java:
    • int length() retorna o número de caracteres em um objeto String.
    • String substring(int from, int to) retorna a substring começando no índice from e terminando no índice to - 1.
    • String substring(int from) retorna substring(from, length()).
    • int indexOf(String str) retorna o índice da primeira ocorrência de str; retorna -1 se não for encontrado.
    • boolean equals(Object other) retorna true se this corresponder à mesma sequência de caracteres que other; retorna false caso contrário.
    • int compareTo(String other) retorna um valor < 0 if this is less than other; returns zero if this is equal to other; returns a value > 0 se this for maior que other. As strings são ordenadas com base no alfabeto.
    • Declaração de exclusão: Usar o método equals para comparar um objeto String com um objeto de um tipo diferente de String está fora do escopo do curso e exame AP Computer Science A.
  • 1.15.B.3 Uma string idêntica ao único elemento de substring na posição index pode ser criada chamando substring(index, index + 1).

Fonte: College Board AP Course and Exam Description

Strings são imutáveis

Objetos String são imutáveis 不可变 – métodos retornam uma string nova em vez de alterar a original. Principais métodos (todos os índices começam em 0):

s.length();            // number of characters
s.substring(2, 5);     // chars at index 2,3,4 (5 excluded)
s.indexOf("ab");       // first position, or -1
s.equals(other);       // content comparison (never use == for Strings)
s.compareTo(other);    // <0, 0, >0 by dictionary order

Habilidade para prova: substring(a, b) inclui o índice a mas exclui b, e comparação de String deve usar .equals, não == – dois dos principais armadilhas de String cobradas em provas.

Exemplo resolvido. Seja String s = "COMPUTER"; (índices 0–7). Então s.length() é 8; s.substring(0, 4) é "COMP" (índices 0,1,2,3 – índice 4 excluído); s.substring(4) é "UTER" (do índice 4 até o final); s.indexOf("PU") é 3; e s.indexOf("X") é -1 (não encontrado). Contar a extremidade excluída de substring é o erro mais comum isoladamente.

Pedir um índice fora de 0 até length()-1 (um argumento substring ou charAt inválido, por exemplo, s.substring(0, 20) aqui) causa falha com um erro StringIndexOutOfBoundsException – o primo do erro de índice de array nas Strings.

Índices de String começam em 0
Índices de String começam em 0
Explorar

Explorar índices e fatias de strings

Cada caractere tem um índice, e a numeração começa em 0. Arraste o início e o fim para ver como substring(from, to) pega os caracteres de from até — mas não incluindo — to.

1.15

Dicas de prova

  • Rastreie código manualmente linha por linha, rastreando o valor de cada variável em uma tabela — a prova recompensa rastreamento cuidadoso em vez de adivinhação.
  • Conheça os tipos primitivos do Java e que a divisão inteira truncará ($7/2$ dá $3$); use um cast ou um double para divisão real.
  • Distinguir erros de tempo de compilação (sintaxe, tipos) de erros de tempo de execução – conhecer os nomeados: ArithmeticException (int ÷ 0), NullPointerException (método em referência nula), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – e erros de lógica (saída incorreta).
  • Siga a precedência de operadores e inicialize toda variável antes de usá-la.
  • Na resposta discursiva, escreva Java completo e compilável – retorne o tipo correto e corresponda exatamente ao cabeçalho do método.

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