Текст книги "Основы программирования с Java"
Автор книги: Тимур Машнин
сообщить о нарушении
Текущая страница: 5 (всего у книги 6 страниц)
Простой IO
Когда мы обсуждали аппаратную часть компьютера, мы говорили, что компьютеры взаимодействуют с пользователями через устройства ввода и вывода.
Большинство языков программирования высокого уровня обеспечивают стандартные методы ввода и вывода программ для получения информации от пользователей и вывода результатов пользователям для просмотра.
В Java, стандартные методы для вывода текста в консоль являются System.out.println и System.out.print.
System представляет собой класс Java.
Вы видели println в программе HelloWorld.
Разница между print и println в том, что println будет переводить на новую строку после печати, в то время как print останется на той же строке.
Технически, println и print являются методами класса PrintStream.
Обратите внимание, что они разделены точкой или оператором точка.
Я вернусь к этому, когда будем обсуждать классы, объекты и методы позже.
Есть аналогичные стандартные методы для ввода на основе класса Scanner, но он немного неуклюжий, поэтому здесь создан свой пользовательский класс ввода-вывода I/O с именем IO в качестве оболочки, который будет сочетать как ввод, так и вывод и, надеюсь, предоставляет более простой в использовании интерфейс ввода / вывода для вас.
Методы обертки очень часто используются в Java.
Они в основном предоставляют альтернативный интерфейс на основе существующих методов, чтобы удовлетворить определенной цели.
В этом случае, новый класс I/O, можно надеяться, будет легче в изучении для начинающих программистов.
Я вернусь к классу Scanner, когда мы будем обсуждать файловый ввод/вывод.
Методами вывода являются IO.outputln и IO.output.
Вы видели их обоих в программе CourseGrade.
Разница между ними состоит в том, что IO.outputln будет перемещаться на новую строку, в то время как IO.output останется на той же строке.
Два метода output и outputln берут строку символов в качестве параметра и выводят ее в консоль.
В случае println, finalGrade, который имеет double тип, будет преобразован в символьную строку, и знак плюс, который вы видите здесь является оператором конкатенации, который соединяет две строки в единую строку символов.
Методы ввода – это IO.inputInteger для целых чисел и IO.inputDouble для double.
Вы видели IO.inputDouble, когда программа просила пользователя ввести examScore, labScore и hwScore.
Аналогичным образом, IO.inputInteger может быть использован для ввода целых.
Для того чтобы использовать класс IO, есть еще одна вещь, которую вы должны будете сделать.
Вам нужно импортировать пакет comp102x, который предоставлен в виде библиотеки.
В частности, необходимо будет включить выражение «import comp102x.IO;» в начало программы.
Где import является зарезервированным словом Java.
Вы увидите много примеров по использованию import и этих методов ввода-вывода далее.
Я хочу сказать немного больше о пользовательском интерфейсе для ввода, особенно для чисел и текста, что часто бывает необходимо во многих приложениях.
Например, когда вы идете в супермаркет, представьте, как долго вы будете рассчитываться, если кассир должен вводить каждый элемент, который вы приобрели, с помощью клавиатуры.
Обратите внимание, что не только цены должны быть введены, магазину необходимо также вести учет всех деталей для каждой транзакции, то есть, должно быть введено название каждого элемента и т.д.
Так что, компьютеры не очень хороши в чтении рукописных или даже печатных слов или в понимании человеческой речи, по крайней мере пока, хотя технология улучшается, но мы все еще довольно далеко от систем, которые могли бы обеспечить скорость и точность для многих приложений.
Альтернативные интерфейсы ввода необходимы.
Клавиатура является наиболее часто используемым устройством ввода. Однако существуют альтернативные технологии, такие как штрих-коды.
Я уверен, что каждый из вас часто сталкивался со штрих-кодами в повседневной жизни.
Например, в супермаркетах, библиотеках и на почте.
В последнее время появляются и новые технологии для распознавания голоса.
Например, Siri, который iPhone использует для голосового ввода, Google поиск, и у многих из вас, вероятно, есть опыт разговоров с компьютером, когда вы делали телефонные звонки.
В последнее время радиочастотная технология идентификации RFID позволяет отслеживать продукты через беспроводные бесконтактные средства.
Некоторые супермаркеты экспериментируют с радиометками RFID, которые позволяют продавцу осуществлять проверку, не вынимая каждый товар из вашей корзины.
Я покажу вам пример манипулирования со штрих-кодом в программе.
Штрих-код является машиночитаемым представлением данных в виде изображения.
Я буду говорить об одномерных штрихкодах.
2D штрих-коды, такие как QR-коды, также набирают популярность.
В основном, линейный штрих-код представляет данные путем изменения ширины и промежутка между набором параллельных линий.
Здесь показаны некоторые примеры штрих-кодов.
Штрих-технологии были разработаны в 1960-х годах и получили коммерческий успех, так как они широко используются в автоматизированных кассовых системах, таких как те, что используются в супермаркетах.
Я хочу отметить, что в следующем примере, мы используем абстракцию данных для работы со штрих-кодом.
То есть, нам нужно только знать, что штрих-код представляет собой число в виде серии цифр и считыватель штрих-кода будет способен декодировать штрих-код и ввести число в компьютер.
Как это на самом деле сделано или реализовано – не важно для пользователя.
Можно рассматривать его таким же образом, как номера на клавиатуре.
Эта программа здесь показывает, что простая арифметика может быть применена к числовым значениям, представленным с использованием штрих-кодов.
Программа начинается с импорта класса IO из пакета comp102x.
В дополнение к выполнению операций ввода/вывода от стандартных устройств ввода и вывода, класс IO может также принимать входные и выходные данные как штрих-код.
Этот пример, иллюстрирующий, что, когда используется компьютер, тогда не важно, получены ли входные данные от пользователя через клавиатуру или с помощью штрих-кода.
Подробное представление не важно до тех пор, пока для программы обеспечены методы декодирования информации.
Как и прежде, программа получает имя класса, в данном случае BarcodeDemo, и метод main как главную точку входа в программу.
Первая часть тела программы принимает два штрих-кода в качестве входных данных с помощью метода inputBarcode от класса IO.
Чуть позже вы увидите в демо программе, что вместо ввода числа с помощью клавиатуры, пользователю будет предложено выбрать изображение штрих-кода, которое представляет некоторое число из существующего файла.
Числа затем будут расшифрованы и присвоены переменным value1 и value2.
Это похоже на использование inputInteger или inputDouble, если входные данные должны были быть введены с консоли.
Цифры, введенные с клавиатуры, по-прежнему должны быть декодированы перед присвоением в соответствующие переменные.
Обратите внимание, что здесь мы используем тип long, потому что штрих-коды могут представлять очень большие числа, которые могут быть вне диапазона типа int.
После того, как штриховые коды декодируются в виде чисел, они могут быть использованы так же, как если они были созданы с помощью других средств.
Два IO.outputln объявления здесь выводят значения, представленные двумя штрих-кодами.
Значения можно обрабатывать так же, как числа, представленные в других примитивных типах в Java, и арифметические операции, такие как сложение и умножение, могут быть применены к этим числам.
В этом случае, результаты операций будут присвоены переменным addResult и multResult с примитивным целочисленным типом данных long снова, потому что штрих-коды могут представлять очень большие числа.
И результаты арифметических операций распечатываются для просмотра.
Кроме того, результаты могут также быть выведены в виде штрих-кода, используя метод outputBarcode для класса IO.
В этом случае штрих-код будет создан для значения addResult и сохранится в выходном файле.
Демонстрация примера
Прежде чем продемонстрировать программу штрих-кодов, давайте сначала посмотрим на некоторые образцы штрих-кодов.
Эти штрих-коды хранятся в виде файлов изображений.
Первый из них сфотографировали с обложки книги с помощью камеры сотового телефона.
Вы можете увидеть, что качество не очень хорошее.
Второй сгенерирован компьютером, и мы не можем сказать, какие числа этот штрих-код представляет без помощи считывателя штрих-кодов.
Третий штрих-код представляет собой число с цифрами от 0 до 9.
Обратите внимание, что эти штрих-коды разных размеров и качества.
Теперь мы можем открыть проект BarcodeDemo.
Вы можете видеть, что это та же программа, которую мы только что обсуждали.
Программа составлена без ошибок.
Мы можем запустить программу, нажав кнопку Run.
Теперь вы можете увидеть, что появилось окно диалога, которое запрашивает местоположение первого изображения штрих-кода.
Это происходит при выполнении метода inputBarcode().
Давайте выберем barcode1 в качестве первого штрих-кода.
Затем программа запрашивает второй штрих-код при втором вызове inputBarcode().
Давайте выберем barcode2.
И вы можете видеть, что значения штрих-кодов отображаются в окне консоли.
Значение первого штрих-кода огромное число из 12 цифр.
Второй штрих-код является небольшим числом со значением 2.
Легко проверить, что сумма двух штрих-кодов отображается здесь правильно.
Вы также можете проверить, что результат умножения также должен быть правильным.
Обратите внимание, что мы еще не сделали – есть еще всплывающее окно, которое запрашивает имя файла.
Это потому, что последнее выражение в программе, outputBarcode() выводит штрих-код со значением addResult в изображение штрих-кода.
Давайте использовать название b1 в качестве выходного файла.
Теперь программа завершается.
Если вы проверите папку проекта, вы увидите, что есть файл с именем b1, и вы сможете увидеть, что это штрих-код, но мы не можем сказать его значение, просто взглянув на изображение.
Нет проблем, давайте попробуем еще раз запустить программу.
На этот раз, давайте использовать b1 качестве первого изображения штрих-кода и использовать barcode2 как второй штрих-код, как и раньше.
Вы можете видеть, что значение первого штрихкода теперь то же самое, как значение addResult в предыдущем выполнении программы.
Таким образом, мы убедились, что штрих-код с addResult как значением, действительно был сформирован.
Вы также можете увидеть результат сложения и умножения.
Давайте введите b2 в качестве выходного файла, чтобы завершить программу.
Я уверен, что вы сможете найти много штрих-кодов, чтобы поэкспериментировать с программой.
Вы можете использовать ваш смартфон или цифровую камеру, чтобы сфотографировать штрих-кода, а затем ввести их в программу.
Объектно-ориентированное программирование. Введение
Мы уже рассмотрели некоторые элементарные понятия программирования. И мы говорили о правилах именования идентификаторов.
И один важный тип идентификатора – это переменная.
Переменная имеет имя и тип, который определяет, какой тип значений может быть сохранен в памяти, выделенной для переменной.
Мы говорили о примитивных типах данных, типах, которые встроены в Java.
Мы также говорили о выражениях, особенно арифметических выражениях, которые обеспечивают выполнение математических вычислений для определенных задач.
Комбинируя выражения и операторы присваивания, можно изменять значения переменных.
Затем мы обсудили преобразования типов, которые позволяют операции, выполняемые со смешанными типами данных.
Наконец, мы ввели некоторые простые методы ввода и вывода с помощью класса IO, который предоставлен пользовательской библиотекой.
Примитивные типы данных могут использоваться для задач, которые имеют дело с числами и текстом, но многие задачи в реальном мире должны иметь дело с более сложными объектами, чем просто цифры и текст, например, когда вы хотите работать с изображениями и видео.
Объектно-ориентированный подход позволяет вам создавать вычислительные объекты для решения комплексных задач, используя абстракцию данных, которую мы обсуждали ранее.
Если вы посмотрите на окружающую среду вокруг вас, вы найдете много физических объектов.
Вы увидите, что у этих физических объектов есть две общие характеристики:
Все они имеют свои отдельные состояния и поведение.
Например, большинство источников света могут иметь только два состояния – включен и выключен и два поведения – включить свет или выключить свет.
Но есть также источники света, которые могут иметь более двух состояний и ведут себя по-разному, например, есть диммер, который может регулировать свет постепенно до различной яркости.
Или вы можете даже задать для него мигающее состояние, как у новогодней гирлянды.
Если брать смартфон, он также может быть во включенном или выключенном состоянии.
И если он включен, его яркость может быть скорректирована до определенного уровня.
Вы можете изменять поведение смартфона, звоня своему другу, проигрывая музыку, занимаясь веб-серфингом, чтобы узнать последние новости.
Вы увидите, что все эти объекты реального мира могут быть смоделированы как вычислительные объекты, используя объектно-ориентированное программирование.
Например, умным выключателем света со сложным поведением можно управлять с помощью объектно-ориентированной программы в соответствии с условиями освещения в комнате, так что можно обеспечить энергосбережение.
И многие приложения, написанные для смартфонов, являются объектно-ориентированными программами.
Здесь я представлю основные понятия объектно-ориентированного программирования с использованием Java.
Я буду обсуждать такие важные понятия как классы, объекты и методы.
И переменные можно найти в классах, объектах и методах.
Мы также кратко поговорим о правилах области применения для значений переменных в различных условиях.
Правила области применения будут обсуждаться более подробно позже.
Java является объектно-ориентированным языком программирования.
Целью этого раздела является познакомить вас с классами, объектами и методами, которые являются фундаментальными понятиями в объектно-ориентированном программировании.
Так почему же объектно-ориентированный подход хорош для решения проблем?
В нашей повседневной жизни мы часто используем инструменты или артефакты, чтобы помочь нам в решении задач.
Мы используем плиты, печи, тостеры и микроволновые печи, чтобы сделать продукты, и при этом мы не должны понимать, как они работают.
Важно лишь иметь хороший рецепт, и рецепт таким образом, подобен алгоритму.
Когда нам нужно попасть из одного места в другое, мы используем различные транспортные средства, мы можем путешествовать с помощью машины, поезда и велосипеда по суше; или путешествовать по воздуху с помощью самолетов и вертолетов, или путешествовать по морю с помощью кораблей и катеров.
Это конкретные или материальные объекты.
Есть также нематериальные объекты.
Если вы хотите получить доступ к Интернету с помощью мобильного устройства, вы можете подключиться к сети, используя сеть сотовой связи телефонной компании, вы также можете использовать WiFi или подключиться к другим устройствам.
Когда вы используете смартфон для общения с другими людьми, вы можете открыть панель набора номера телефона или e-mail приложение, каждое из них может рассматриваться как вычислительный объект или программный объект.
С помощью этих примеров мы можем наблюдать, что люди любят группировать объекты с аналогичными свойствами вместе и давать им коллективное имя, например, печь, автомобиль, самолет и телефон.
В то время как эти объекты имеют сходное поведение с точки зрения их использования, каждый из них также имеет некоторые свои определенные свойства.
Например, в то время как печи могут быть использованы для приготовления пищи, печь может быть электрической или газовой, автомобили используются для перевозки, но каждый автомобиль может иметь различный цвет и пробег, для смартфонов, я уверен, что настройки и данные в моем телефоне отличаются от вашего.
Объектно-ориентированный подход в состоянии описать все эти сходства и различия.
Давайте использовать машину в качестве примера для дальнейшего рассмотрения концепции объектно-ориентированного подхода.
Вот коллекция автомобилей.
Они все, кажется, очень хорошие автомобили, которые мы все хотели бы иметь.
Мы знаем, что автомобиль является своего рода транспортным средством, который имеет определенные свойства, такие как колеса, у него есть двигатель, и он нуждается в топливе, чтобы двигатель работал, и каждый автомобиль имеет владельца.
Автомобиль выполняет определенные функции, например, он может ускориться и замедлиться, он может ехать назад и выполнять повороты, и надеюсь, не будет врезаться в другие автомобили.
И существует собственник для каждого отдельного экземпляра автомобиля, это может быть моя машина, или эти автомобили находятся в собственности других людей, и все эти экземпляры имеют некоторые различия, такие как цвет, количество пассажиров, которые могут поместиться, год выпуска, размер двигателя и т.д.
В объектно-ориентированной терминологии, это можно рассматривать как класс автомобилей.
При этом экземпляры индивидуальных автомобилей являются объектами и характеристики этих объектов, это их атрибуты или свойства, такие как цвет, количество пассажиров, год выпуска, размер двигателя и так далее.
Эти свойства часто называются полями объектов.
Объект также может демонстрировать определенное поведение или действия, которые он может выполнять, например, движение вперед, перемещение назад и поворот.
Эти действия называются методами в объектно-ориентированном программировании.
Обратите внимание, что здесь также может быть иерархия автомобилей, это легковые автомобили, вы могли бы также иметь фургоны, грузовики и внедорожники.
Позже, я представлю идею подкласса и суперкласса, где подкласс может наследовать свойства суперкласса.
Таким образом, вы можете видеть, что объекты являются фундаментальными строительными блоками объектно-ориентированных программ.
В объектно-ориентированных программах, программные объекты используются для моделирования объектов реального мира, которые имеют определенные состояния или атрибуты и поведения или действия.
Давайте теперь посмотрим на классы, объекты и методы в Java.
Мы видели, что класс описывает группу объектов с общими свойствами и поведением.
Например, мы можем определить класс автомобиля, который основывается на общей концепции транспортного средства, которое двигается на колесах и может перемещаться из одного места в другое.
Или мы можем определить класс "смартфонов", это мобильные электронные устройства, которые могут быть использованы для совершения телефонных звонков, веб-серфинга, воспроизведения музыки, отправки SMS и т.д.
Мы можем использовать ключевое слово class, чтобы определить класс в Java.
На самом деле, мы уже использовали ключевое слово class в нашей программе СourseGrade, и я уже упоминал ранее, что все программы Java, это классы.
Два выражения здесь объявляют два класса, один для автомобиля, а другой для смартфона, заметьте, что имена Car и SmartPhone являются Java идентификаторами.
Здесь используется верхний CamelCase по соглашению об именах для классов.
Цель определения класса заключается в разработке шаблона для создания объектов.
Т.е. класс – это шаблон для создания объектов.
После того, как класс определен, мы можем создавать экземпляры или объекты в этом классе.
Понятия объект и экземпляр являются взаимозаменяемыми.
В предыдущем примере, в классе автомобилей, могут быть различные экземпляры (или объекты) автомобилей, которые могут принадлежать мне и другим людям.
В классе "смартфон", различные экземпляры могут быть созданы для каждого студента на этом курсе.
Аналогичным образом, если класс студентов определен, экземпляры студентов могут быть созданы для представления каждого студента в классе.
В Java, экземпляры или объекты создаются с помощью конструкторов и ключевого слова new.
Я вернусь к этому позже в лекции.
Как я уже говорил, класс выступает в качестве шаблона или плана для объекта.
Определение класса должно охватить две основные характеристики.
Первая характеристика – это состояния или свойства объекта в классе, которые часто называют полями.
Для объекта автомобиля, поля могут включать имя его владельца и его цвет или местоположение.
Для смартфона, это его марка и модель, такие как iPhone 7 или Samsung Galaxy 5, могут быть сохранены в полях объекта.
2-я характеристика – это поведение объекта.
И объекты демонстрируют свое поведение с помощью методов.
Методы являются операциями, которые могут быть выполнены, чтобы изменить состояние объекта.
Например, чтобы изменить положение автомобиля нужно двигаться вперед или назад, или перевести смартфон в спящий режим, или увеличить громкость.
Прежде чем обсуждать в деталях, как определить поля и методы в Java, давайте сначала посмотрим на простой пример.