Книга: Основы программирования с Java
Назад: Методы
Дальше: Демонстрация примера

Пример

Давайте посмотрим на другой пример, чтобы проиллюстрировать концепции объектно-ориентированного программирования, которые мы только что обсудили.

Эта программа определяет класс банковских счетов, которые имеют свой баланс и владельца, который может делать вклады и снимать средства со счета.

Даже если у вас нет счета в банке, идеи, описанные здесь, могут быть использованы для других финансовых инструментов, которые могут быть использованы для пополнения и снятия денег. Даже для копилки, хотя вынимать деньги из копилки может быть немного сложнее.





В первой строке программы импортируем класс IO, как мы делали в предыдущих программах, так что мы сможем сделать ввод и вывод в консоли.

Далее следует блок комментариев, используя формат Javadoc.

Вы увидите позже, что такие комментарии в различных разделах программы обеспечат генерацию Javadoc для класса BankAccount.

Первая строка после комментария, это объявление класса с именем BankAccount с помощью ключевого слова class.

Название BankAccount является идентификатором с верхним CamelCase. Фактическое определение BankAccount заключено в паре скобок и начинается с некоторых объявлений переменных экземпляра.

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

В этом случае, здесь объявляются две переменные экземпляра.

Баланс является переменной doubld типа, для хранения текущего баланса банковского счета, который инициализируется с нулевым значением.

Вторая переменная экземпляра определяет владельца, имеет тип String и при инициализации получает значение NoName.

Обратите внимание, что NoName заключено в двойные кавычки, чтобы обозначить, что это строка символов. И вы далее увидите много символьных строк.

Отметим также, что оба объявления начинаются с модификатора доступа private.

Переменные экземпляра, как правило, объявляются как private, если не появится хороший повод, чтобы сделать их достоянием общественности.

Легко видеть, что в случае банковского счета, эти переменные баланса и информации о собственности не должны быть преданы гласности и стать доступными для всех.

После объявления переменной экземпляра идет определение конструкторов.

Здесь определены два конструктора.

Помните, что имя класса, в данном случае, BankAccount, используется в качестве имени конструкторов.

Первый конструктор по умолчанию предназначен для создания нового объекта банковского счета с нулевым балансом и NoName качестве владельца.

Обратите внимание, что этот конструктор не несет параметра внутри пары скобок.

Второй конструктор принимает два параметра, первый initialbalance имеет double тип и второй name имеет тип String.

Этот второй конструктор изменяет баланс банковского счета на значение, определенное в intialbalance.

Это как когда новый счет открывается, начальная сумма зачисляется на счет.

Счету также дается имя владельца, как указано в втором параметре.

Остальная часть программы посвящена определению методов.







Здесь определяются три метода.

Первый это deposit, который используется для внесения денег на банковский счет.

Он принимает один параметр dAmount double типа, который представляет собой сумму для внесения на счет.

В выражении здесь dAmount добавляется к переменной экземпляра balance и результат снова присваивается balance.

Второй метод называется withdraw, который можно использовать для снятия денег с банковского счета.

Он принимает один параметр wAmount double типа, который представляет собой сумму для вывода со счета.

В выражении здесь wAmount вычитается из переменной экземпляра balance и результат снова присваивается balance.

Третий метод называется getBalance, с помощью которого получается значение текущего баланса банковского счета.

Этот метод не несет никакого параметра.

Обратите внимание, что он отличается от предыдущих двух методов.

Метод getBalance возвращает значение типа double, в то время как предыдущие два метода определены void типа, потому что они не возвращают никакого значения.

Значение баланса возвращается методом с помощью выражения с ключевым словом return.

Метод, как этот, который возвращает значение private поля, часто называют getter методом.

Предыдущие два метода, которые изменяют значение private поля, часто называют мутаторы или setter методы.

Использование getter и setter методов может помочь в обеспечении инкапсуляции данных и защитить переменные экземпляра от случайного изменения.

Теперь, когда мы закончили определение класса BankAccount, это как закончить писать рецепт. И чтобы на самом деле произвести что-то съедобное, мы все еще должны смешать ингредиенты и сделать реальную кулинарию.

Небольшие отклонения в смеси ингредиентов могут привести к разным результатам.

Например, вы можете использовать различное количество сахара или использовать маргарин вместо масла в выпечки печенья для производства различных печений или различных экземпляров объектов.

Давайте на самом деле попытаемся создать некоторые банковские счета с помощью класса BankAccount, который мы только что определили.

Мы можем создать различные банковские счета, используя различные конструкторы или предоставляя конструкторы с различными параметрами.

Это как использовать различные сочетания ингредиентов для вашего рецепта.

Мы напишем основной метод main для тестирования различных банковских счетов.







Метод main является точкой входа в программу Java и это выражение такое же, как те, которые мы уже видели.

Чтобы создать новый счет в банке, вы должны сначала дать банковскому счету имя идентификатора.

В этом случае, мы назовем это счет testAccount.

Это похоже на объявление переменной примитивного типа, как int или double.

В этом случае, testAccount объявлен как переменная типа BankAccount, но не инициализирована каким-либо значением.

Чтобы действительно создать новый банковский счет, используется ключевое слово new перед конструктором.

Здесь мы используем конструктор по умолчанию без параметров.

Этот конструктор создаст банковский счет с нулевым балансом и NoName в качестве имени владельца.

На самом деле, вы можете сделать как объявление, так и инициализацию в одном выражении. И результат будет тот же самый.

После создания счета, можно сделать депозит на счет, вызвав метод deposit.

Так как может быть несколько счетов, то для того, чтобы указать, что депозит должен быть произведен для данного конкретного счета testAccount, оператор точка используется для указания, что метод deposit должен быть использован для объекта testAccount.

В терминологии объектно-ориентированного программирования это называется передачей сообщения.

Мы также должны указать размер вносимой суммы, в данном случае, 100 долларов.

Мы можем выполнить снятие со счета с помощью метода withdraw, снова с помощью оператора точки, чтобы указать, что это для объекта testAccount, и указать количество выводимых денег, например, 50 долларов.

Здесь используется выражение IO.outputln, чтобы распечатать итоговый баланс после двух операций.

Существуют три части сообщения, которые должны быть распечатаны.

Первая из них, это имя владельца для testAccount, снова с помощью оператора точка между testAccount и переменной owner экземпляра.

Вторая часть, это строка символов, заключенная в двойные кавычки.

И третья часть, это баланс для testAccount.

Обратите внимание, переменная экземпляра balance имеет тип double, так что она будет преобразована в строку символов, прежде чем распечататься.

Два знака + плюс между тремя компонентами будут объединять три символьные строки вместе.

И я хочу создать другой счет для себя. Давайте назовем его myAccount.

Опять же, ключевое слово new перед конструктором используется для создания нового экземпляра BankAccount.

Обратите внимание, что, хотя имя конструктора такое же, как и раньше, здесь есть два параметра в вызове этого конструктора.

Компилятор сможет понять, что мы используем второй конструктор, исследуя количество и типы параметров.

В этом случае первоначальный баланс установлен как 100 и имя владельца установлено как "ТС", то есть мое имя.

Обратите внимание, что ТС ставится внутри пары двойных кавычек, потому что второй параметр ожидает строку символов.

Подобно тому как и раньше, вносится депозит в размере 100 долларов, но на этот раз на myAccount вместо testAccount.

Вывод 50 долларов также делается с myAccount.

В результате баланс для myAccount затем выводится с помощью IO.outputln. Так что это конец всей программы.

Давайте посмотрим на фактическое выполнение программы.

Назад: Методы
Дальше: Демонстрация примера