Перейти к содержанию

Создание классов

AP Информатика A · Тема 3

Видеоурок по этой теме Открыть страницу видео
7:26

Создание классов

Вот студент, хранящийся как три отдельных переменных: имя, курс и оценка. Это работает. Теперь добавьте тысячу студентов. Вам понадобятся три тысячи переменных…

Английское озвучивание · Английский + китайские субтитры (встроенные)

3.1

Абстракция и проектирование программ

Программа

Цель обучения 3.1.A: Представлять проект программы с помощью естественного языка или диаграмм, указывающих классы в программе и данные и процедурные абстракции, найденные в каждом классе, включая все атрибуты и поведения.

  • 3.1.A.1 Абстракция — это процесс снижения сложности путем сосредоточения на основной идее. Скрывая детали, не относящиеся к текущему вопросу, и объединяя связанные и полезные детали, абстракция снижает сложность и позволяет сосредоточиться на идее.
  • 3.1.A.2 Абстракция данных обеспечивает разделение между абстрактными свойствами типа данных и конкретными деталями его представления. Абстракция данных управляет сложностью, предоставляя данным имя без ссылки на конкретные детали представления. Данные могут принимать форму одной переменной или набора данных, например, в классе или наборе данных.
  • 3.1.A.3 Атрибут — это вид абстракции данных, который определяется в классе вне любого метода или конструктора. Переменная экземпляра — это атрибут, значение которого уникально для каждого экземпляра класса. Переменная класса — это атрибут, общий для всех экземпляров класса.
  • 3.1.A.4 Процедурная абстракция предоставляет имя процессу и позволяет использовать метод, зная только то, что он делает, а не как он это делает. Посредством декомпозиции методов программист разбивает крупные поведения класса на более мелкие, создавая методы для представления каждого отдельного мелкого поведения. Процедурная абстракция может извлекать общие черты для обобщения функциональности вместо дублирования кода. Это позволяет использовать код повторно, что помогает управлять сложностью.
  • 3.1.A.5 Использование параметров позволяет обобщать процедуры, позволяя использовать их с различными входными значениями или аргументами.
  • 3.1.A.6 Использование процедурной абстракции в программе позволяет программистам изменять внутреннюю часть метода (например, ускорить его, повысить эффективность, уменьшить потребление памяти и т. д.) без необходимости уведомлять пользователей метода об изменениях, при условии сохранения подписи метода и того, что он делает.
  • 3.1.A.7 Перед реализацией класса полезно уделить время проектированию каждого класса, включая его атрибуты и поведение. Этот проект может быть представлен с помощью естественного языка или диаграмм.

Источник: Описание курса и экзамена College Board AP

Сборка пазла в процессе: классы и методы — это модульные части более крупного проекта программы
Сборка пазла в процессе: классы и методы — это модульные части более крупного проекта программы

Абстракция означает сокрытие деталей за простым интерфейсом — вы используете String, не зная, как он хранит символы. Хороший дизайн разбивает задачу на классы, каждый из которых отвечает за одну концепцию. Эта тема посвящена написанию ваших собственных классов.

Декомпозиция программы на модули и подмодули
Декомпозиция программы на модули и подмодули
3.2

Влияние проектирования программ

Программа

Цель обучения 3.2.A: Объяснять социальные и этические последствия вычислительных систем.

  • 3.2.A.1 Надежность системы означает способность программы выполнять свои задачи ожидаемым образом в stated условиях без сбоев. Программисты должны предпринимать усилия по максимизации надежности системы, тестируя программу с использованием различных условий.
  • 3.2.A.2 Создание программ оказывает влияние на общество, экономику и культуру. Это влияние может быть как положительным, так и отрицательным. Программы, предназначенные для удовлетворения потребностей или решения проблем, могут иметь нежелательные вредные последствия за пределами их прямого назначения.
  • 3.2.A.3 При создании программ возникают правовые вопросы и проблемы, связанные с интеллектуальной собственностью. Программисты часто переиспользуют код, написанный другими и опубликованный в виде открытого исходного кода (open source), доступный бесплатно. Использование кода, который не является открытым исходным кодом, требует получения разрешения у автора и часто покупки лицензии перед интеграцией этого кода в свою программу.

Источник: Описание курса и экзамена College Board AP

Выборы в дизайне влияют на то, является ли код правильным, читаемым и повторно используемым. Инкапсуляция — сохранение данных в приватном доступе и предоставление к ним доступа только через методы — защищает состояние объекта от неправильного использования и позволяет изменять внутреннюю часть, не нарушая работу пользователей класса. Продуманное именование, методы с одной целью и тестирование снижают количество ошибок.

