T.M. SoftStudio

feci quod potui, faciant meliora potentes

Купить полную версию курса "Введение в вычисления с Java" (русскоязычная версия, лекции, тесты, лабораторные работы)

Введение в вычисления с Java. Объектно-ориентированное программирование

Неделя 3

Лекция 15

Пример BankAccount

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

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

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

import comp102x.IO;



/**

* A bank account has a balance and an owner who can make

* deposits to and withdrawals from the account.

*/

public class BankAccount

{

// instance variables

private double balance = 0.0;

private String owner = "NoName"



/**

* Default constructor for a bank account with zero balance

*/

public BankAccount() {}

/**

* Construct a balance account with a given initial balance and owner’s name

* @param initialBalance the initial balance

* @param name name of owner

*/

public BankAccount(double initialBalance, String name)

{

balance = initialBalance;

owner = name;

}

/**

* Method for depositing money to the bank account

* @param dAmount the amount to be deposited

*/

public void deposit(double dAmount)

{

balance = balance + dAmount;

}

/**

* Method for withdrawing money from the bank account

* @param wAmount the amount to be withdrawn

*/

public void withdraw(double wAmount)

{

balance = balance - wAmount;

}

/**

* Method for getting the current balance of the bank account

* @return the current balance

*/

public double getBalance()

{

return balance;

}

/**

* Main method for testing the bank account

*/

public static void main(String[] args) {

BankAccount testAccount = new BankAccount();

testAccount.deposit(100);

testAccount.withdraw(50);

IO.outputln(testAccount.owner + "'s account has a balance of $"

+ testAccount.balance);

BankAccount myAccount = new BankAccount(100, "TC");

myAccount.deposit(100);

myAccount.withdraw(50);

IO.outputln(myAccount.owner + "'s account has a balance of $"

+ myAccount.balance);

}

}

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

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

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

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

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

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

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

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

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

Вы увидите много символьных строк в ближайшие лекции.

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

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

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

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

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

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

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

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

2-й конструктор принимает два параметра, первый initialbalance имеет double тип и 2-й name имеет тип String. Этот 2-й конструктор изменяет баланс банковского счета на значение, определенное в intialbalance.

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

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

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

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

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

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

2-й метод называется 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 и имя владельца установлено как "ТС", то есть мое имя.

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

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

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

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

BankAccount Demo

Проект банковский счет уже открыт в среде BlueJ. Двойной щелчок на значке и Вы можете видеть, что это та же программа, что мы обсуждаем.

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

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

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

Там есть резюме конструктора и метода.

Подробные описания конструкторов и методов также предоставляются в Javadoc.

Я хочу еще раз подчеркнуть, что важно обеспечить хорошую документацию для ваших программ.

Давайте вернемся к исходному коду и скомпилируем его. Хорошо, что нет никакой ошибки.

Давайте сначала запустим программу, выбрав основной метод и нажав «OK».

Результаты выводятся на консоль.

Обратите внимание, что два счета для NoName и ТС имеют разный итоговый баланс, один с 50, а другой с 150, хотя один и тот же депозит и сделка снятия были произведены для обоих счетов, как вы можете видеть из программы здесь. Это потому, что различные копии переменной экземпляра, balance, были созданы для каждого из экземпляров банковского счета.

Я вернусь к этому понятию в следующей лекции.

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

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

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

Вы можете проверить внутренние состояния объекта, щелкнув правой кнопкой мыши на красном значке и выбрав 'проверить'.

Вы можете видеть, что баланс равен нулю, а владелец NoName.

Давайте создадим еще один объект с помощью конструктора с двумя параметрами и введем 100 для баланса и «ТС» для владельца.

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

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

Давайте сделаем те же транзакции, что и в предыдущем примере. Депозит $100, а затем вывести $50 со счета NoName.

Вы можете видеть, что его внутреннее состояние изменяется на баланс $50.

Что касается моего счета, я могу внести депозит $100, а затем вывести $50.

Вы можете видеть, что его внутреннее состояние имеет баланс 150 вместо 50, как в счете NoName, потому что он создался с начальным балансом 100.