Дизайн также несет ответственность, выходящую за рамки кода. Надежность системы — способность программы выполнять свои задачи так, как ожидалось, без сбоев, — это то, что программисты должны максимизировать благодаря тщательному дизайну и тестированию. Программы оказывают реальное влияние на общество, экономику и культуру, которое может быть как положительным, так и отрицательным. Создание программ поднимает юридические вопросы и вопросы интеллектуальной собственности: программисты часто используют код, опубликованный как открытый исходный код и свободный для использования, но должны соблюдать его лицензию и указывать авторство, а не копировать чужие работы как свои собственные.

3.3

Анатомия класса

Программа

Цель обучения 3.3.A: Написать код для определения ограничений доступа и видимости классов, данных, конструкторов и методов.

  • 3.3.A.1 Инкапсуляция данных — это техника, при которой детали реализации класса скрыты от внешних классов. Ключевые слова public и private влияют на уровень доступа к классам, данным, конструкторам и методам. Ключевое слово private ограничивает доступ только объявляющим классом, в то время как ключевое слово public позволяет доступ со стороны классов, находящихся вне объявляющего класса.
  • 3.3.A.2 В данном курсе классы всегда обозначаются как public и объявляются с использованием ключевого слова class.
  • 3.3.A.3 В данном курсе конструкторы всегда обозначаются как public.
  • 3.3.A.4 Экземплярные переменные принадлежат объекту, и каждый объект имеет свою собственную копию такой переменной.
  • 3.3.A.5 Доступ к атрибутам должен быть ограничен внутренним пространством класса для обеспечения инкапсуляции. Поэтому хорошей практикой программирования является обозначение экземплярных переменных для этих атрибутов как private, если иное не указано в спецификации класса.
  • 3.3.A.6 Доступ к поведению (методам) может быть как внутренним, так и внешним относительно класса. Методы, обозначенные как public, могут вызываться как изнутри, так и снаружи класса, тогда как методы, обозначенные как private, доступны только внутри класса.

Источник: Описание курса и экзамена College Board AP

Класс состоит из трех частей: экземплярных переменных (полей — данных объекта), конструкторов (создания объектов) и методов (поведения). Поля обычно объявляются private; методы обычно объявляются public:

Диаграмма классов: приватные атрибуты и публичные методы
Диаграмма классов: приватные атрибуты и публичные методы
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
}
Чертеж: класс — это шаблон, определяющий, как создаются объекты этого типа
Чертеж: класс — это шаблон, определяющий, как создаются объекты этого типа
Исследовать

Представьте поля объекта как контейнеры

Класс объединяет связанные данные (его поля) и методы. Каждый объект получает собственный набор контейнеров для полей; изменение одного влияет только на этот объект.

English Русский
Abstraction/əbˈstrækʃn/ Абстрагирование
Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ Инкапсуляция
System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ Надежность системы
legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ правовые вопросы и интеллектуальная собственность
open source/ˈəʊpən sɔːs/ open source
instance variables/ˈɪnstəns ˈveərɪəblz/ переменные экземпляра
constructor/kənˈstrʌktə/ конструктор
overloading/ˌəʊvəˈləʊdɪŋ/ перегрузкой
accessor (getter)/əkˈsesə/ геттер (accessor)
3.4

Конструкторы

Программа

Цель обучения 3.4.A: Написать код для объявления экземплярных переменных для атрибутов, которые должны быть инициализированы в теле конструкторов класса.

  • 3.4.A.1 Состояние объекта относится к его атрибутам и их значениям в определенный момент времени и определяется экземплярными переменными, принадлежащими этому объекту. Это определяет отношение «имеет» (has-a) между объектом и его экземплярными переменными.
  • 3.4.A.2 Конструктор используется для установки начального состояния объекта, которое должно включать начальные значения для всех экземплярных переменных. При вызове конструктора выделяется память под объект, и возвращается ссылка на этот объект. Параметры конструктора, если они указаны, передают данные для инициализации экземплярных переменных.
  • 3.4.A.3 Когда изменяемый объект является параметром конструктора, экземплярная переменная должна быть инициализирована копией этого объекта. Таким образом, экземплярная переменная не будет содержать ссылку на оригинальный объект, что предотвращает возможность изменения состояния оригинального объекта через методы.
  • 3.4.A.4 Если конструктор не написан явно, Java предоставляет конструктор без параметров, а экземплярные переменные устанавливаются в значения по умолчанию в соответствии с типом данных атрибута. Этот конструктор называется конструктором по умолчанию.
  • 3.4.A.5 Значение по умолчанию для атрибута типа int равно 0. Значение по умолчанию для атрибута типа double равно 0.0. Значение по умолчанию для атрибута типа boolean равно false. Значение по умолчанию для ссылочного типа равно null.

Источник: Описание курса и экзамена College Board AP

Конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа. Он вызывается при записи new, и его задача — инициализировать поля. Класс может иметь несколько конструкторов с разными списками параметров (перегрузка); конструктор без параметров устанавливает значения по умолчанию.

3.5

Методы: Как их писать

Программа

Цель обучения 3.5.A: Написать код для определения поведения объекта через методы, написанные в классе, используя примитивные значения, и определить результат вызова этих методов.

  • 3.5.A.1 Метод void не возвращает значение. В его заголовке перед именем метода содержится ключевое слово void.
  • 3.5.A.2 Непустой метод (возвращающий значение) возвращает одно значение. В его заголовке вместо ключевого слова void указывается тип возвращаемого значения.
  • 3.5.A.3 В непустых методах вычисляется выражение возврата, совместимое с типом возвращаемого значения, и оно возвращается. Это называется возвратом по значению.
  • 3.5.A.4 Ключевое слово return используется для возврата потока управления в точку, где был вызван метод или конструктор. Любой код, следующий последовательно после оператора return, никогда не будет выполнен. Выполнение оператора return внутри условия выбора или цикла остановит выполнение данного блока и завершит работу метода или конструктора.
  • 3.5.A.5 Метод-аксессуар (accessor method) позволяет объектам других классов получать копию значения экземплярных переменных или переменных класса. Метод-аксессуар является непустым методом.
  • 3.5.A.6 Мутатор (mutator method) — это метод, который изменяет значения экземплярных переменных или переменных класса. Мутатор часто является методом без возвращаемого значения (void-методом).
  • 3.5.A.7 Методы с параметрами получают значения через эти параметры и используют их для выполнения задачи метода.
  • 3.5.A.8 Когда аргумент является примитивным значением, параметр инициализируется копией этого значения. Изменения, внесенные в параметр, не оказывают влияния на соответствующий аргумент.

Источник: Описание курса и экзамена College Board AP

Метод имеет сигнатуру, тип возвращаемого значения и тело. Аксессор (getter) возвращает информацию, не изменяя объект; мутатор (setter) изменяет поле. Метод, возвращающий значение, должен иметь оператор return правильного типа на каждом пути; метод void ничего не возвращает.

public void setScore(int s) { score = s; }   // mutator
public String toString() { return name + ": " + score; }
Исследовать

Отследите вызов метода и его возвращение

Вызов метода помещает фрейм с его параметрами; когда он достигает return, фрейм удаляется, и значение возвращается вызывающей функции.

English Русский
mutator (setter)/mjuːˈteɪtə/ сеттер (mutator)
static (class) variable/ˈstætɪk ˈveərɪəbl/ статическая (классовая) переменная
3.6

Передача и возврат ссылок на объект

Программа

Цель обучения 3.6.A: Написать код для определения поведения объекта через методы, написанные в классе, используя ссылки на объекты, и определить результат вызова этих методов.

  • 3.6.A.1 Когда аргументом является ссылка на объект, параметр инициализируется копией этой ссылки; при этом не создается новая независимая копия самого объекта. Если параметр ссылается на изменяемый объект, метод или конструктор может использовать эту ссылку для изменения состояния объекта. Хорошей практикой программирования считается не изменять изменяемые объекты, передаваемые в качестве параметров, если это не требуется в спецификации.
  • 3.6.A.2 Когда возвращаемое выражение вычисляется как ссылка на объект, возвращается сама ссылка, а не ссылка на новую копию этого объекта.
  • 3.6.A.3 Методы не могут получить доступ к приватным данным и методам параметра, хранящего ссылку на объект, если только этот параметр не имеет того же типа, что и класс-обладатель данного метода.

Источник: Описание курса и экзамена College Board AP

= копирует ссылку, а не объект

Когда вы передаете объект методу, Java копирует ссылку, поэтому метод действует с тем же объектом — изменения его полей видны вызывающей стороне. (Примитивы копируются по значению, поэтому изменения в них не видны.) Метод также может возвращать ссылку на объект. Поскольку String неизменяем (immutable), передача его безопасна; передача изменяемого объекта позволяет методу изменить его.

Java передает по значению: метод получает копию; истинная передача по ссылке, которой нет в Java, позволила бы ему переназначить переменную вызывающей стороны
Java всегда передает по значению (слева): метод получает копию ссылки. Истинная передача по ссылке (справа) — которой нет в Java — позволила бы методу переназначить собственную переменную вызывающей стороны.

Экзаменационный навык: знайте, что изменение полей объекта внутри метода влияет на оригинал, но переназначение параметра (param = new...) не влияет на вызывающую сторону.

Разобраный пример. Предположим, что s — это Student со счетом 50, и мы вызываем 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
}

Строка (1) изменяет объект, на который указывает s, поэтому вызывающий код теперь видит 100. Строка (2) создает собственную копию ссылки метода, направленную на новый объект — при этом s вызывающего кода остается нетронутым, а строка (3) влияет только на этот новый объект. После завершения вызова s.getScore() остается 100: мутация сохранилась, а переназначение не изменило исходную ссылку.

3.7

Переменные и методы класса

Программа

Цель обучения 3.7.A: Написать код для определения поведения класса с помощью классовых методов.

  • 3.7.A.1 Классовые методы не могут получить доступ к значениям экземплярных переменных или вызывать экземплярные методы без передачи экземпляра класса через параметр.
  • 3.7.A.2 Классовые методы могут получать доступ к значениям классовых переменных, изменять их, а также вызывать другие классовые методы.

Цель обучения 3.7.B: Написать код для объявления классовых переменных, принадлежащих классу.

  • 3.7.B.1 Классовые переменные принадлежат классу, и все объекты одного класса разделяют единственную копию такой переменной. Классовые переменные обозначаются ключевым словом static перед типом переменной.
  • 3.7.B.2 Классовые переменные, обозначенные public, вне классаAccessed with the class name and the dot operator, since they are associated with a class, not objects of a class.
  • 3.7.B.3 Когда переменная объявлена со словом final, её значение не может быть изменено.

Источник: Описание курса и экзамена College Board AP

статические против экземплярных полей

Статическая (классовая) переменная, помеченная static, является общей для всех объектов класса — существует одна копия всего (например, счетчик количества существующих объектов). Статический метод принадлежит классу и не может напрямую использовать экземплярные поля. Обращайтесь к ним по имени класса: Student.getCount().

3.8

Область видимости и модификаторы доступа

Программа

Цель обучения 3.8.A: Объяснить, где переменные могут использоваться в коде.

  • 3.8.A.1 Локальные переменные — это переменные, объявленные в заголовках или телах блоков кода. Локальные переменные доступны только в том блоке, в котором они объявлены. Поскольку конструкторы и методы являются блоками кода, параметры конструкторов или методов также считаются локальными переменными. Эти переменные могут использоваться только внутри конструктора или метода и не могут быть объявлены как public или private.
  • 3.8.A.2 Когда существует локальная переменная или параметр с тем же именем, что и экземплярная переменная, имя переменной будет ссылаться на локальную переменную, а не на экземплярную переменную внутри тела конструктора или метода.

Источник: Описание курса и экзамена College Board AP

Область видимости — это место, где имя noticeably. Локальная переменная, объявленная внутри метода, существует только внутри него; параметр существует только в своем методе; экземплярная переменная доступна на протяжении всего существования объекта. Модификаторы доступа регулируют видимость между классами: private (только этот класс) против public (везде). Локальные переменные затеняют поля того же имени — это источник ошибок.

Глобальная переменная видна везде; локальная переменная только внутри своего блока
Глобальная переменная видна везде; локальная переменная только внутри своего блока
English Русский
Scope/skəʊp/ Область видимости
3.9

Ключевое слово this

Программа

Цель обучения 3.9.A: Написать код для самоссылающихся выражений и определить результат этих выражений.

  • 3.9.A.1 Внутри экземплярного метода или конструктора ключевое слово this действует как специальная переменная, хранящая ссылку на текущий объект — объект, чей метод или конструктор вызывается.
  • 3.9.A.2 Ключевое слово this может использоваться для передачи текущего объекта в качестве аргумента при вызове метода.
  • 3.9.A.3 У классовых методов нет ссылки на this.

Источник: Описание курса и экзамена College Board AP

this — это ссылка на текущий объект. Используйте его, чтобы отличить поле от параметра с тем же именем или вызвать другой метод того же объекта:

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

Экзаменационный навык: когда у конструктора или сеттера параметр имеет то же имя, что и поле, вы обязаны писать this.field = param — без this присваивание не будет иметь никакого практического смысла.

3.9

Советы для экзамена

  • Проектирование с использованием методов и классов: инкапсулируйте данные как поля private и открывайте доступ к поведению через публичные методы.
  • Знать разницу между объектом и его классом, а также то, что объекты передаются по значению — параметр получает копию ссылки, поэтому метод может изменить состояние объекта, но переназначение параметра не влияет на вызывающий код (в Java нет передачи по ссылке).
  • Безопасно обходите массивы и ArrayListы — размер равен length против .size(), а удаление во время цикла смещает индексы.
  • Трассировать рекурсивный метод для определения его результата: сначала найдите базовый случай, затем проследите каждое рекурсивное вызов до получения возвращаемого значения (написание рекурсивного кода выходит за рамки экзамена).
  • Распознавать терминологию наследования — суперкласс, подкласс, переопределение метода, а также тот факт, что каждый класс является подклассом Object (проектирование и реализация наследования выходят за рамки экзамена).

Интерактивные уроки по этой теме

Пройдите его шаг за шагом с упражнениями мгновенной проверки.

Архив экзаменационных работ

Больше тем в AP Информатика A

Войти или создать аккаунт

IGCSE, A-Level & AP