Файн программирование на java для детей родителей дедушек и бабушек

1 2 Java TM Программирование для детей, родителей и бабушек с дедушками Яков Фаин 3 Java Programming for Kids, Parents and Grandparents iii Java Programming for Kids, Parents and Grandparents by Yakov Fain Copyright 2004 Smart Data Processing, Inc. 14 Molly Pitcher Dr. Manalapan, New Jersey, 07726, USA Все права защищены. Никакая часть этой книги не может быть воспроизведена в любой форме без письменного разрешения издателя.

Дизайн обложки и иллюстрации: Взрослый технический редактор: Детский технический редактор: Юрий Фаин Юрий Гончаров Дэвид Фаин Май 2004 года: Первое электронное издание Информация, содержащаяся в этой книге, распространяется без гарантии. Ни автор, ни издатель не несут никакой ответственности перед каким-либо лицом или не имеют права на какую-либо ответственность, убытки или ущерб, которые могут быть вызваны прямо или косвенно инструкциями, содержащимися в этой книге, или компьютерным программным обеспечением или аппаратными продуктами, описанными здесь.

Java и все основанные на Java товарные знаки и логотипы являются товарными знаками или зарегистрированными товарными знаками Sun Microsystems, Inc. в США и других странах. Windows 98, Windows NT, Windows 2000 и Windows XP являются товарными знаками корпорации Microsoft. Все остальные названия продуктов и компаний являются собственностью их соответствующих владельцев. Издатель предлагает скидку на эту книгу при заказе оптом. Для получения дополнительной информации отправьте at ISBN:

4 Оглавление ПРЕДИСЛОВИЕ… IX БЛАГОДАРНОСТИ… XI ГЛАВА 1. ВАША ПЕРВАЯ JAVA-ПРОГРАММА…

1 Как установить Java на Вашем компьютере… 2 Три Основных шага в программировании… 6 Шаг 1 Введите программу… 6 Шаг 2 Скомпилируйте программу… 8 Шаг 3 Запустите программу… 9 Дополнительное чтение ГЛАВА 2. ПЕРЕХОД К ECLIPSE Установка Eclipse Начало работы с Eclipse Создание программ в Eclipse Запуск HelloWorld в Eclipse Как работает HelloWorld? Дополнительная практика чтения Практика для Smarty Pants ГЛАВА 3. PET AND FISH JAVA CLASSES Классы и объекты Типы данных Создание наследования Pet Fish Также является методом Pet, Переопределяющим дополнительную практику чтения Practice for Smarty Pants… 39

5 Java Программирование для детей, родителей и бабушек и дедушек v ГЛАВА 4. JAVA BUILDING BLOCKS Program Comments Принятие решений с помощью операторов if Логические операторы Логическое не здесь применяется к выражению в скобках Условный оператор Using else if Принятие решений с помощью оператора switch Как долго живут переменные?

Специальные методы: Конструкторы…47 Ключевое слово this Arrays Repeating Actions with Loops Additional Reading Practice Practice for Smarty Pants ГЛАВА 5. ГРАФИЧЕСКИЙ КАЛЬКУЛЯТОР AWT и Swing Пакеты и Операторы Импорта Основные элементы Swing Менеджеры макетов Flow Layout Grid Layout Border Layout Комбинирование Менеджеров макетов Box Layout Grid Bag Layout Card Layout Могу ли я Создавать Окна Без использования Макетов? Оконные компоненты Дополнительная практика чтения Практика для Умных штанов… 73

6 ГЛАВА 6. WINDOW EVENTS Interfaces Action Listener Регистрация компонентов с помощью ActionListeneter Что является источником события?

Как Передавать данные Между Классами Finishing Calculator Некоторые Другие Прослушиватели событий Как использовать Адаптеры Дополнительная Практика чтения Practice for Smarty Pants ГЛАВА 7. THE TIC-TAC-TOE APPLET Learning HTML in 15 Minutes Writing Applets Using AWT…96 How to Write AWT Applets…97 Writing a Tic-Tac-Toe Game…99 The Strategy The Code Additional Reading Practice Practice for Smarty Pants CHAPTER 8.

ПРОГРАММНЫЕ ОШИБКИ — ИСКЛЮЧЕНИЯ Чтение стека Трассировка Генеалогическое дерево исключений Ключевое слово выбрасывает Ключевое слово наконец Ключевое слово выбрасывает Создание новых исключений Дополнительная практика чтения

7 Java Программирование для детей, родителей и бабушек и дедушек vii Практика для Smarty Pants ГЛАВА 9. СОХРАНЕНИЕ игрового СЧЕТА Байтовые потоки Буферизованные потоки Аргументы командной строки Чтение текстовых файлов Файл класса Дополнительное чтение Практика Практика для Smarty Pants ГЛАВА 10.

БОЛЬШЕ СТАНДАРТНЫХ БЛОКОВ JAVA Работа со значениями даты и времени Метод перегрузки чтения Ввода клавиатуры Больше на уровнях доступа к пакетам Java Возврат к массивам Класс ArrayList Дополнительная практика чтения Практика для Smarty Pants ГЛАВА 11. BACK TO GRAPHICS THE PING PONG GAME The Strategy The Code Java Threads Basics Finishing Ping Pong Game What to Read Next on Game Programming Дополнительная практика чтения

8 Практика для Smarty Pants ПРИЛОЖЕНИЕ A. JAVA ARCHIVES — JARS Дополнительное чтение ПРИЛОЖЕНИЕ B. ECLIPSE TIPS Eclipse Debugger ПРИЛОЖЕНИЕ C.

КАК ОПУБЛИКОВАТЬ ВЕБ-СТРАНИЦУ Дополнительный ИНДЕКС Практики Чтения

9 Однажды мой сын Дэйви-пароход появился в моем офисе с моим учебником R Java в руках. Он попросил меня научить его программированию, чтобы он мог создавать компьютерные игры. В то время я уже написал пару книг по Java и вел несколько занятий по компьютерному программированию, но все это было для взрослых!

Поиск на Amazon не мог предложить ничего, кроме книг для чайников, но Дэйви — не манекен! Проведя несколько часов в Google, я обнаружил либо несколько неудачных попыток создать курсы Java для детей, либо несколько книг в стиле reader-rabbit. Знаешь что? Я решил написать одну. Чтобы лучше понять менталитет маленьких людей, я решил попросить Дэйви стать моим первым учеником. Эта книга будет полезна для следующих групп людей Дети от 11 до 18 лет Школьные компьютерные учителя Родители, которые хотят научить своих детей программированию Полные новички в программировании (ваш возраст не имеет значения) Даже несмотря на то, что я использую простой язык при объяснении программирования, я обещаю относиться к своим читателям с уважением — Я не собираюсь писать что-то вроде Дорогой друг!

Вы собираетесь начать новое и захватывающее путешествие. Да, точно! Просто переходи к делу! Первые главы книги будут заканчиваться простыми игровыми программами с подробными инструкциями о том, как заставить их работать. Также мы собираемся создать калькулятор, который выглядит и работает аналогично тому, что у вас есть в вашем компьютере. Во второй части книги мы вместе создадим игровые программы Tic-Tac-Toe и Ping — Pong.

Вам нужно будет привыкнуть к сленгу профессиональных программистов, и все важные слова будут напечатаны этим шрифтом. Элементы языка Java и программы будут отображаться другим шрифтом, например String. Эта книга не охватывает все без исключения элементы языка Java, иначе она была бы слишком жирной и скучной. Но в конце каждой главы есть раздел Дополнительного чтения со ссылками на веб-сайты с более подробными объяснениями предмета. Вы также найдете задания в конце каждой главы. Каждый читатель должен выполнить задания, приведенные в разделе Практика.

10 Если эти задания слишком легки для вас, я призываю вас выполнить задания из раздела Практика для Умных штанов. На самом деле, если вы читаете эту книгу, вы умный человек и должны стараться выполнить все задания. Чтобы извлечь максимум пользы из этой книги, прочтите ее от начала до конца. Не двигайтесь дальше, пока не поймете главу, которую вы сейчас читаете. Подростки, родители, бабушки и дедушки должны быть в состоянии освоить эту книгу, не обращаясь за помощью, но дети младшего возраста должны читать эту книгу вместе со взрослым.

11 Java Programming for Kids, Parents and Grandparents xi Благодарности Спасибо всем архитекторам и разработчикам, которые бесплатно работали над Eclipse, одной из лучших доступных интегрированных сред разработки для Java. Особая благодарность водителям автобусов New Jersey Transit за плавную езду Половина этой книги была написана во время поездок на работу в автобусе № 139. Спасибо прекрасной даме и моей жене Наташе за успешное ведение бизнеса под названием Особая благодарность Юрию Гончарову — опытному Java-программисту из Торонто, Канада. Он просмотрел книгу, проверил каждый пример кода и предоставил ценную обратную связь, чтобы сделать эту книгу немного лучше.

12

13 Глава 1. В вашей первой программе Java Люди разговаривают друг с другом на разных языках. Точно так же они пишут компьютерные программы, такие как игры, калькуляторы, текстовые редакторы, используя различные языки программирования. Без программ ваш компьютер был бы бесполезен, и его экран всегда был бы черным. Компьютерные части называются аппаратными средствами, а программы-программным обеспечением. Наиболее популярными компьютерными языками являются Visual Basic, C++ и Java. Что отличает язык Java от многих других? Во-первых, одна и та же Java-программа может работать (работать) на разных компьютерах, таких как PC, Apple и других, без изменений. На самом деле Java-программы даже не знают, где они работают, потому что они работают внутри специальной программной оболочки, называемой Java Virtual Machine (JVM). Если, например, вашей Java-программе нужно напечатать какие-то сообщения, она просит JVM сделать это, и JVM знает, как обращаться с вашим принтером. Во-вторых, Java позволяет легко переводить ваши программы (экраны, меню и сообщения) на различные человеческие языки. В-третьих, Java позволяет создавать программные элементы (классы), представляющие объекты из реального мира. Например, вы можете создать Java-класс Car и установить атрибуты этого класса, такие как двери, колеса, аналогично тому, что есть у реальных автомобилей. После этого на основе этого класса можно создать другой класс, например Ford, который будет иметь все особенности класса Car плюс то, что есть только у Ford. В-четвертых, Java является более мощным, чем многие другие языки. В-пятых, Java бесплатна! Вы можете найти все для создания своих Java-программ в Интернете, не заплатив ни копейки!

14 Как установить Java на свой компьютер Чтобы начать программировать на Java, вам необходимо скачать специальное программное обеспечение с веб-сайта компании Sun Microsystems, создавшей этот язык. Полное название этого программного обеспечения-Java 2 Software Development Kit (J2SDK). На момент написания этой статьи его последнюю версию можно было скачать с этого веб-сайта: Выберите release J2SE или более новую, а на следующей веб-странице под заголовком Downloads нажмите на ссылку на этот релиз. Затем нажмите на слово Скачать под заголовком SDK. Примите лицензионное соглашение и выберите Автономную установку Windows (если только у вас нет компьютера Mac, Linux или Solaris). Нажмите кнопку Сохранить на следующем экране и выберите папку на жестком диске, в которую вы хотите сохранить установочный файл Java. Начнется загрузка файла. После завершения загрузки запустите процесс установки, просто дважды щелкните по файлу, который вы скачали, и это установит J2SDK на ваш диск. Например, на компьютере с Windows он создаст такую папку: c:\program Files\java\j2sdk1.5.0, где c: — это имя вашего жесткого диска.

15 Программирование Java для детей, родителей и бабушек и дедушек 3 Если у вас не хватает места на диске c:, выберите другой, в противном случае просто продолжайте нажимать кнопки Далее, Устанавливайте и заканчивайте на окнах, которые будут появляться на вашем экране. Через несколько минут установка Java на вашем компьютере будет завершена. На следующем этапе установки необходимо определить две системные переменные. Например, в Windows нажмите на кнопку Пуск, перейдите на панель управления (она может быть скрыта за меню Настройки) и нажмите на значок системы. Выберите там вкладку Дополнительно и нажмите на кнопку Переменные среды. На следующей странице вы можете увидеть, как этот экран выглядит на моем ноутбуке Windows XP.

16 В следующем окне будут показаны все системные переменные, которые уже существуют в вашей системе.

17 Программирование на Java для детей, родителей и бабушек и дедушек 5 Нажмите нижнюю кнопку New и объявите переменную Path, которая поможет Windows (или Unix) найти J2SDK на вашем компьютере. Дважды проверьте имя папки, в которую вы установили Java. Если переменная Path уже существует, просто добавьте новый каталог Java и точку с запятой в самое начало значения переменной box: Кроме того, объявите переменную CLASSPATH, введя точку и точку с запятой в качестве ее значения. Эта системная переменная поможет Java найти ваши программы. Точка означает, что Java должна начать поиск ваших программ из текущей папки диска, а точка с запятой-это просто разделитель:

18 Теперь установка J2SDK завершена! Если у вас есть старый компьютер с Windows 98, вам нужно будет установить переменную PATH и CLASSPATH по-другому. Найдите файл autoexec.bat на вашем диске c: и с помощью блокнота или другого текстового редактора введите правильные значения для этих переменных в конце этого файла, например: SET CLASSPATH=.; SET PATH=c:\j2sdk1.5.0\bin;%PATH% После внесения этого изменения вам нужно будет перезагрузить компьютер. Три основных шага в программировании Для создания рабочей Java-программы вам нужно пройти следующие древовидные шаги: Написать программу на Java и сохранить ее на диске. Скомпилируйте программу, чтобы перевести ее с языка Java в специальный байтовый код, который понимает JVM. Запустите программу. Шаг 1 Введите программу Вы можете использовать любой текстовый редактор для написания Java-программ, например Блокнот.

19 Программирование на Java для детей, родителей и бабушек и дедушек 7 Сначала вам нужно будет ввести программу и сохранить ее в текстовом файле с окончанием имени in.java. Например, если вы хотите написать программу под названием HelloWorld, введите ее текст (мы называем его исходным кодом) в Блокнот и сохраните в файле с именем HelloWorld.java… Пожалуйста, не используйте пробелы в именах файлов Java. Вот программа, которая выводит на экран слова Hello World: public class HelloWorld { public static void main(string[] args) { System.out.println(Я объясню, как работает эта программа чуть позже в этой главе, но на данный момент просто поверьте мне, что эта программа напечатает слова Hello World на шаге 3.

20 Шаг 2 Скомпилируйте программу Теперь вам нужно скомпилировать программу. Вы будете использовать компилятор javac, который является частью J2SDK. Допустим вы сохранили свою программу в каталоге под названием c:\practice. Выберите меню Пуск, Выполнить и введите слово cmd, чтобы открыть черное командное окно. Просто чтобы убедиться, что вы правильно установили системные переменные PATH и CLASSPATH, введите слово set и еще раз посмотрите на их значения. Измените текущую папку на c:\practice и скомпилируйте программу: cd \practice javac HelloWorld.java Вам не нужно называть папку, дайте ей любое имя, которое вам нравится. В Windows 98 выберите строку MS DOS из меню Пуск, чтобы открыть окно командной строки. Программа javac является компилятором Java. Вы не увидите подтверждения того, что ваша программа HelloWorld была успешно скомпилирована. Это тот случай, когда отсутствие новостей-хорошая новость. Введите команду dir, и она покажет вам все файлы, которые существуют в вашей папке. Вы должны увидеть там новый файл с именем HelloWorld.class… Это доказывает, что ваша программа была успешно скомпилирована. Ваш оригинальный файл HelloWorld.java также есть, и вы можете изменить этот файл позже, чтобы напечатать Hello Mom или что-то еще.

21 Программирование на Java для детей, родителей и бабушек и дедушек 9 Если в программе есть синтаксические ошибки, скажем, вы забыли ввести последнюю фигурную скобку, компилятор Java напечатает сообщение об ошибке. Теперь вам нужно исправить ошибку и снова перекомпилировать программу. Если у вас есть несколько ошибок, вам может потребоваться повторить эти действия несколько раз, пока файл HelloWorld.class создается. Шаг 3 Запустите программу Теперь давайте запустим программу. В том же командном окне введите следующее: java HelloWorld Вы заметили, что на этот раз вы использовали программу java вместо javac? Эта программа называется Java Run-time Environment (JRE), или вы можете назвать ее JVM, как я делал раньше. Имейте в виду, что Java не обрабатывает заглавные и строчные буквы одинаково, а это означает, что если вы назвали программу HelloWorld с заглавной H и заглавной W, не пытайтесь запустить программу helloworld или helloworld JV M будет жаловаться. Теперь давайте немного повеселимся — попробуем угадать, как изменить эту программу. Я объясню, как работает эта программа в следующей главе, но все же попробуйте угадать, как изменить ее, чтобы поздороваться с вашим питомцем, другом или распечатать ваш адрес. Пройдите все три шага, чтобы убедиться, что программа все еще работает после ваших изменений. В следующей главе я покажу вам, как печатать, компилировать и запускать программы в более удобном месте, чем текстовый редактор и черное командное окно.

22 Дополнительное чтение Создание вашего первого приложения: upojava/win32.html Инструкции по установке Java для Windows:

23 Программирование на Java для детей, родителей и бабушек и дедушек 11 Глава 2. Переход на Eclipse Программисты обычно работают в так называемой интегрированной среде разработки (IDE). Там можно писать, компилировать и запускать программы. IDE также имеет справку, которая описывает все элементы языка и облегчает поиск и исправление ошибок в ваших программах. В то время как некоторые программы IDE стоят дорого, есть отличная бесплатная IDE под названием Eclipse. В этой главе я помогу вам загрузить и установить Eclipse IDE на свой компьютер, создать там проект под названием Hello World, и после этого мы будем создавать там все наши программы. Устройтесь поудобнее в Eclipse — это отличный инструмент, которым пользуются многие профессиональные Java-программисты. Установка Eclipse Откройте веб-страницу и нажмите на меню загрузки слева (http). Нажмите на ссылку Main Eclipse Download Site и выберите версию Eclipse, которую вы хотите загрузить. Обычно у них есть одна последняя версия и несколько стабильных сборок. Последний выпуск — это официально выпущенный продукт. Несмотря на то, что стабильные сборки могут иметь больше возможностей, у них все еще могут быть некоторые незначительные проблемы. На момент написания этой статьи последняя стабильная сборка-3.0M8. Выберите эту сборку и вы увидите следующее окно:

24 Нажмите на ссылку (http) рядом со словом Windows, Mac или Linux в зависимости от вашего компьютера и загрузите файл с этим длинным именем, который заканчивается with.zip в любую папку на диске. Теперь вам просто нужно распаковать этот файл на диск c:. Если у вас уже есть программа WinZip установленная на компьютере, щелкните правой кнопкой мыши на этом файле и выберите в меню WinZip и опцию Extract To. Если у вас есть место на диске c:, нажмите кнопку Извлечь, в противном случае выберите другой диск, который имеет больше свободного места. Файлы с именем suffix.zip это архивы, и они содержат много других файлов внутри. Распаковать файл — значит извлечь содержимое этого архива на диск. Самая популярная архивная программа называется WinZip, и вы можете скачать ее пробную версию, если она вам понадобится для завершения установки Eclipse.

25 Java Программирование для детей, родителей и бабушек и дедушек 13 Установка Eclipse завершена! Для вашего удобства создайте ярлык для Eclipse. Щелкните правой кнопкой мыши на рабочем столе компьютера, затем нажмите New, Shortcut, Browse и выберите файл eclipse.exe в папке c:\eclipse… Чтобы запустить программу, дважды щелкните на синем значке Eclipse, и вы увидите первый экран приветствия (этот экран слабо меняется с каждой сборкой Eclipse): Если ваш экран выглядит иначе, перейдите к так называемому рабочему столу, который является рабочей областью для ваших проектов Java. Начало работы с Eclipse В этом разделе я покажу вам, как вы можете быстро создавать и запускать программы Java в Eclipse. Вы также можете найти хороший учебник в меню Справка, Содержание справки и Руководство пользователя по разработке Java. Для начала работы над программой необходимо создать новый проект. Простой проект, как наш HelloWorld будет иметь только один файл HelloWorld.java. Довольно скоро мы создадим более продвинутые проекты, которые будут состоять из нескольких файлов. Чтобы создать совершенно новый проект в Eclipse, просто нажмите на файл меню, Создать, Проект, а затем нажмите кнопку Далее в окне Новый проект. Теперь вам нужно будет ввести название вашего нового проекта, например Мой Первый проект:

26 Посмотрите на посеревший каталог ящиков. Он говорит вам, где файлы этого проекта будут расположены на диске. Eclipse имеет специальную рабочую область папки, где хранятся все файлы для ваших проектов. Позже вы создадите отдельные проекты для калькулятора, игры в крестики-нолики и других программ. К концу этой книги в папке рабочего пространства Toe будет несколько проектов. Eclipse workbench имеет несколько небольших областей, называемых перспективами, которые представляют собой различные виды ваших проектов.

27 Java Programming for Kids, Parents and Grandparents 15 Если вы нажмете на маленький знак плюса в моем первом проекте, он развернется, показывая вам элемент системной библиотеки Java Run-time Environment (JRE), который является частью проекта, если по какой-либо причине вы не видите JRE там, нажмите на меню Windows, Preferences, Java, Editor, Installed JREs, Add, и, используя кнопку Browse, найдите папку, где вы установили Java, например c:\j2sdk Создание программ в Eclipse Позволяет воссоздать программу HelloWorld из главы 1 в Eclipse. Java-программы-это классы, представляющие объекты из реальной жизни. Подробнее о занятиях вы узнаете в следующей главе. Чтобы создать класс в Eclipse, выберите меню File, New, Class и введите HelloWorld в поле Name. Кроме того, в разделе, какие методы заглушки вы хотели бы создать, установите флажок public static void main(string[] args)

28 Нажмите кнопку Finish, и вы увидите, что Eclipse создал для вас класс HelloWorld. Он поместил комментарии программы (текст между /* и */) сверху — вы должны изменить их, чтобы описать свой класс. После комментариев вы найдете код класса HelloWorld с пустым методом main(). Слово метод означает действие. Чтобы запустить класс Java как программу, этот класс должен иметь метод main(). public class HelloWorld { public static void main(string[] args) { Чтобы завершить нашу программу, поместите курсор после фигурной скобки в строку с main, нажмите кнопку Enter и введите в новой строке следующее: System.out.println(Если вы не допустили никаких синтаксических ошибок, то не увидите никаких сообщений о компиляции программы. Но давайте сделаем ошибку нарочно, чтобы посмотреть, что произойдет. Сотрите последнюю фигурную скобку и снова нажмите Ctrl-S. Eclipse отобразит несопоставимую ошибку скобки в перспективе задач, а также поставит красную метку на линии, которая имеет проблему. По мере того как ваши проекты становятся больше, они будут иметь несколько файлов, и компилятор может генерировать более одной ошибки. Вы можете быстро найти (но не исправить) проблемные строки, дважды щелкнув сообщение об ошибке в перспективе задач. Давайте поставим фигурную скобку обратно и снова нажмем Ctrl-S вуаля, сообщение об ошибке исчезло! Запуск HelloWorld в Eclipse Наша простая программа-это проект одного класса. Но довольно скоро у ваших проектов будет несколько классов Java. Вот почему перед запуском проекта в первый раз вам нужно сказать Eclipse, какой класс в этом проекте является основным. Выберите пункт меню Выполнить, затем Выполнить (убедитесь, что Java-приложение выбрано в левом верхнем углу) и введите имена проекта и основного класса:

29 Программирование на Java для детей, родителей и бабушек и дедушек 17 Теперь нажмите кнопку Run, чтобы запустить программу. Он напечатает слова Hello World в консольном представлении так же, как и в главе 1. Теперь вы можете запустить этот проект, выбрав меню Run, Run Last Launched или нажав кнопки Ctrl-F11 на клавиатуре. Как работает HelloWorld? Давайте начнем изучать Адский мир. что на самом деле происходит в программе Класс HelloWorld имеет только один метод main(), который является точкой входа Java-приложения (программы). Вы можете сказать, что main-это метод, потому что он имеет скобки после слова main. Методы могут вызывать (использовать) другие методы, например наш метод main() вызывает метод println() для отображения текста Hello World на экране. Каждый метод начинается со строки объявления, называемой сигнатурой метода: public static void main(string[] args)

30 Эта сигнатура метода говорит нам следующее: Кто может получить доступ к методу — public. Ключевое слово public означает, что метод main() может быть доступен любому другому классу Java или самой JVM. Инструкция по его использованию — статическая. Ключевое слово static означает, что вам не нужно создавать экземпляр (копию ) объекта HelloWorld в памяти, чтобы использовать этот метод. Мы поговорим об экземплярах классов подробнее в следующей главе. Возвращает ли метод какие-либо данные? Ключевое слово void означает, что метод main() не возвращает никаких данных вызывающей программе, что в данном случае является Eclipse. Но если, например, метод должен был выполнить некоторые вычисления, он мог бы вернуть результирующее число своему вызывающему. Имя метода-main. Список аргументов некоторые данные, которые можно было бы дать методу — String[] args. В методе main() String[] args означает, что этот метод может получить массив строк, представляющих текстовые данные. Значения, которые передаются в метод, называются аргументами. Как я уже говорил, у вас может быть программа, которая состоит из нескольких классов, но один из них имеет метод main(). Класс Java обычно имеет несколько методов. Например, класс Game может иметь методы startgame(), stopgame(), readscore () и т. Д. Тело нашего метода main()имеет только одну строку : System.out.println(Метод println()знает, как печатать данные на системной консоли (командное окно). За именами методов Java всегда следуют круглые скобки. Если вы видите метод с пустыми скобками, это означает, что этот метод не имеет никаких аргументов. System.out означает, что переменная out определена внутри класса System, который поставляется с Java. Откуда тебе знать, что в классовой системе что-то вызывается? Затмение поможет вам в этом. После того как вы наберете слово System и точку, Eclipse покажет вам все, что доступно в этом приложении.

31 Программирование на Java для детей, Родителей и бабушек и дедушек 19 класс. В любой момент вы также можете поставить курсор после точки и нажать Ctrl-Пробел, чтобы вызвать окно справки, подобное этому: out.println() сообщает нам, что существует объект, представленный переменной out, и это нечто, называемое out, имеет метод println(). Точка между классом и именем метода означает, что этот метод существует внутри этого класса. Допустим, у вас есть класс PingPongGame, который имеет метод savescore(). Вот как вы можете назвать этот метод для Дэйва, который выиграл три игры: PingPongGame.saveScore(Опять же, данные между скобками называются аргументами или параметрами. Эти параметры задаются методу для какой-то обработки, например сохранения данных на диске. Метод savescore() имеет два аргумента-текстовую строку Dave и число 3. Eclipse добавит удовольствия при написании Java-программ. В приложении B есть несколько полезных советов и трюков, которые ускорят ваше программирование на Java в этой превосходной IDE.

32 Дополнительное чтение Веб-страницы Eclipse: Практика Изменения класса HelloWorld для печати вашего адреса с помощью нескольких вызовов println().

33 Практика для Smarty Pants Java Программирование для детей, родителей и бабушек и дедушек 21 Измените класс HelloWorld, чтобы напечатать слово Hello вот так:

34 Глава 3. Классы Java для домашних животных и рыб Java-программы состоят из классов, представляющих объекты из реального мира. Хотя у людей могут быть разные предпочтения относительно того, как писать программы, большинство из них согласны с тем, что лучше делать это в так называемом объектно-ориентированном стиле. Это означает, что хорошие программисты начинают с решения, какие объекты должны быть включены в программу и какие классы Java будут представлять их. Только после этого они начинают писать Java-код. Классы и объекты d Классы в Java могут иметь методы и атрибуты. Методы определяют действия, которые может выполнять класс. Атрибуты описывают класс. Давайте создадим и обсудим класс под названием VideoGame. Этот класс может иметь несколько методов, которые могут указывать, что могут делать объекты этого класса: запускать игру, останавливать ее, сохранять счет и т. Д. Этот класс также может иметь некоторые атрибуты или свойства: цену, цвет экрана, количество пультов дистанционного управления и другие.

35 программирование на Java для детей, родителей, бабушек и дедушек 23 в языке Java для этого класса может выглядеть следующим образом: класс видеоигра { цвет строки; инт цене; недействительными запуска () { пустоту остановить () { пустоту savescore(строка имя пользователя, инт результат) { наш класс видеоигр должны быть похожи на другие классы, которые представляют видеоигры все они имеют экраны разного размера и цвета, все они выполняют похожие действия, и все они стоят денег. Мы можем быть более конкретными и создать другой Java-класс под названием GameBoyAdvance. Он также относится к семейству видеоигр, но обладает некоторыми свойствами, характерными для модели GameBoy Advance, например картриджным типом. класс GameBoyAdvance { String cartridgetype; int screenwidth; void startgame() { void stopgame() { В этом примере класс GameBoyAdvance определяет два атрибута cartridgetype и screenwidth и два метода startgame() и stopgame(). Но эти методы не могут выполнять

36 каких-либо действий пока нет, потому что у них нет Java-кода между фигурными скобками. В дополнение к слову Фраза создать экземпляр объекта означает создать копию этого объекта в памяти компьютера в соответствии с определением его класса. Фабричное описание GameBoy Advance относится к реальной игре точно так же, как Java-класс относится к своему экземпляру в памяти. Процесс построения реальных игр на основе этого описания в game factory похож на процесс создания экземпляров объектов GameBoy в Java. Во многих случаях программа может использовать класс Java только после создания его экземпляра. Поставщики также создают тысячи копий игры на основе одного и того же описания. Несмотря на то, что эти копии представляют один и тот же класс, они могут иметь разные значения в своих атрибутах — некоторые из них синие, а другие серебряные и так далее. Другими словами, программа может создавать несколько экземпляров объектов GameBoyAdvance.

37 Программирование на Java для детей, родителей и бабушек и дедушек 25 Типов данных Переменные Java представляют атрибуты класса, аргументы метода o r могут использоваться внутри метода для кратковременного хранения некоторых данных. Переменные должны быть объявлены первыми, и только после этого вы можете их использовать. Помните уравнения типа y=x+2? В Java вам нужно объявить переменные x и y некоторого числового типа данных, такого как integer или double: in t x; int y; Следующие две строки показывают, как вы можете присвоить значение этим переменным. Если ваша программа присвоит переменной x значение пять, переменная y будет равна семи: x= 5; y= x+2; В Java вы также можете изменить значение переменной несколько необычным способом. Следующие две строки изменяют значение переменной y с пяти на шесть: int y=5; y+ +; Несмотря на два знака плюс, JVM все равно собирается увеличить значение переменной y на единицу. После следующего фрагмента кода значение переменной myscore также равно шести: int myscore=5; myscore=myscore+1; Вы также можете использовать умножение, деление и вычитание таким же образом. Посмотрите на следующий фрагмент кода: int myscore=10; myscore—; myscore=myscore*2; myscore=myscore/3; System.out.println(У Eclipse есть классная функция под названием scrapbook, которая позволяет быстро протестировать любой фрагмент кода (например, приведенный выше), даже не создавая класс. Выберите Файл меню, Новый,

38 Страница записки и введите слово Тест в качестве имени файла записки. Теперь введите эти пять строк, которые манипулируют с myscore в альбоме, выделите их и нажмите на маленькое зеркало на панели инструментов. Чтобы увидеть результат подсчета баллов, просто нажмите на вкладку консоли в нижней части экрана: Моя оценка 6 В этом примере аргумент метода println() был склеен из двух частей текста Моя оценка и значение переменной myscore, которое было шесть. Создание строки из кусочков называется конкатенацией. Несмотря на то, что myscore-это число, Java достаточно умна, чтобы преобразовать эту переменную в строку, а затем привязать ее к тексту, который является моим счетом. Посмотрите на некоторые другие способы изменения значений переменных: myscore=myscore*2; совпадает с myscore*=2; myscore=myscore+2; совпадает с myscore+=2; myscore=myscore-2; совпадает с myscore-=2; myscore=myscore/2; совпадает с myscore/=2; В Java существует восемь простых или примитивных типов данных, и вы должны решить, какие из них использовать в зависимости от типа и размера данных, которые вы планируете хранить в своих переменных:

39 Программирование на Java для детей, родителей и бабушек и дедушек 27 Четыре типа данных для хранения целочисленных значений byte, short, int и long. Два типа данных для значений с десятичной запятой float и double. Один тип данных для хранения одного символа char. Один логический тип данных называется boolean, который допускает только два значения: true или false. Вы можете присвоить переменной начальное значение во время ее объявления, и это называется инициализацией переменной: char grade = ‘A’; in t chairs = 12; bo olean playsound = false; double nationalincome = ; fl oat gameprice = 12.50 f; long totalcars = l; В последних двух строках f означает float, а l-long. Если вы не инициализируете переменные, Java сделает это за вас, подписав ноль для каждой числовой переменной, false для булевых переменных и специальный код для char. Существует также специальное ключевое слово final, и если оно используется в переменной de claration, вы можете назначить значение этой переменной только один раз, и это значение не может быть изменено впоследствии. В некоторых языках конечные переменные называются константами. В Java мы обычно называем конечные переменные с помощью заглавных букв: final String STATE_CAPITAL=В дополнение к примитивным типам данных можно также использовать классы Java для объявления переменных. Каждый примитивный тип данных имеет соответствующий класс обертки, например Integer, Double, Boolean и т. Д. Эти классы имеют полезные методы для преобразования данных из одного типа в другой. В то время как тип данных char используется для хранения только одного символа, Java также имеет строку класса для работы с более длинным текстом, например: String lastname=

40 Бит-это самый маленький фрагмент данных, который может быть сохранен в памяти. Он может содержать либо 1, либо 0. Байт состоит из восьми битов. Символ в Java занимает два байта в памяти. Int и float в Java занимают четыре байта памяти. Переменные типа long и double используют по восемь байт. Числовые типы данных, которые используют больше байтов, могут хранить большие числа. 1 килобайт (КБ) имеет 1024 байта 1 мегабайт (МБ) имеет 1024 килобайта 1 гигабайт (ГБ) имеет 1024 мегабайта Создание питомца Давайте спроектировать и создать питомца класса. Для начала нужно решить, какие действия сможет совершить наш питомец. Как насчет того, чтобы поесть, поспать и сказать? Мы запрограммируем эти действия в методах класса Pet. Мы также дадим нашему питомцу следующие атрибуты: возраст, рост, вес и цвет. Начните с создания нового класса Java под названием Pet в моем Первом проекте, как описано в главе 2, но не отмечайте поле для создания метода main(). Ваш экран должен быть похож на этот:

41 Java Программирование для детей, Родителей и бабушек и дедушек 29 Теперь мы готовы объявить атрибуты и методы в классе Pet. Классы и методы Java заключают свои тела в фигурные скобки. Каждая открытая фигурная скобка должна иметь соответствующую закрывающую скобку: class Pet{ Чтобы объявить переменные для атрибутов класса, мы должны выбрать типы данных для них. Я предлагаю тип int для возраста, float для веса и роста и String для цвета pet s. класс Pet{ int age; float weight; float height; String color; Следующим шагом является добавление некоторых методов в этот класс. Перед объявлением метода yo u должен решить, должен ли он принимать какие-либо аргументы и возвращать значение: Метод sleep() просто напечатает сообщение Good night, see you tomorrow it does not need any arguments and will not return any value.

42 То же самое верно и для метода eat().он напечатает сообщение I m so hungry let me have a snack like nachos!. Метод say() также напечатает сообщение, но питомец скажет (напечатает) слово или фразу, которые мы ему даем. Мы передадим это слово методу say() в качестве аргумента метода. Метод построит фразу, используя этот аргумент, и вернет ее обратно вызывающей программе. Новая версия класса Pet будет выглядеть так: public class Pet { int age; float weight; float height; String color; public void sleep(){ System.out.println( public void eat(){ System.out.println( String petresponse = ХОРОШО!!

43 Программирование на Java для детей, родителей и бабушек и дедушек 31 публичный пустой сон() Он говорит нам, что этот метод может быть вызван из любого другого класса Java (public), он не возвращает никаких данных (void). Пустые скобки означают, что этот метод не имеет никаких аргументов, поскольку ему не нужны никакие данные из внешнего мира, он всегда печатает один и тот же текст. Сигнатура метода say() выглядит следующим образом: public String say(string aword) Этот метод также может быть вызван из любого другого класса Java, но должен возвращать некоторый текст, и это значение строки ключевого слова перед именем метода. Кроме того, он ожидает некоторые текстовые данные извне, отсюда и строка аргумента aword. Как вы решаете, должен ли метод возвращать значение или нет? Если метод выполняет некоторые манипуляции с данными и должен вернуть результат этих манипуляций вызывающему классу, он должен вернуть значение. Вы можете сказать, что класс Pet не имеет никакого вызывающего класса! Это правильно, так что давайте создадим один под названием PetMaster. Этот класс будет иметь метод main (), содержащий код для связи с классом Pet. Просто создайте еще один класс PetMaster и на этот раз выберите опцию в Eclipse, которая создает метод main(). Помните, что без этого метода вы не сможете запустить этот класс как программу. Измените код сгенерированный Eclipse так чтобы он выглядел следующим образом:

44 public class PetMaster { public static void main(string[] args) { String petreaction; Pet mypet = new Pet(); mypet.eat(); petreaction = mypet.say(Tweet!!Для запуска класса PetMaster нажмите на меню Eclipse Run, Run, New и введите имя основного класса: PetMaster. Нажмите кнопку Run, и программа напечатает следующий текст: Я так голоден, дайте мне перекусить, как начос! О’Кей!! — О’кей!! Твит!! Твит!! Спокойной ночи, увидимся завтра: PetMaster — это вызывающий класс, и он начинается с создания экземпляра объекта Pet. Он объявляет переменную mypet и использует Java-оператор new: Pet mypet = new Pet(); Эта строка объявляет переменную типа Pet (правильно, вы можете рассматривать любые созданные вами классы как новые типы данных Java). Теперь переменная mypet знает, где в памяти компьютера был создан экземпляр Pet, и вы можете использовать эту переменную для вызова любых методов из класса Pet, например: mypet.eat(); Если метод возвращает значение, вы должны вызвать этот метод другим способом. Объявите переменную, которая имеет тот же тип, что и возвращаемое значение v alue метода, и назначьте ее этой переменной. Теперь вы можете вызвать этот метод: String petreaction; petreaction = mypet.say(Tweet!!

45 System.out.println(petReaction); Java-программирование для детей, родителей и бабушек и дедушек 33 Наследование Рыба также является домашним животным Наш класс Pet поможет нам изучить еще одну важную особенность Java, называемую наследованием. В реальной жизни каждый человек наследует некоторые черты от своих родителей. Точно так же в мире Java вы также можете создать новый класс, основанный на существующем. Домашнее животное класса имеет поведение и атрибуты, которые разделяют многие домашние животные: они едят, спят, некоторые из них издают звуки, их шкура имеет разные цвета и так далее. С другой стороны, домашние животные разные — собаки лают, рыбы плавают и не издают звуков, попугаи говорят лучше собак. Но все они едят, спят, имеют вес и рост. Вот почему проще создать класс Fish, который унаследует некоторые общие модели поведения и атрибуты от класса Pet, а не создавать собаку, попугая или рыбу с нуля каждый раз. Специальное ключевое слово extends, которое сделает трюк: class Fish extends Pet{ Можно сказать, что наша Рыба-подкласс класса Pet, а класс Pet — суперкласс класса Fish. Другими словами, вы используете класс Pet в качестве шаблона для создания класса Fish.

46 Даже если вы оставите класс Fish таким, как он есть сейчас, вы все равно можете использовать все методы и атрибуты, унаследованные от класса Pet. Посмотрите: Fish mylittlefish = new Fish(); mylittlefish.sleep(); Хотя мы еще не объявили никаких методов в классе Fish, нам разрешено вызывать метод sleep() из его суперкласса! Создание подклассов в Eclipse-это кусок пирога! Выберите меню Файл, Новый, Класс и введите Fish в качестве имени класса. Замените объект java.lang.object в суперклассе поля словом Pet. Давайте не будем забывать, однако, что мы создаем подкласс питомца, чтобы добавить некоторые новые функции, которые есть только у рыб, и повторно использовать часть кода, который мы написали для общего питомца.

47 Программирование на Java для детей, родителей и бабушек и дедушек 35 Пришло время раскрыть секрет все классы в Java наследуются от супер-пупер класса Object, независимо от того, используете ли вы слово extends или нет. Но классы Java не могут иметь двух отдельных родителей. Если бы это происходило с людьми, дети не были бы подклассами своих родителей, но все мальчики были бы потомками Адама, а все девочки-потомками Евы. Не все домашние животные умеют нырять, но рыбы, конечно, умеют. Теперь давайте добавим новый m ethod dive() в класс Fish. публичный класс Fish расширяет Pet { int currentdepth=0; public int dive(int howdeep){ currentdepth=currentdepth + howdeep; System.out.println(Мы также объявили переменную класса currentdepth, которая будет хранить и обновлять текущую глубину каждый раз, когда вы вызываете метод dive(). Этот метод возвращает текущее значение переменной currendepth вызывающему классу. Пожалуйста, создайте еще один класс FishMaster, который будет выглядеть следующим образом: public class FishMaster { public static void main(string[] args) { Fish myfish = new Fish(); myfish.dive(2); myfish.dive(3); myfish.sleep();

48 Метод main() создает экземпляр объекта Fish и дважды вызывает его метод dive() с разными аргументами. После этого он вызывает метод sleep (). Когда вы запустите программу FishMaster, она напечатает следующие сообщения: Дайвинг на 2 фута Я нахожусь на 2 фута ниже уровня моря Дайвинг на 3 фута Я нахожусь на 5 футов ниже уровня моря Спокойной ночи, увидимся завтра Вы заметили, что помимо методов, определенных в классе Fish, FishMaster также вызывает методы из своего суперкласса Pet? То есть весь смысл наследования вам не нужно копировать и вставлять код из класса Pet просто используйте слово extends, а класс Fish может использовать методы Pet s! Еще одна вещь, хотя метод dive() возвращает значение currentdepth, наш FishMaster его не использует. Это хорошо, нашему рыбоводу не нужна эта ценность, но могут быть и другие классы, которые также будут использовать рыбу, и они могут найти ее полезной. Например, подумайте о классовом FishTrafficDispatcher, который должен знать положение других рыб под водой, прежде чем позволить погружаться, чтобы избежать дорожно-транспортных происшествий.

49 Метод Переопределения Java программирования для Детей, Родителей и бабушек и дедушек 37 Как известно, рыбы не говорят (по крайней мере, они не делают это вслух). Но наша рыба cl ass была унаследована от питомца класса, у которого есть метод say(). Это означает, что ничто не мешает вам написать что-то вроде: myfish.say(); Ну, наша рыба начала говорить, если вы не хотите, чтобы это произошло, класс Fish должен переопределить метод Pet s say(). Вот как это работает: если вы объявите в подклассе метод с точно такой же сигнатурой, как и в его суперклассе, метод подкласса будет использоваться вместо метода суперкласса. Давайте добавим метод say() в класс Fish. public String say(string something){ return Это доказывает, что метод Pet s say() был переопределен или, другими словами, подавлен. Если сигнатура метода включает ключевое слово final, то такой метод не может быть переопределен, например: final public void sleep(){ Wow! Мы многому научились в этой главе, давайте просто сделаем перерыв.

50 Дополнительное чтение 1.Java Типы данных: ava/nutsandbolts/datatypes.html 2.О наследстве: ncepts/inheritance.html Практика 1. Создайте новый класс Автомобиля с помощью следующих методов: public void start() public void stop() public int drive(int howlong) Метод drive() должен вернуть общее расстояние, пройденное автомобилем за указанное время. Используйте следующую формулу для вычисления расстояния: расстояние = howlong*60; 2. Напишите другой класс CarOwner, который создает экземпляр объекта Car и вызывает его методы. Результат каждого вызова метода должен быть напечатан с помощью функции System.out.println().

51 Практика программирования Java Smarty Pants для детей, родителей и бабушек и дедушек 39 Создайте подкласс автомобиля с именем JamesBondCar и переопределите метод drive() там. Используйте следующую формулу для расчета расстояния: расстояние = howlong*180; Будьте изобретательны, печатайте забавные сообщения!

52 Глава 4. Java Building Blocks ou может добавлять любые текстовые комментарии к вашей программе, чтобы объяснить, для чего предназначена конкретная строка, метод или класс. Иногда люди забывают, почему они написали программу таким образом. Другая причина написания комментариев заключается в том, чтобы помочь другим программистам понять ваш код. Комментарии к программе Существует три различных типа комментариев: Если ваш комментарий помещается в одну строку, начните его с двух косых черт: // Этот метод вычисляет расстояние, на котором многострочные комментарии должны быть окружены этими символами: /* и*/, например: /* следующие 3 строки хранят текущее положение рыбы. */ Java поставляется со специальной программой javadoc, которая может извлечь все комментарии из ваших программ в отдельный файл справки. Этот файл может быть использован в качестве технической документации для ваших программ. Такие комментарии заключаются в символы /** и */. Между этими символами должны быть помещены только самые важные комментарии, такие как описание класса или метода. /** Этот метод вычисляет скидку, которая зависит от цены. Если цена превышает 100 долларов, это дает вам скидку 20%, в противном случае только 10%. */ С этого момента я буду добавлять комментарии к образцам кода, чтобы дать вам лучшее представление о том, как и где их использовать.

53 Программирование на Java для детей, родителей и бабушек и дедушек 41 Принятие решений с помощью утверждений if Мы всегда принимаем решения в нашей жизни: Если она собирается сказать мне это, я собираюсь ответить на это, иначе я буду делать что-то другое. В Java есть оператор if, который проверяет, является ли конкретное выражение истинным или ложным. В зависимости от результата этого выражения выполнение программы разделяется, и будет работать только одна соответствующая часть кода. Например, есть ли выражение возвращает true, поверните налево, в противном случае поверните направо. Если выражение возвращает true, JVM выполнит код между первыми фигурными скобками, в противном случае он переходит к оператору the code after else.

54Теперь просто внесите небольшое изменение в FishMaster, пусть он попытается заставить нашу рыбу уйти глубоко под море: public class FishMaster { public static void main(string[] args) { Fish myfish = new Fish(); // Попробуйте заставить рыбу опуститься ниже 100 футов myfish.dive(2); myfish.dive(97); myfish.dive(3); myfish.sleep(); Запустите эту программу, и она напечатает следующее: Дайвинг на 2 фута Я на 2 фута ниже уровня моря Дайвинг на 97 футов Я на 99 футов ниже уровня моря уровень Я маленькая рыбка и не могу нырять ниже 100 футов Спокойной ночи, увидимся завтра

55 Логические операторы Java Программирование для детей, родителей и бабушек и дедушек 43 Иногда, чтобы принять решение, вам может потребоваться проверить более одного условного выражения, например, если название штата Техас или Калифорния, добавить налог штата к цене каждого товара в магазине. Это пример логического или случая либо Техаса, либо Калифорнии. В Java знак для логического или один или два вертикальных бара. Это работает так, если любое из двух условий истинно, результат всего выражения истинен. В следующих примерах я использую переменную типа String. Этот класс Java имеет метод equals(), и я использую его для сравнения значения переменной state с Texas или California: if (state.equals(Вы также можете написать этот оператор if, используя два бара: if (state.equals(Разница между ними заключается в том, что если вы используете два бара и первое выражение истинно, то второе выражение даже не будет проверено. Если вы разместите только один бар, JVM вычислит оба выражения. Логическое и представлено одним или двумя амперсандами ( & & ), и все выражение истинно, если каждая его часть истинна. Например, взимать налог с продаж только в том случае, если штат Нью-Йорк и цена превышает $110. С помощью одного амперсанда будут вычислены оба выражения. Логическое не представлено восклицательным знаком, и оно меняет выражение на противоположное значение. Например, если вы хотите выполнить некоторые действия только в том случае, если штат не Нью-Йорк, используйте следующий синтаксис: if (!state.equals(Вот пример anoher — следующие два выражения дадут тот же результат:

56Логическое не здесь применяется к выражению в круглых скобках. Условный оператор Существует еще одна разновидность операторов if, называемая условным оператором. Этот оператор используется для присвоения значения переменной на основе выражения, которое заканчивается вопросительным знаком. На этот раз мы создадим новый класс под названием ReportCard. Этот класс должен иметь метод main (), а также метод, который будет иметь один аргумент — числовой результат теста. В зависимости от номера, он должен напечатать вашу оценку как A, B, C, D или F. Назовем этот метод convertgrades().

57 Программирование на Java для детей, Родителей, Бабушек и дедушек 45 Отчетная карточка публичного класса { /** Этот метод принимает один целочисленный аргумент — результат теста и возвращает одну букву A, B, C или D в зависимости от аргумента. ReportCard rc = new ReportCard(); char yourgrade = rc.convertgrades(88); System.out.println(Вы также можете видеть, что с помощью оператора && вы можете проверить, попадает ли число в какой-то диапазон. Принятие решений С помощью оператора switch Оператор switch иногда может использоваться в качестве альтернативы i f. Переменная после ключевого слова switch вычисляется, и программа переходит только к одному из операторов case:

58 public static void main(string[] args){ ReportCard rc = new ReportCard(); char yourgrade = rc.convertgrades(88); switch (yourgrade){ case ‘A’: System.out.println(Без операторов break этот код будет печатать все четыре строки, даже если переменная yourgrade будет иметь только одно значение. Оператор Java switch имеет ограничение переменная, которую вычисляют, должна иметь один из этих типов: char int byte short. Как Долго Живут Переменные? Класс ReportCard объявляет переменную grade внутри метода convertgrades(). Если вы объявляете переменную внутри любого метода, такая переменная называется локальной. Это означает, что эта переменная доступна только для кода в этом методе. Когда метод завершается, эта переменная автоматически удаляется из памяти.

59 Программирование на Java для детей, родителей и бабушек и дедушек 47 Программисты также используют слово scope, чтобы сказать, как долго будет жить переменная, например, вы можете сказать, что переменные, объявленные внутри метода, имеют локальную область видимости. Если переменная должна быть повторно использована несколькими вызовами методов или она должна быть видна из нескольких методов в классе, вы должны объявить такую переменную вне любого метода. В классе Fish currentdepth является переменной-членом. Эти переменные живы до тех пор, пока экземпляр объекта Fish не существует в памяти, поэтому их также называют переменными экземпляра. Они могут быть совместно использованы и повторно использованы всеми методами класса, а в некоторых случаях они даже могут быть видны из внешних классов, например, в наших классах оператор System.out.println( ) использует переменную класса out, которая была объявлена в классе System. Погодите-ка! Можем ли мы вообще использовать переменную-член из системы классов, если мы не создали экземпляр этого класса? Да, мы можем, если эта переменная была объявлена с ключевым словом static. Если объявление переменной-члена или метода начинается со статического, вам не нужно создавать экземпляр этого класса, чтобы использовать его. Статические члены класса используются для хранения значений, которые одинаковы для всех экземпляров класса. Например, метод convertgrades() может быть объявлен как статический в карточке отчета класса, поскольку его код не использует переменные-члены для чтения/хранения значений, характерных для конкретного экземпляра класса. Вот как вы называете статический метод: char yourgrade = ReportCard.convertGrades(88); Вот еще один пример: есть класс Math в Java, который содержит несколько десятков математических методов, таких как sqrt (), sin (), abs() и другие. Все эти методы статичны, и вам не нужно создавать экземпляр класса Math, чтобы вызвать их, например: double squareroot = Math.sqrt(4.0); Специальные методы: Конструкторы Java используют оператор new, например: для создания экземпляров объектов в памяти Fish myfish = new Fish(); Скобки после слова Fish говорят нам, что у этого класса есть некоторый метод, называемый Fish(). Да, есть специальные методы, которые

60 вызываемых функций: конструкторы, а эти методы имеют следующие Конструкторы, вызываются только один раз при построении объекта в памяти. Они должны иметь то же имя, что и сам класс. Они не возвращают значения, и вам даже не нужно использовать ключевое слово void в сигнатуре конструктора. Любой класс может иметь более одного конструктора. Если вы не создаете конструктор для класса, Java автоматически создает во время компиляции так называемый конструктор без аргументов по умолчанию. Вот почему компилятор Java никогда не жаловался на такое утверждение, как ne w Fish (), хотя класс Fish не имел никаких конструкторов. В общем случае конструкторы используются для присвоения начальных значений переменным-членам класса, например, следующая версия класса Fish имеет конструктор с одним аргументом, который просто присваивает значение аргумента переменной экземпляра currentdepth для дальнейшего использования. публичный класс Fish расширяет Pet { int currentdepth; Fish(int startingposition){ currentdepth=startingposition; Теперь класс FishMaster может создать экземпляр Рыбы и назначить ей начальное положение. В следующем примере создается экземпляр Рыбы, погруженной на глубину 20 футов под воду: Fish myfish = new Fish(20); Если в классе определен конструктор с аргументами, то вы больше не можете использовать конструктор без аргументов по умолчанию. Если вы хотите иметь конструктор без аргументов — напишите его. Ключевое слово this полезно, когда вам нужно обратиться к экземпляру объекта, в котором вы находитесь. Рассмотрим следующий пример:

61 Программирование на Java для детей, родителей и бабушек и дедушек 49 класс Fish { int currentdepth ; Fish(int currentdepth){ this.currentdepth = currentdepth; Ключевое слово это помогает избежать конфликтов n ame, например this.currentdepth относится к переменной-члену currentdepth, в то время как currentdepth относится к значению аргумента s. Другими словами, экземпляр объекта Рыба указывает на себя. Вы увидите еще один важный пример использования ключевого слова this в главе 6 в разделе Как передавать данные между классами. Массивы Допустим, ваша программа должна хранить имена четырех игроков. Вместо объявления четырех различных строковых переменных можно объявить один строковый массив, содержащий четыре элемента. Массивы помечаются квадратными скобками либо после имени переменной, либо после типа данных: String [] players; o r String players[]; Эти строки просто сообщают компилятору Java, что вы планируете хранить несколько текстовых строк в проигрывателях массива. Каждый элемент имеет свой собственный индекс, начиная с нуля. Следующий пример фактически создает экземпляр массива, который может хранить четыре строковых элемента и присваивает значения элементам этого массива:

62 players = new String [4]; players[0] = Любой массив имеет атрибут length, который запоминает количество элементов в этом массиве, и вы всегда можете узнать, сколько в нем элементов: int totalplayers = players.length; Если вы знаете все значения, которые будут храниться в массиве в момент его объявления, Java позволяет объявить и инициализировать такой массив одним выстрелом: String [] players = {Если имя игрока хранится в массиве, то нужно получить его второй элемент: String thewinner = players[1]; System.out.println(Знаете ли вы, почему второй элемент имеет индекс [1]? Конечно, вы это делаете, потому что индекс первого элемента всегда равен [0].

63 Программирование на Java для детей, родителей и бабушек и дедушек 51 Массив игроков в нашем примере одномерен, потому что мы храним их как бы в ряд. Если мы хотели сохранить значения в виде матрицы, мы можем создать двумерный массив. Java позволяет создавать многомерные массивы. Вы можете хранить любые объекты в массивах, и я покажу вам, как это сделать в главе 10. Повторяющиеся действия с петлями Петли используются для многократного повторения одного и того же действия, например, нам нужно напечатать поздравление нескольким победителям. Когда вы заранее знаете, сколько раз это действие должно быть повторено — используйте цикл с ключевым словом for: int totalplayers = players.length; int counter; for (counter=0; counter Этот код означает следующее: Выведите значение элемента массива, номер которого совпадает с текущим значением счетчика. Начните с номера элемента 0 (счетчик=0) и увеличьте значение счетчика на единицу (счетчик++). Продолжайте делать это до тех пор, пока счетчик не станет меньше totalplayers (счетчик Существует еще одно ключевое слово для написания циклов — while. В этих циклах вам не нужно точно знать, сколько раз повторять действие, но вам все равно нужно знать, когда закончить цикл. Давайте посмотрим как мы можем сгруппировать игроков используя цикл while который закончится когда значение счетчика переменных станет равным значению totalplayers:

64 int int totalplayers = players.length; counter=0; while (counter

65 программирование на Java для детей, родителей, бабушек и дедушек 53 поздравить всех, кроме Давида сайта и впредь будет вернуть обратно в начало цикла: while (счетчик

66 Дополнительное чтение 1. jguru: Основы языка. Краткий курс: ts.html 2.Область действия переменных: e.html Практика 1. Создайте новый класс с именем TemperatureConverter, который будет иметь метод со следующей сигнатурой: public String converttemp (int temperature, char convertto) Если значение аргумента convertto равно F, то температура должна быть преобразована в Градус Фаренгейта, а если она равна C, то в Градус Цельсия. Когда вы будете вызывать этот метод, поместите значение аргумента char в одинарные кавычки. Объявите метод convertgrades() класса ReportCard статическим и удалите строку, создающую экземпляр этого класса, из метода main(). Практика для Smarty Pants Вы заметили, что в примере с ключевым словом continue мы переместили счетчик строк вверх++;? Что было бы, если бы мы оставили эту строку в конце цикла, как это было в примере с break?

67 Программирование на Java для детей, родителей и бабушек и дедушек 55 Глава 5. Графический калькулятор ava поставляется с целой кучей классов, которые вы будете использовать для создания графических приложений. Th g to o f классы (библиотеки) AWT и Swing. существует две основные группы, которые используются для создания окон в Java: AWT и Swing Когда Java была первоначально создана, для работы с графикой была доступна только библиотека AWT. Эта библиотека представляет собой простой набор классов, таких как Button, TextField, Label и другие. Довольно скоро появилась еще одна, более продвинутая библиотека под названием Swing. Он также включает в себя кнопки, текстовые поля и другие элементы управления окнами. Имена компонентов Swing начинаются с буквы J, например JButton, JTextField, JLabel и т. Д. Все немного лучше, быстрее и удобнее в Swing, но в некоторых случаях наши программы будут работать на компьютерах со старыми JVM, которые могут не поддерживать Swing-классы. Вы увидите примеры работы с AWT позже в главе 7, но в этой главе мы создадим программу-калькулятор с использованием Swing. Существует еще один набор классов Java, который является частью платформы Eclipse, называемый Standard Widget Toolkit (SWT), но мы не будем использовать его в этой книге. Пакеты и операторы импорта Java поставляется со многими полезными классами, организованными в пакеты. Некоторые пакеты включают классы, отвечающие за рисование, в то время как другие пакеты имеют классы для работы с Интернетом и так далее. Например строка класса находится в пакете

68 называется java.lang, а полное имя класса String-java.lang.string. Компилятор Java знает, где найти классы, расположенные в файле java.lang, но есть много других пакетов с полезными классами, и вы несете ответственность за то, чтобы компилятор знал, где находятся классы из вашей программы. Например, большинство классов Swing живут в одном из следующих двух пакетов: javax.swing javax.swing.event Было бы раздражающе писать полное имя класса каждый раз, когда вы его используете, и чтобы избежать этого, вы можете написать операторы импорта только один раз над строкой объявления класса, например: import javax.swing.jframe; import javax.swing.jbutton; class Calculator{ JButton mybutton = new JButton(); JFrame MyFrame = new JFrame(); Эти операторы импорта позволят вам использовать короткие имена классов, такие как JFrame или JFrame.JButton, и компилятор Java будет знать, где искать эти классы. Если вам нужно использовать несколько классов из одного пакета, вам не нужно перечислять каждый из них в инструкции import, просто используйте wild card. В следующем примере звезда (asterisk) делает все классы из пакета javax.swing видимыми для вашей программы: import javax.swing.*; Тем не менее, лучше использовать отдельные операторы импорта, чтобы вы могли видеть, что именно класс импортирует из каждого пакета. Подробнее о пакетах Java мы поговорим в главе 10. Основные элементы Swing Это некоторые из основных объектов, из которых состоят приложения Swing: окно или рамка, которые могут быть созданы с помощью класса JFrame.

69 Программирование на Java для детей, родителей и бабушек и дедушек 57 Невидимая панель или панель, которая содержит все эти кнопки, текстовые поля, метки и другие компоненты. Панели создаются классом JPanel. Элементы управления окнами, такие как кнопки (JButton), текстовые поля ( JTextField), списки ( JList) и т. Д. Менеджеры макетов, которые помогают расположить все эти кнопки и поля на панели. Обычно программа создает экземпляр JPanel и назначает ему менеджер компоновки. Затем он может создать некоторые элементы управления окном и добавить их на панель. После этого добавьте панель в кадр, установите размер кадра s и сделайте его видимым. Но отображение фрейма-это только половина работы, потому что элементы управления окном должны знать, как реагировать на различные события, например, щелчок по кнопке. В этой главе мы узнаем, как отображать красивые окна, а следующая глава посвящена написанию кода, который будет реагировать на события, которые могут произойти с элементами этого окна. Наша следующая цель-создать простой калькулятор, который умеет складывать два числа и отображать результат. Создайте новый проект в Eclipse под названием My Calculator и добавьте новый класс SimpleCalculator со следующим кодом:

70 импорт пакета javax.качели.*; импорт Java.авт.flowlayout; приложение simplecalculator общественного класса { государственной статической силы основных(string[] аргументы) { // создаем панель для jpanel windowcontent= новый jpanel(); // установить менеджер компоновки для этой панели FlowLayout ФЛ = новый FlowLayout(); windowcontent.то setlayout(Флорида); // создание элементов управления в памяти надписи метка1 = новый метка jlabel(// Добавить элементы управления в панель windowcontent.add(label1); windowcontent.add(field1); windowcontent.add(label2); windowcontent.add(field2); windowcontent.add(label3); windowcontent.add(result); windowcontent.add(go); // Создать фрейм и добавить к нему панель JFrame frame = new JFrame(Скомпилируйте и запустите эту программу, и она отобразит окно, похожее на это: Это может быть не самый красивый калькулятор, но это даст нам возможность узнать, как добавлять компоненты и отображать окно. Иин

71 Программирование на Java для детей, родителей и бабушек и дедушек 59 в следующем разделе мы постараемся сделать его лучше с помощью менеджеров макетов. Некоторые старомодные языки программирования заставляют вас устанавливать точные координаты и размеры каждого компонента окна. Это прекрасно работает, если вы знаете настройки экрана (разрешение) всех людей, которые будут использовать вашу программу. Кстати, людей, которые пользуются вашими программами, мы называем пользователями. В Java есть менеджеры компоновки, которые помогают вам расположить компоненты на экране, не назначая строгих позиций элементам управления окна. Менеджеры макетов позаботятся о том, чтобы их экран выглядел красиво независимо от размера окна. Swing предлагает следующие менеджеры макетов: FlowLayout GridLayout BoxLayout BorderLayout CardLayout GridBagLayout Чтобы использовать любой менеджер макетов, программа должна создать его экземпляр, а затем назначить этот объект контейнеру, например панели, как в классе SimpleCalculator. Компоновка потока Эта компоновка упорядочивает компоненты в окне ряд за рядом. Например, метки, текстовые поля и кнопки будут добавляться в первую воображаемую строку до тех пор, пока там не останется места. Когда текущая строка будет заполнена, остальные компоненты перейдут в следующую строку, и так далее. Если пользователь изменит размер окна, это может испортить картинку. Просто возьмите угол нашего окна калькулятора и измените его размер. Посмотрите, как менеджер java.awt.flowlayout перестраивает элементы управления по мере изменения размера окна.

72 В следующем примере кода ключевое слово this представляет экземпляр объекта SimpleCalculator. FlowLayout fl = new FlowLayout(); this.setlayoutmanager(fl); Ну, FlowLayout-не лучший выбор для нашего калькулятора. Давайте теперь попробуем что-нибудь другое. Класс java.awt.gridlayout позволяет расположить компоненты в виде строк и столбцов в сетке. Вы будете добавлять компоненты в воображаемые ячейки этой сетки. При изменении размера экрана ячейки сетки могут увеличиться, но относительное положение компонентов окна останется прежним. Наш калькулятор состоит из семи компонентов, трех меток, трех текстовых полей и кнопки. Мы можем расположить их в виде сетки из четырех строк и двух столбцов (одна ячейка остается пустой): GridLayout gr = new GridLayout(4,2); Вы также можете назначить некоторые горизонтальные и вертикальные промежутки между ячейками, например пять пикселей: GridLayout gr = new GridLayout(4,2,5,5); После незначительных изменений в нашем калькуляторе (они выделены ниже) наш калькулятор будет выглядеть намного красивее. Создайте и скомпилируйте проект My Calculator. новый класс SimpleCalculatorGrid в

73 программирование на Java для детей, родителей, бабушек и дедушек 61 импорт пакета javax.качели.*; импорт Java.авт.gridlayout; SimpleCalculatorGrid общественного класса { государственной статической силы основных(string[] аргументы) { // создаем панель для jpanel windowcontent= новый jpanel(); // установить менеджер компоновки для этой панели GridLayout гл = новый GridLayout(4,2); windowcontent.то setlayout(гл); // создание элементов управления в памяти надписи метка1 = новый метка jlabel(JTextField result = new JTextField(10); JButton go = new JButton(

74 Попробуйте изменить размер этого окна — элементы управления будут расти вместе с окном, но их относительное положение не изменится: Есть еще одна вещь, которую нужно помнить о макете сетки: все ячейки сетки имеют одинаковую ширину и высоту. Класс компоновки границ java.awt.borderlayout делит окно на Южную, Западную, Северную, Восточную и Центральную области. Северная область всегда остается вверху окна, Южная-внизу, Западная-слева, а Восточная-справа. Например, в калькуляторе, показанном на следующей странице, текстовое поле, отображающее числа, расположено в северной области. Вот как вы можете создать BorderLayout и поместить туда текстовое поле: BorderLayout bl = new BorderLayout(); this.setlayoutmanager(bl); JTextField txtdisplay = new JTextField(20); this.add(Если вам нужны только Северная, Центральная и Южная области, Центральная область станет шире, так как вы не собираетесь использовать Восток и Запад. Я буду использовать BorderLayout немного позже в следующей версии нашего калькулятора под названием Calculator.java. Как вы думаете, GridLayout позволит вам создать окно калькулятора, похожее на то, которое поставляется с Microsoft Windows?

75 Программирование на Java для детей, родителей и бабушек с дедушками 63 К сожалению, этого не произойдет, потому что ячейки в этом калькуляторе имеют разные размеры — текстовое поле гораздо шире кнопок. Вы можете объединить менеджеры макетов с помощью панелей, которые имеют свои собственные менеджеры макетов. Чтобы объединить менеджеры макетов в новом калькуляторе, давайте сделаем следующее: Назначим макет границы панели содержимого фрейма. Добавьте поле JTextField в северную область экрана для отображения чисел. Создайте панель p1 с помощью GridLayout, добавьте к ней 20 кнопок, а затем добавьте p1 в центральную область панели содержимого. Создайте панель p2 с GridLayout, добавьте к ней четыре кнопки, затем добавьте p2 в западную область панели содержимого. Давайте начнем с немного более простой версии экрана калькулятора, которая будет выглядеть так: Создайте новый калькулятор классов и запустите программу. Прочитайте комментарии к программе в следующем примере кода, чтобы понять, как она работает.

76 import javax.swing.*; import java.awt.gridlayout; import java.awt.borderlayout; public class Calculator { // Объявление всех компонентов калькулятора. JPanel windowcontent; JTextField displayfield; JButton button0; JButton button1; JButton button2; JButton button3; JButton button4; JButton button6; JButton button7; JButton button8; JButton button9; JButton buttonpoint; JButton buttonequal; JPanel p1; / / Конструктор создает компоненты в памяти // и добавляет их в кадр с помощью комбинации // Borderlayout и Gridlayout Calculator(){ windowcontent= new JPanel(); // Установите менеджер макетов для этой панели BorderLayout bl = new BorderLayout(); windowcontent.setlayout(bl); // Создайте поле отображения и поместите его в область // North окна displayfield = new JTextField(30); windowcontent.add(

77 программирование на Java для детей, родителей, бабушек и дедушек 65 button6=новый jbutton с(p1.add(button8); p1.add(button9); p1.add(button0); p1.add(buttonpoint); p1.add(buttonequal); // Добавить панель p1 в центральную область // окна windowcontent.add(Калькулятор классов (часть 2 из 2) Класс компоновки коробки java.swing.boxlayout позволяет расположить несколько компонентов окна либо горизонтально (вдоль оси X), либо вертикально (вдоль оси Y). В отличие от FlowLayout manager, когда окно с BoxLayout изменяется, его элементы управления не сворачиваются. В BoxLayout элементы управления окнами могут иметь разные размеры (это недопустимо в GridLayout).

78 Следующие две строки кода задают макет коробки с вертикальным выравниванием в JPanel. JPanel p1= new JPanel(); setlayout(new BoxLayout(p1, BoxLayout.Y_AXIS)); Чтобы сделать этот код короче, я не объявляю переменную для хранения ссылки на объект BoxLayout, а скорее создаю экземпляр этого объекта и сразу же передаю его методу setlayout() в качестве аргумента. В этом разделе я покажу вам еще один способ создания окна калькулятора с помощью java.awt.gridbaglayout manager вместо объединения макетов и панелей. Наш калькулятор имеет строки и столбцы, но в сеточном макете все компоненты должны иметь одинаковый размер. Это не работает для нашего калькулятора, потому что в верхней части есть текстовое поле шириной с дерево цифровых кнопок. GridBagLayout-это расширенная сетка, которая позволяет иметь сетку с ячейками разного размера. Класс GridBagLayout работает вместе с другим классом, называемым GridBagConstraints. Ограничения-это не что иное, как атрибуты ячейки, и вы должны установить их для каждой ячейки отдельно. Все ограничения для ячейки должны быть установлены перед размещением компонента в ячейке. Например, один из атрибутов ограничения s называется gridwidth. Это позволяет сделать ячейку шириной с несколько других ячеек. При работе с макетом сетки сначала следует создать экземпляр объекта ограничения, а затем установить значения его свойств. После этого можно добавить компонент в ячейку контейнера.

79 Программирование на Java для детей, родителей и бабушек и дедушек 67 Следующий пример кода щедро усыпан комментариями, которые помогут вам понять, как использовать GridBagLayout. // Установите GridBagLayout для панели содержимого окна GridBagLayout gb = new GridBagLayout(); this.setlayout(gb); // Создайте экземпляр GridBagConstraints // Вам придется повторить эти строки для каждого компонента // который вы хотите добавить в ячейку сетки GridBagConstraints constr = new GridBagConstraints(); //установка ограничений для поля отображения калькулятора s: // координата x в сетке constr.x=0; // координата y в сетке constr.y=0; // эта ячейка имеет ту же высоту,что и другие ячейки constr.gridheight =1; // эта ячейка имеет такую же ширину, как и 6 других ячеек constr.gridwidth= 6; // заполняет все пространство в ячейке constr.fill= constr.both; // доля горизонтального пространства, занимаемого этим // компонентом constr.weightx = 1.0; // доля вертикального пространства, занимаемого этим компонентом constr.weighty = 1.0; // положение компонента внутри ячейки constr.anchor=constr.center; displayfield = new JTextField(); // установить ограничения для этого поля gb.setconstraints(displayfield, constr); // добавить текстовое поле в окно windowcontent.add(displayfield);

Подумайте о колоде карт, лежащих друг на друге, где вы можете видеть только верхнюю карту. Менеджер java.awt.cardlayout можно использовать, если вам нужно создать компонент, который выглядит как папка вкладок. Когда вы нажимаете на вкладку, содержимое экрана меняется. На самом деле все панели, необходимые для этого экрана, уже предварительно загружены и лежат друг на друге. Когда пользователь нажимает на вкладку, программа просто выводит эту картуСкорее всего, вы не будете использовать этот макет, потому что библиотека Swing включает в себя лучший компонент для окон с вкладками. Этот компонент называется JTabbedPane. Можно Ли Создавать Окна Без Использования Макетов? Конечно, можешь! Вы можете установить экранные координаты каждого компонента при добавлении их в окно. В этом случае ваш класс должен явно заявить, что он не будет использовать какой-либо менеджер макетов. В Java есть специальное ключевое слово null, которое на самом деле означает Мы будем использовать это ключевое слово довольно часто в будущем, и в следующем примере это означает, что нет менеджера компоновки: windowcontent.setlayout(null); Но если вы сделаете это, ваш код должен назначить координаты левого верхнего угла, ширину и высоту каждого компонента окна. Следующий пример показывает, как вы можете установить ширину кнопки s на 40 пикселей, высоту на 20 и поместить ее на 100 пикселей вправо и на 200 пикселей вниз от верхнего левого угла окна: JButton mybutton = new Button(Этот учебник содержит подробные объяснения всех

81 Программирование на Java для детей, родителей и бабушек и дедушек 69 Компоненты Swing. Наши калькуляторы используют только JButton, JLabel и JTextField, и вот список того, что еще доступно: JButton JLabel JCheckBox JRadioButton JToggleButton JScrollPane JSpinner JTextField JTextArea JPasswordField JFormattedTextField JEditorPane JScrollBar JSlider JProgressBar JComboBox JList JTabbedPane JTable JToolTip JTree JViewport ImageIcon Вы можете также создайте меню (JMenu и JPopupMenu), всплывающие окна, фреймы внутри других фреймов (JInternalFrame), используйте стандартные окна (JFileChooser, JColorChooser и JOptionPane). Java поставляется с отличным демонстрационным приложением, которое показывает все доступные компоненты Swing в действии. Он находится в папке J2SDK в разделе demo\jfc\swingset2. Просто откройте файл SwingSet2.html, и вы увидите экран, похожий на следующий.

82 Нажмите на любое изображение на панели инструментов, чтобы увидеть, как работает этот конкретный компонент Swing. Вы также можете найти Java-код, который использовался для создания каждого окна, выбрав вкладку Исходный код. Например, если вы нажмете на четвертый значок слева (так называемый combobox), то увидите окно, которое выглядит следующим образом:

83 Программирование на Java для детей, родителей и бабушек и дедушек 71 Swing имеет так много различных компонентов, чтобы сделать ваши окна красивыми! В этой главе мы создавали компоненты Swing, просто набирая код без использования каких-либо специальных инструментов. Но есть инструменты, которые позволяют выбрать компонент из панели инструментов и поместить его в окно. Эти инструменты автоматически генерируют правильный Java-код для компонентов Swing. Один из бесплатных графических дизайнеров пользовательского интерфейса (GUI), позволяющих легко создавать компоненты Swing и SWT, называется jigloo от CloudGarden, и вы можете найти ссылку на веб-страницу этого продукта в разделе Дополнительное чтение. В следующей главе вы узнаете, как окно может реагировать на действия пользователя.

84 Дополнительное чтение 1.Swing Tutorial: 2. Class JFormattedTextField: dtextfield.html 3.Учебник SWT и статьи: atform-swt-home/swt_resources.html 4.Jigloo GUI builder: Практика 1.Измените класс Calculator.java чтобы добавить кнопки +, -, /, и *. Добавьте эти кнопки на панель p2 и поместите панель в восточную область панели содержимого. 2. Прочитайте о классе JFormattedTextField в Интернете и измените код калькулятора, чтобы использовать этот класс вместо JTextField. Цель состоит в том, чтобы создать выровненное по правому краю поле, как это делают настоящие калькуляторы.

85 практики Умник программирование на Java для детей, родителей, бабушек и дедушек 73 измените класс Calculator.java чтобы сохранить все числовые кнопки в 10 — массив объявляется следующим образом: кнопками[] numbuttons= новый кнопок[10]; заменить 10 строк, которые начинаются с button0= новый jbutton с(Подсказка: загляните в код игры в Крестики-нолики в главе 7.

Различные события могут произойти с запущенной программой: пользователь нажимает на кнопку в окне, веб-браузер решает повторно нарисовать окно и т. Д. Я уверен, что вы пробовали нажимать кнопки нашего калькулятора из главы 5, но эти кнопки еще не были готовы реагировать на ваши действия. Каждый компонент окна может обрабатывать ряд событий или, как мы говорим, слушать эти события. Ваша программа должна регистрировать компоненты окна с помощью классов Java, называемых слушателями. Вы должны заставить компоненты слушать только те события, которые их интересуют. Например, когда человек наводит курсор мыши на кнопку калькулятора, не важно, где именно находилась мышь, когда человек нажимал кнопку, пока она находилась на поверхности кнопки. Вот почему вам не нужно регистрировать кнопку с помощью MouseMotionListener. С другой стороны, этот лис тенер удобен для всех видов программ рисования. Кнопки калькулятора должны регистрироваться в ActionListener, который может обрабатывать события нажатия кнопок. Все эти слушатели являются специальными классами Java, называемыми интерфейсами.

большинство классов определяют методы, которые выполняют различные действия, например будут реагировать на нажатия кнопок, будут реагировать на движения мыши и так далее. Совокупность таких действий называется классовым поведением. Интерфейсы-это специальные классы, которые просто называют набор конкретных действий без написания фактического кода, реализующего эти действия, например: interface MouseMotionListener { void mousedragged(mouseevent e); void mousemoved(mouseevent e); Как вы можете видеть, методы mousedragged() и mousemoved() не имеют никакого кода, они просто объявлены в интерфейсе MouseMotionListener. Но если ваш класс должен реагировать, когда мышь перемещается или перетаскивается, он должен реализовать этот интерфейс. Слово implements означает, что этот класс определенно будет включать методы, которые могли быть объявлены в этом интерфейсе, например:

88 импорт Java.авт.события.mousemotionlistener; класс mydrawingpad реализует MouseMotionListener{ // код, который может привлечь сюда вызванный(события mouseevent е){ // код, который выполняется, когда // мышь тащат сюда mousemoved(события mouseevent е){ // код, который выполняется, когда // мышь перемещается идет здесь вы можете задаваться вопросом, почему даже потрудились, создавая интерфейсы без написания кода? Причина в том, что после того, как интерфейс создан, он может быть повторно использован многими классами. Например, когда другие классы (или сама JVM) видят, что класс mydrawingpad реализует интерфейс MouseMotionListener, они точно знают, что этот класс определенно будет иметь методы mousedragged() и mousemoved(). Каждый раз, когда пользователь перемещает мышь, JVM вызывает метод mousemoved()и выполняет написанный там код. Представьте, что программист Джо решает назвать такой метод mousemoved (), Мэри называет его movedmouse (), а Пит предпочитает mousecrawling()? В этом случае JVM будет сбита с толку и не будет знать, какой метод вызвать в вашем классе, чтобы сигнализировать о движении мыши. Класс Java может реализовывать несколько интерфейсов, например, ему может потребоваться реагировать на движения мыши и нажатие кнопки: class mydrawingprogram реализует MouseMotionListener, ActionListener { //Вы должны написать код для каждого метода, который // был определен в обоих интерфейсах здесь После того, как освоитесь с интерфейсами, которые поставляются с Java, вы сможете создавать свои собственные интерфейсы, но это продвинутая тема, и давайте даже не будем заходить туда в данный момент.

89 Action Listener Java Programming for Kids, Parents and Grandparents 77 Давайте вернемся к нашему калькулятору. Если вы выполнили задания из предыдущей главы, визуальная часть выполнена. Теперь мы создадим еще один класс-прослушиватель, который будет выполнять некоторые действия, когда пользователь нажимает на одну из кнопок. На самом деле мы могли бы добавить в класс код, обрабатывающий события клика Calculator.java но хорошие программисты всегда держат визуальные и обрабатывающие части в отдельных классах. Мы назовем второй класс CalculatorEngine, и он должен реализовать интерфейс java.awt.actionlistener, который объявляет только один метод — actionperformed(actionevent). JVM вызывает этот met hod на классе, который реализует этот интерфейс всякий раз, когда человек нажимает на кнопку. Пожалуйста, создайте следующий простой класс: import java.awt.event.actionlistener; public class CalculatorEngine реализует ActionListener { Если вы попытаетесь скомпилировать этот класс (или просто сохранить его в Eclipse), вы получите сообщение об ошибке о том, что класс должен реализовать метод actionperformed(actionevent e). Давайте исправим эту ошибку: импортируйте java.awt.event.actionlistener; импортируйте java.awt.event.actionevent; public class CalculatorEngine реализует ActionListener { public void actionperformed(actionevent e){ // Пустой метод также разрешен здесь, // хотя ничего не произойдет, когда // JVM вызовет его, Следующая версия этого класса отобразит окно сообщения от метода actionperformed(). Вы можете отображать любые сообщения, используя класс JOptionPane и его метод sh owconfirmdialog(). Например, класс CalculatorEngine di накладывает следующее окно сообщения:

Существуют различные версии метода showconfirmdialog(), и мы будем использовать метод с четырьмя аргументами. В приведенном ниже коде null означает, что это окно сообщения не имеет родительского окна, второй аргумент содержит заголовок окна сообщения, затем идет само сообщение, а четвертый аргумент позволяет выбрать кнопку(ы), которые будут включены в окно (PLAI N_MESSAGE означает, что в окне сообщения будет отображаться только одна кнопка OK). импорт java.awt.event.actionlistener; импорт java.awt.event.actionevent; импорт javax.swing.joptionpane; public class CalculatorEngine реализует ActionListener { public void actionperformed(actionevent e){ JOptionPane.showConfirmDialog(null, PLAIN_MESSAGE); В следующем разделе я объясню вам, как скомпилировать и запустить следующую версию нашего калькулятора, которая будет отображать окно сообщения Регистрация компонентов с помощью ActionListeneter Кто и когда вызовет код, который мы написали в методе actionperformed()? JVM сама вызовет этот метод, если вы зарегистрируете (или свяжете) кнопки калькулятора с классом CalculatorEngine! Просто добавьте следующие две строки в конце конструктора класса Calculator.java чтобы зарегистрировать кнопку ноль с помощью нашего прослушивателя действий: CalculatorEngine calcengine = new CalculatorEngine(); button0.addactionlistener(calcengine); Отныне каждый раз, когда пользователь нажимает на кнопку 0, JVM вызывает метод actionperformed() на объекте CalculatorEngine. Скомпилируйте и запустите калькулятор классов прямо сейчас,

91 Java Программирование для детей, родителей и бабушек и дедушек 79 и нажмите на кнопку ноль он будет отображать окно сообщения Что-то случилось! Другие кнопки молчат, потому что они еще не зарегистрированы в нашем прослушивателе действий. Продолжайте добавлять похожие строки, чтобы оживить все кнопки: button1.addactionlistener(calcengine); button2.addactionlistener(calcengine); button3.addactionlistener(calcengine); button4.addactionlistener(calcengine); Что является источником события? Следующий шаг состоит в том, чтобы сделать нашего слушателя немного умнее, он будет отображать различные окна сообщений, в зависимости от того, какая кнопка была нажата. Когда происходит событие действия, JVM вызывает метод actionperformed(actionevent) в классе прослушивателя и предоставляет ценную информацию о событии в аргументе ActionEvent. Эту информацию можно получить, вызвав соответствующие методы для этого объекта. В следующем примере мы выясняем, какая кнопка была нажата, вызывая метод getsource() класса ActionEvent переменная e является ссылкой на этот объект, который живет где-то в памяти компьютера s. Но согласно документации Java, этот метод возвращает источник события в виде экземпляра типа Object, который является суперклассом всех классов Java, включая компоненты окна. Это делается таким образом, чтобы сделать универсальный метод, который работает для всех компонентов. Но мы точно знаем, что в нашем окне причиной события действия могут быть только кнопки! Вот почему мы приводим возвращаемый объект в форму JButton, помещая тип (JButton) в круглые скобки перед вызовом метода: JButton clickedbutton = (JButton) evt.getsource(); Мы объявляем переменную типа JButton слева от знака равенства, и хотя метод getsource() возвращает данные типа Object, мы говорим JVM: Не волнуйтесь, я точно знаю, что получаю экземпляр JButton.

92 Только после выполнения приведения от объекта к JButton мы можем вызвать метод getsource (), который принадлежит классу JButton. импорт java.awt.event.actionlistener; импорт java.awt.event.actionevent; импорт javax.swing.joptionpane; импорт javax.swing.jbutton; public class CalculatorEngine реализует ActionListener { public void actionperformed(actionevent e){ // Get the source of this action JButton clickedbutton=(jbutton) e.getsource(); // Get the button’s label String clickedbuttonlabel = clickedbutton.gettext(); // Присоединить метку кнопки // к тексту окна сообщения JOptionPane.showConfirmDialog(null, PLAIN_MESSAGE); Например, если вы нажмете кнопку пять, вы увидите следующее окно сообщения: Но что, если события окна создаются не только кнопками, но и некоторыми другими компонентами? Мы не хотим бросать все подряд.

93 Java Программирование для детей, родителей и бабушек и дедушек 81 Объект для JButton! Для этих случаев вы должны использовать специальный оператор Java с именем instanceof для выполнения правильного приведения. Следующий пример сначала проверяет, какой тип объекта вызвал событие, а затем выполняет приведение к JButton или JTextField: public void actionperformed(actionevent evt){ JTextField mydisplayfield=null; JButton clickedbutton=null; Object eventsource = evt.getsource(); if (eventsource instanceof JButton){ clickedbutton = (JButton) eventsource; иначе если (eventsource instanceof JTextField){ mydisplayfield = (JTextField)EventSource; Наш калькулятор должен выполнить различные части кода для каждой кнопки, и следующий фрагмент кода покажет вам, как это сделать. public void actionperformed(actionevent e){ Объект src = e.getsource(); if (src == buttonplus){ // Код, который добавляет числа, идет сюда else if (src == buttonminus){ // Код, который вычитает числа, идет сюда else if (src == buttondivide){ // Код, который делит числа, идет сюда else if (src == buttonmultiply){ // Код, который умножает числа, идет сюда сверху. Здесь мы должны быть в состоянии достичь атрибута displayfield калькулятора класса из метода actionperformed() класса CalculatorEngine. Это можно сделать, если мы определим в классе CalculatorEngine переменную, которая будет хранить ссылку на экземпляр калькулятора объектов. Мы собираемся объявить конструктор в следующей версии класса CalculatorEngine. У этого конструктора будет один аргумент

94 типа калькулятора. Не удивляйтесь, аргументы метода могут иметь типы данных созданных вами классов! JVM выполняет конструктор экземпляра CalculatorEngine при создании этого класса в памяти. Класс Calculator создает экземпляр CalculatorEngine и передает конструктору движка s ссылку на себя: CalculatorEngine calcengine = new CalculatorEngine(this); Эта ссылка содержит расположение экземпляра калькулятора s в памяти. Конструктор engine s хранит это значение в родительской переменной-члене и в конечном итоге будет использовать его в методе actionperformed() для доступа к полю отображения калькулятора. parent.displayfield.gettext(); parent.displayfield.settext(dispfieldtext + clickedbuttonlabel); Эти две строки взяты из следующего примера кода. import java.awt.event.actionlistener; import java.awt.event.actionevent; import javax.swing.jbutton; public class CalculatorEngine реализует ActionListener { Calculator parent; // ссылка на калькулятор // Конструктор хранит ссылку на окно // Калькулятор в переменной-члене parent CalculatorEngine(Calculator parent){ this.parent = parent; public void actionperformed(actionevent e){ // Get the source of this action JButton clickedbutton = (JButton) e.getsource(); // Get the existing text from the Calculator s // display field String dispfieldtext = parent.displayfield.gettext(); // Get the button’s label String clickedbuttonlabel = clickedbutton.gettext(); parent.displayfield.settext(dispfieldtext + clickedbuttonlabel);

95 Программирование на Java для детей, родителей и бабушек и дедушек 83 Когда вы объявляете переменную для хранения ссылки на экземпляр определенного класса, эта переменная должна иметь либо тип данных этого класса, либо одного из его суперклассов. Каждый класс в Java наследуется от класса Object, и если класс Fish является подклассом Pet, то каждая из этих строк верна: Fish myfish = new Fish(); Pet myfish = new Fish(); Object myfish = new Fish() Finishing Calculator Давайте придумаем некоторые правила (алгоритм) того, как должен работать наш калькулятор: 1. Пользователь вводит все цифры первого числа. 2. Если пользователь нажимает одну из кнопок действия +, -, / или *, то сохраните первое число и выбранное действие в переменных-членах и сотрите это число из текстового поля отображения. 3. Пользователь вводит второе число и нажимает кнопку равно. 4. Преобразуйте строковое значение из текстового поля в числовой тип double, чтобы иметь возможность хранить большие числа с десятичной точкой. Выполните выбранное действие, используя это значение и число, хранящееся в переменной с шага, Выведите результат с шага 4 в текстовое поле и сохраните это значение в переменной, которая использовалась на шаге 2. Все эти действия мы запрограммируем в классе CalculatorEngine. Читая приведенный ниже код, помните, что метод actionperformed() будет вызываться после каждого нажатия кнопки, а данные между этими вызовами метода будут храниться в переменных selectedaction и currentresult.

96 импорт Java.авт.события.действие actionlistener; импорт Java.авт.события.типа actionevent; импорт пакета javax.качели.jbutton с; Открытый класс CalculatorEngine реализует actionlistener и { калькулятор родителя; //ссылка на калькулятор окна чар selectedaction = ‘ ‘; // +, -, /, или * дважды currentresult =0; // конструктор магазинах ссылку на калькулятор // окно в переменную-член родительского CalculatorEngine(калькулятор родитель){ это.родитель = родитель; общественного недействительными событий actionperformed(типа actionevent е){ // получить источник этого действия jbutton с clickedbutton = (jbutton С) Е.getsource(); String dispfieldtext=parent.displayfield.gettext(); double displayvalue=0; //Получить число из текстового поля // если оно не пустое if (!

97 программирование на Java для детей, родителей, бабушек и дедушек 85 если (СРЦ == родителем.buttonplus){ selectedaction = ‘+’; currentresult=displayvalue; родителя.displayfield.помощью setText(else if (src == parent.buttonequal){ // Выполнить вычисления на основе selectedaction // обновить значение переменной currentresult // и отобразить результат if (selectedaction==’+’){ currentresult+=displayvalue; // Преобразовать результат в строку путем конкатенации // в пустую строку и отобразить ее parent.displayfield.settext(else if (selectedaction==’*’){ currentresult*=displayvalue; parent.displayfield.settext(

98 Калькулятор классов выполняет следующие действия: 1. Создает и отображает все компоненты окна. 2. Создайте экземпляр event listener CalculatorEngine. 3. Передайте двигателю ссылку на себя. 4. Регистрирует с помощью этого прослушивателя все компоненты, которые могут генерировать события. Вот окончательная версия Калькулятора классов: import javax.swing.*; import java.awt.gridlayout; import java.awt.borderlayout; public class Calculator { // Declare and instantate window components JButton button0=new JButton(JButton button3=new JButton(

99 программирование на Java для детей, родителей, бабушек и дедушек 87 jbutton с buttondivide=новый jbutton с(// Создайте панель с GridLayout//, которая будет содержать 12 кнопок — 10 числовых,и // кнопки с точкой и знаком равенства JPanel p1 = new JPanel(); GridLayout gl =new GridLayout(4,3); p1.setlayout(gl); p1.add(button1); p1.add(button2); p1.add(button3); p1.add(button4); p1.add(button5); p1.add(button6); p1.add(button7); p1.add(button8); p1.add(button9); p1.add(button0); p1.add(buttonpoint); p1.add(buttonequal); // Добавить панель p1 в центральную область окна windowcontent.add(// Создайте панель с GridLayout // которая будет содержать 4 кнопки действий — // Плюс, Минус, Деление и Умножение JPanel p2 = new JPanel(); GridLayout gl2 =new GridLayout(4,1); p2.setlayout(gl2); p2.add(buttonplus); p2.add(buttonminus); p2.add(buttonmultiply); Class Calculator (part 2 of 3)

100 Р2.добавить(buttondivide); // добавление панели Р2 в восточной части окна windowcontent.добавить(button2.addactionlistener(calcengine); button3.addactionlistener(calcengine); button4.addactionlistener(calcengine); button5.addactionlistener(calcengine); button6.addactionlistener(calcengine); button7.addactionlistener(calcengine); button8.addactionlistener(calcengine); button9.addactionlistener(calcengine); buttonpoint.addactionlistener(calcengine); buttonplus.addactionlistener(calcengine); buttonminus.addactionlistener(calcengine); buttondivide.addactionlistener(calcengine); buttonmultiply.addactionlistener(calcengine); buttonequal.addactionlistener(calcengine); publ ic static void main(string[] args) { // Instantiate the class Calculator Calculator calc = new Calculator(); Class Calculator (part 3 of 3) Теперь скомпилируйте проект и запустите класс Calculator. Он работает почти так же, как и калькуляторы реального мира. Поздравляю! Это ваша первая программа, которую могут использовать многие люди, подарите ее в подарок своим друзьям. Для лучшего понимания того, как работает эта программа, я рекомендую вам ознакомиться с отладкой программ. Пожалуйста, прочтите об отладчике в Приложении В, а затем вернитесь снова.

101 Java Программирование для детей, родителей и бабушек и дедушек 89 Некоторые другие слушатели событий Это некоторые другие слушатели Java из пакета java.awt, которые хорошо знать: Focus listener пошлет сигнал вашему классу, когда компонент получает или теряет фокус. Например, мы говорим, что текстовое поле имеет фокус, если оно имеет мигающий курсор. Прослушиватель элементов реагирует на выбор элементов в списке или выпадающем списке (выпадающем списке). Прослушиватель клавиш реагирует на кнопки клавиатуры. Прослушиватель мыши реагирует при щелчке мыши или при входе/выходе из области компонента в окне. Прослушиватель движения мыши сообщает вам, перемещается ли мышь или перетаскивается. Перетаскивать — значит перемещать мышь, нажимая на ее кнопку. Прослушиватель окна дает вам возможность поймать моменты, когда пользователь открывает, закрывает, минимизирует или активирует окно. В следующей таблице вы увидите имя интерфейсов прослушивателя и методы, которые эти интерфейсы объявляют. Интерфейсные методы FocusListener для реализации focusgained(focusevent) focuslost(focusevent) ItemListener KeyListener MouseListener MouseMotionListener WindowListener itemstatechanged(itemevent) keypressed(keyevent) keyreleased(keyevent) keytyped(keyevent) mouseclicked(mouseevent) mouseentered(mouseevent) mouseexited(mouseevent) mousepressed(mouseevent) mousereleased(mouseevent) mousedragged(mouseevent) mousemoved(mouseevent) windowactivated (WindowEvent) windowclosed(windowevent) windowclosing(windowevent) windowdeactivated (WindowEvent) windowdeiconified(windowevent) windowiconified(windowevent) windowopened(windowevent)

102 Например, интерфейс FocusListener объявляет два метода: focusgained() и focuslost(). Это означает, что даже если ваш класс заинтересован только в обработке событий, когда конкретное поле получает фокус, вы также должны включить пустой me thod focuslost(). Это может раздражать, и Java предоставляет специальные классы адаптеров для каждого слушателя, чтобы облегчить обработку событий. Как использовать адаптеры Допустим, вам нужно сохранить некоторые данные на диске, когда пользователь закрывает окно. Согласно приведенной выше таблице, класс, реализующий интерфейс WindowsListener, должен включать в себя семь методов. Это означает, что вам придется написать код в методе windowclosing (), а также включить шесть пустых методов. Пакет java.awt имеет адаптеры, которые являются классами, которые уже реализовали все необходимые методы (эти методы пусты внутри). Один из таких классов называется WindowAdapter. Вы можете расширить класс, который должен обрабатывать события из WindowAdapter, и просто переопределить интересующие вас методы, например метод windowclosing(). класс MyEventProcessor расширяет java.awt.windowsadapter { public void windowclosing(windowevent e) { // ваш код, который сохраняет данные на диске // идет сюда. Остальное легко просто зарегистрировать этот класс как прослушиватель событий в классе window: MyEventProcessor mylistener = new MyEventProcessor(); addwindowlistener(mylistener); Мы можем достичь того же результата, используя так называемые анонимные внутренние классы, но эта тема немного слишком сложна для этой книги.

103 Программирование на Java для детей, родителей и бабушек и дедушек 91 Дополнительное чтение Запись Слушателей событий: Практика Попробуйте разделить число на ноль с помощью нашего калькулятора — поле дисплея показывает слово Бесконечность. Измените класс CalculatorEngine для отображения сообщения Can t divide by zero, если пользователь нажимает на кнопку Divide, когда поле отображения пусто. Практика для умных штанов Модифицируйте класс CalculatorEngine, чтобы не позволять вводить более одного периода в число. Подсказка: прочтите о методе indexof() строки класса, чтобы узнать, есть ли в поле отображения уже один период.

104 Глава 7. Когда вы заходите в Интернет на свой любимый веб-сайт, есть вероятность, что некоторые из этих игр или других программ были написаны на Java с использованием так называемых апплетов. Эти специальные приложения живут и работают внутри окна веб-браузера. Веб-браузеры понимают простой язык разметки, называемый HTML, который позволяет вставлять специальные теги (метки) в текстовые файлы, чтобы они хорошо отображались в браузерах. Java-апплеты загружаются на ваш компьютер из Интернета как часть веб-страницы, и браузер достаточно умен, чтобы запустить свою собственную JVM для запуска этих апплетов. В этой главе вы узнаете, как создавать апплеты на вашем компьютере, а Приложение C объясняет, как публиковать свои веб-страницы в Интернете, чтобы другие люди также могли их использовать. Люди просматривают Интернет, не зная, содержат ли веб-страницы Java-апплеты или нет, но они хотят быть уверены, что их компьютеры не пострадают от некоторых плохих парней, которые добавили неприятный апплет на страницу. Вот почему апплеты были разработаны со следующими ограничениями:

105 Java Программирование для детей, родителей и бабушек и дедушек 93 Апплеты не могут получить доступ к файлам на вашем диске, если у вас нет специального файла сертификата на вашем диске, который дает им такое разрешение. Апплеты могут подключаться только к компьютеру, с которого они были загружены. Апплеты не могут запускать никакие другие программы, расположенные в вашем компьютере. Вы также можете протестировать апплеты в Eclipse или с помощью специальной программы appletviewer. Но прежде чем научиться создавать апплеты, давайте потратим 15 минут, чтобы ознакомиться с некоторыми HTML-тегами. Изучение HTML за 15 минут Представьте на мгновение, что вы написали и скомпилировали игровой апплет под названием TicTacToe. Теперь вам нужно создать HTML-файл с информацией о нем. Сначала создайте текстовый файл с именем TicTacToe.html (кстати, Eclipse также может создавать текстовые файлы). HTML-файлы имеют имена, которые заканчиваются либо with.html or.htm. Внутри они обычно имеют заголовок и тело разделов. Откройте этот файл в своем веб — браузере, используя его меню File and Open. Синяя строка заголовка окна будет читать Мою Первую веб-страницу, а внутри страницы вы увидите слова

106

107 Java Программирование для детей, родителей и бабушек и дедушек 95 Неудивительно, так как веб-браузер не мог найти TicTacToe.class, он просто показывает серый прямоугольник. Мы создадим этот класс немного позже в этой главе. HTML-теги окружены угловыми скобками, и некоторые из тегов могут иметь дополнительные атрибуты. ширина имеет ширину в пикселях прямоугольной области на экране, которая будет использоваться апплетом. Изображения на экране компьютера состоят из крошечных точек, называемых пикселями. высота — имеет высоту области, используемой апплетом. Если Java-апплет состоит из нескольких классов, поместите их все в один архивный файл с помощью программы jar, поставляемой вместе с JDK. И если вы это сделаете, то атрибут archive должен иметь имя этого архива. Вы можете прочитать о банках в приложении А.

108 Написание апплетов С помощью AWT Зачем использовать AWT для написания апплетов, если библиотека Swing лучше? Можем ли мы писать апплеты, используя классы Swing? Да, мы можем, но есть кое-что, о чем тебе нужно знать. Веб-браузеры поставляются со своими собственными JVM, которые поддерживают AWT, но могут не поддерживать классы Swing, включенные в ваш апплет. Конечно, пользователи могут скачать и установить последнюю версию JVM, и есть специальные HTML-конвертеры, которые изменят HTML-файл, чтобы указать своим браузерам на эту новую JVM, но действительно ли вы хотите попросить пользователей сделать это? После того, как ваша веб-страница опубликована в Интернете, вы не знаете, кто может ее использовать. Представьте себе старого парня где-то в пустыне с 10-летним компьютером, он просто оставит вашу страницу вместо того, чтобы проходить через все эти проблемы с установкой. Представьте, что наш апплет помогает продавать игры онлайн, и мы не хотим потерять этого парня, он может быть нашим потенциальным клиентом (у людей в пустыне тоже есть кредитные карты). Используйте AWT, если вы не уверены, какие веб-браузеры есть у ваших пользователей. На самом деле, другой выбор-попросить ваших пользователей загрузить специальный плагин Java и настроить свои браузеры на использование плагина вместо JVM, который поставляется с их браузером. Вы можете прочитать больше об этой опции на следующем веб-сайте:

109 Браузер также посылает сигналы апплетам, когда происходят важные события, например, апплет запускается, перерисовывается и так далее. Чтобы убедиться, что апплет реагирует на эти события, следует запрограммировать специальные методы обратного вызова: init (), start (), paint (), stop () и destroy(). JVM браузера вызовет эти методы в следующих случаях: init() вызывается при загрузке апплета браузером. Он вызывается только один раз, поэтому играет роль, аналогичную конструкторам в обычных классах Java. start() вызывается сразу после init(). Он также вызывается, если пользователь возвращается на веб-страницу после посещения другой страницы. paint() вызывается, когда окно апплета должно быть отображено или обновлено после некоторого действия на экране. Например, апплет перекрывается каким-то другим окном, и браузеру нужно перекрасить его. stop() вызывается, когда пользователь покидает веб-страницу, содержащую апплет. destroy() вызывается, когда браузер уничтожает апплет. Вы можете писать код в этом методе только в том случае, если апплет использует какие-то другие ресурсы, например, он поддерживает соединение с компьютером, с которого был загружен. Даже если вам не нужно программировать все эти методы, каждый апплет должен иметь по крайней мере init() или paint(). Вот код апплета, который отображает слова Hello World. Этот апплет имеет только один метод paint (), который получает экземпляр объектной графики из JVM браузера. У этого объекта есть целая куча методов рисования. В следующем примере используется метод drawstring() для рисования текста Hello World.

110 public class HelloApplet расширяет java.applet.applet { public void paint(java.awt.graphics graphics) { graphics.drawstring(Затем в окне Run выберите Java Applet в левом верхнем углу, нажмите кнопку New и введите HelloApplet в поле Applet Class. Экран должен выглядеть так:

111 Java Программирование для детей, Родителей и бабушек и дедушек 99 Как вы думаете, после этого простого примера мы готовы к написанию игровой программы? Еще бы! Просто пристегните ремни безопасности Написание игры в крестики-нолики Стратегия Каждая игра использует некоторый алгоритм набор правил или стратегию, которые должны быть применены в зависимости от действий игрока. Алгоритмы для одной и той же игры могут быть простыми или очень сложными. Когда вы слышите, что чемпион мира по шахматам Гарри Каспаров играет против компьютера, он на самом деле играет против программы. Команды экспертов пытаются изобрести сложные алгоритмы, чтобы победить его. Игра в крестики-нолики также может быть запрограммирована с использованием различных стратегий, и мы будем использовать простую: 1. Мы будем использовать доску 3х3. 2. Пользователь будет играть с символом X, а компьютер будет использовать O. 3. Победитель должен иметь полную строку, столбец или диагональ с теми же символами. 4. После каждого хода программа должна проверить, есть ли победитель. 5. Если есть победитель, выигрышная комбинация должна быть выделена, и игра должна закончиться. 6. Игра также должна закончиться, если больше не осталось пустых квадратов. 7. Игрок должен нажать кнопку Новая игра, чтобы играть снова. 8. Когда компьютер принимает решение, где поставить следующий O, он должен попытаться найти строку, столбец или

112 диагональ, которая уже имеет два O s, и поставьте третий ряд соответственно. 9. Если нет двух 10. Если выигрышный или блокирующий ход не найден, компьютер должен попытаться занять центральную клетку или выбрать следующую пустую клетку случайным образом. Код Я дам вам только краткое описание программы здесь, потому что в коде апплета есть много комментариев, которые помогут вам понять, как он работает. Апплет будет использовать менеджер BorderLayout, а в северной части окна появится кнопка Новая игра. В центральной части будут отображаться девять кнопок, представляющих квадраты, а в южной части будут отображаться сообщения: Все компоненты окна будут созданы в методе апплета s init(). Все события будут обработаны ActionListener в методе actionperformed(). Метод lookforwinner() вызывается после каждого хода, чтобы проверить, закончилась ли игра. Правила 8, 9 и 10 из нашей стратегии закодированы в методе computermove (), который может потребоваться для генерации случайного числа. Это делается с помощью Java-класса Math и его метода random(). Вы также найдете несколько необычный синтаксис, когда несколько вызовов методов выполняются в одном выражении, например:

113 программирование на Java для детей, родителей, бабушек и дедушек 101 если(квадратов[0].getlabel().равных(площадей[1].getlabel())){ эта строка делает код короче, потому что он на самом деле выполняет эту же действия, что можно было сделать в следующие строки: строка label0 = квадратов[0].getlabel(); строка метка1 = квадратов[1].getlabel(); если(label0.равна(метка1)){ В сложных выражениях Java вычисляет код в круглых скобках, прежде чем делать какие-либо другие вычисления. Короткая версия этого кода сначала получает результат выражения в скобках и сразу же использует его в качестве аргумента метода equals (), который применяется к результату первого вызова getlabel(). Хотя код игры занимает несколько страниц, его не должно быть трудно понять. Просто прочитайте все комментарии к программе. /** * Игра в крестики-нолики на доске 3×3 */ import java.awt.*; import java.awt.event.*; import java.applet.applet; public class TicTacToe расширяет апплет реализует ActionListener{ Button squares[]; Button newgamebutton; Label score; int emptysquaresleft=9; /** * init метод является конструктором апплета */ public void init(){ //Установите менеджер макетов апплета, шрифт и цвет this.setlayout(new BorderLayout()); this.setbackground(color.cyan); // Измените шрифт апплета на полужирный // размером 20 точек Font appletfont=new Font(

114 этом.добавить(toppanel,

115 Java Программирование для детей, Родителей и бабушек и дедушек 103 // Это один из квадратов? for ( int i=0; i// end actionperformed /** * Этот метод вызывается после каждого хода, чтобы увидеть, есть ли у нас победитель. Он проверяет каждую строку, столбец * и диагональ, чтобы найти три квадрата с * той же меткой (кроме пустой)

116 // проверяем строку 1 — элементы массива 0,1,2 если (!квадратов[0].getlabel().метод Equals(квадраты[6].getlabel().equals(квадраты[1].getlabel().equals(

117 программирование на Java для детей, родителей, бабушек и дедушек 105 // проверяем первый диагональ — элементы массива 0,4,8 еще если (! квадратов[0].getlabel().метод Equals(return thewinner; /** * Этот метод применяет набор правил для поиска наилучшего хода компьютера. Если хороший ход * не может быть найден, он выбирает случайный квадрат. */ void computermove() { int selectedsquare; // Компьютер сначала пытается найти пустой // квадрат рядом с двумя квадратами с // если selectedsquare все еще равен -1, по крайней мере // попробуйте занять центральный квадрат if ( (selectedsquare == -1) &&(squares[4].getlabel().equals(

118 /** * Этот метод проверяет каждую строку, столбец и диагональ*, чтобы увидеть, есть ли два квадрата с одинаковой меткой * и пустой квадрат. дайте X — для пользователя и O для компьютера номер пустого квадрата для использования, * или отрицательный 1 не смог найти 2 квадрата * с той же меткой */ int findemptysquare(string player) { int weight[] = new int[9]; for ( int i = 0; i -2 : 2; // See if row 1 has the same 2 squares and a blank if ( weight[0] + weight[1] + weight[2] == twoweights ) { if ( weight[0] == 0 ) return 0; else if ( weight[1] == 0 ) return 1; else return 2; // See if row 2 has the same 2 squares and a blank if (weight[3] +weight[4] + weight[5] == twoweights) { if ( weight[3] == 0 ) return 3; else if ( weight[4] == 0 ) возврат 4; иначе возврат 5;

119 программирование на Java для детей, родителей, бабушек и дедушек 107 // увидеть, если строка 3 имеет те же 2 квадратов и пустым, если (веса[6] Вес[7] +вес[8] == twoweights ) { если ( веса[6] == 0 ) возвращение 6; иначе, если ( веса[7] == 0 ) возвращение 7; остальное возвращение 8; // увидеть, если столбец 1 имеет те же 2 квадратов и пустым, если (веса[0] + масса[3] Вес[6] == twoweights) { если ( веса[0] == 0 ) возвращает 0; иначе, если ( веса[3] == 0 ) возвращение 3; остальное возвращение 6; // увидеть, если столбец 2 имеет те же 2 квадратов и пустым, если (вес, [1] Вес[4] + Вес[7] == twoweights ) { если ( веса[1] == 0 ) возвращает 1; else if ( weight[4] == 0 ) return 4; else return 7; // See if column 3 имеет те же 2 квадрата и пробел if (weight[2] + weight[5] + weight[8] == twoweights ){ if ( weight[2] == 0 ) return 2; else if ( weight[5] == 0 ) return 5; else return 8; //See if diagonal 1 имеет те же 2 квадрата и пробел if (weight[0] + weight[4] + weight[8] == twoweights ){ if ( weight[0] == 0 ) return 0; else if ( weight[4] == 0 ) return 4; else return 8;

120 // см. Если диагонали имеет те же 2 квадратов и пустым, если (вес, [2] Вес[4] Вес[6] == twoweights ){ если ( веса[2] == 0 ) возвращение 2; иначе, если ( веса[4] == 0 ) возвращение 4; остальное возвращение 6; // нет двух соседей, которые имеют тот же возвращают -1; // конец findemptysquare() /** * Этот метод выбирает любое пустое поле случайным образом выбирается квадрат числа */ int и getrandomsquare() { булево gotemptysquare = ложь; внутреннее selectedsquare = -1; делать { selectedsquare = (инт) (математика.случайный() * 9 ); если (квадратов[selectedsquare].getlabel().метод Equals(// to end the loop while (!gotemptysquare ); return selectedsquare; // end getrandomsquare() /** * Этот метод выделяет выигрышную линию. первый,второй и третий квадраты для выделения */ void highlightwinner(int win1, int win2, int win3) { squares[win1].setbackground(color.cyan); squares[win2]. setbackground(color. cyan); squares[win3].setbackground(color.cyan); // Отключает квадраты и включает кнопку новой игры void endthegame(){ newgamebutton.setenabled(true); for(int i=0;i)

121 Программирование на Java для детей, Родителей и бабушек и дедушек 109 Поздравляем! Вы закончили свою первую игру на Java. Вы можете запустить этот апплет либо непосредственно из Eclipse, либо открыв файл TicTacToe.html что мы создали в начале этой главы, просто скопируйте HTML-файл и TicTacToe.class в той же папке. У нашего класса TicTacToe есть небольшая ошибка, которую вы, возможно, даже не заметите, но я уверен, что она исчезнет после того, как вы выполните второе задание ниже. Наш класс TicTacToe использует простую стратегию, потому что наша цель-просто научиться программировать, но если вы хотите улучшить эту игру, изучите так называемую минимаксную стратегию, которая позволяет выбрать лучший ход для компьютера. Описание стратегии минимакс не относится к этой книге, но доступно в Интернете.

122 Дополнительное Чтение Java-Апплетов: Java Class Math Practice 1. Добавьте в верхнюю панель класса TicTacToe две метки для подсчета выигрышей и проигрышей. Объявите две переменные класса для этого и увеличьте соответствующую переменную каждый раз, когда у вас есть победитель или проигравший. Счет должен быть обновлен сразу после того, как программа напечатает сообщение, которое Вы выиграли или проиграли. 2. Наша программа позволяет нажать на квадрат, который уже имеет X или O. Это жучок! Программа продолжается, как если бы вы сделали правильный шаг. Измените код, чтобы игнорировать щелчки по таким квадратам 3. Добавьте метод main() в класс TicTacToe, чтобы можно было запускать игру не как апплет, а как Java-приложение.

123 Практика для Smarty Pants Java Programming for Kids, Родители и Бабушки с дедушками Перепишут TicTacToe, чтобы заменить одномерный массив, хранящий девять кнопок JButton squares [], двумерным массивом 3×3: JButton squares[][] Читайте о многомерных массивах в Интернете.

Глава 8. Программные ошибки — Исключения Говорят, что вы забыли закрывающую фигурную скобку в своем Java-коде. Это приведет к ошибке компиляции, которую можно легко исправить. Но есть так называемые ошибки времени выполнения, когда внезапно ваша программа перестает работать должным образом. Например, класс Java считывает файл с результатами игры. Что произойдет, если кто-то удалит этот файл? Произойдет ли сбой программы с этим страшным длинным сообщением об ошибке, или она останется в живых, отображая дружественное сообщение, подобное этому: Дорогой друг, по какой-то причине я не смог прочитать файл scores.txt. Пожалуйста, убедитесь, что файл существует? Вы должны подготовить свои программы к необычной ситуации. Во многих языках программирования обработка ошибок зависит от доброй воли программиста. Но Java заставляет вас включать код обработки ошибок, иначе программы даже не будут компилироваться. Ошибки во время выполнения в Java называются исключениями, а обработка ошибок-обработкой исключений. Вы должны поместить код, который может привести к ошибкам, в так называемый блок try/catch. Это как если бы вы сказали JVM следующее: Попробуйте прочитать файл с баллами, но если что-то произойдет, поймайте ошибку и выполните код,который будет иметь дело с ней: try{ filescores.read(); catch (IOException e){ System.out.println( Операции чтения и записи (на диск или другое устройство) называются input/output и, следовательно, IOException-это класс, который содержит информацию об ошибках ввода-вывода. Метод создает исключение в случае ошибки. Для разных типов ошибок будут создаваться разные исключения. Если блок catch существует в программе для данного конкретного типа ошибки, он будет пойман, и программа прыгнет в блок catch, чтобы

125 Программирование на Java для детей, родителей и бабушек и дедушек 113 выполнение кода, расположенного там. Программа останется в живых, и об этом исключении следует позаботиться. Инструкция print из приведенного выше кода будет выполнена только в случае ошибки чтения файла. Чтение трассировки стека Если возникает неожиданное исключение, которое не обрабатывается программой, она выводит на экран многострочное сообщение об ошибке. Такое сообщение называется трассировкой стека. Если ваша программа вызвала несколько методов до того, как столкнулась с проблемой, трассировка стека может помочь вам проследить программу и найти строку, вызвавшую ошибку. Напишите программу TestStackTrace, которая специально делится на ноль (номера строк не являются частью кода). 1 class TestStackTrace{ 2 TestStackTrace() 3 { 4 dividebyzero(); int dividebyzero() 8 { 9 return 25/0; static void main(string[]args) 13 { 14 new TestStackTrace(); Выходные данные этой программы показывают последовательность вызовов методов, которые были сделаны до момента возникновения ошибки времени выполнения. Начните читать этот вывод с последней строки, идущей вверх. Исключение в потоке Числа 14, 4 и 9 показывают, в каких строках программы были вызваны эти методы. После этого было вызвано исключение ArithmeticException, когда строка номер девять попыталась разделить на ноль.

126 Генеалогическое дерево исключений Исключения в Java также являются классами, и некоторые из них показаны в следующем дереве наследования: Подклассы исключения класса называются проверенными исключениями, и вы должны обрабатывать их в своем коде. Подклассы класса Error являются фатальными ошибками JVM, и запущенная программа не может их обработать. Исключение TooManyBikesException создается программистом. является ли примером исключения, которое может, Как программист должен знать заранее, если какой-то метод Java может вызвать исключение и что блок try/catch должен быть использован? Не беспокойтесь, если вы вызываете метод, который может

127 программирование на Java для детей, родителей, бабушек и дедушек 115 исключение в Java компилятор будет печатать сообщение об ошибке, подобное этому: В остальной части этой главы будет объяснено, как справиться с этими исключениями. Try/Catch Block Есть пять ключевых слов Java, которые можно использовать try, catch, finally, throw и throws. для обработки ошибок: После одного блока try вы можете поместить несколько блоков catch, если считаете, что может произойти более одной ошибки. Например, когда программа пытается прочитать файл, его может там не быть, и вы получите исключение FileNotFoundException, или файл есть, но код продолжает читать файл после достижения конца файла, что генерирует исключение EOFException. Следующий фрагмент кода будет печатать сообщения на простом английском языке, если программа не может найти файл с игровыми баллами или достигла конца файла. Для любых других ошибок чтения он распечатает файл чтения проблемы сообщения и техническое описание ошибки. public void getscores(){ try{ filescores.read(); System.out.println( Оценки загружены успешно ); catch(filenotfoundexception e){ System.out.println( Не удается найти оценки файлов ); catch(eofexception e1){ System.out.println( Достигнут конец файла ); catch(ioexception e2){ System.out.println( проблема чтения файла + e2.getmessage()); Если метод read() завершается неудачно, программа перепрыгивает через него.строка println() пытается приземлиться в блоке catch, который соответствует ошибке. Если он найдет такой блок, будет выполнен соответствующий println (), но если соответствующий блок catch не будет найден, метод getscores() повторно выдаст это исключение своему вызывающему. Если вы пишете несколько блоков catch, вам может потребоваться разместить их в определенном порядке, если эти исключения наследуются друг от друга. Например, так как исключение EOFException является подклассом

128 IOException, вы должны поставить блок catch для подкласса первым. Если вы сначала поставите catch для IOException, программа никогда не достигнет FileNotFound или EOFException, потому что первый catch перехватит их. Lazybones запрограммирует метод getscores() следующим образом: public void getscores(){ try{ filescores.read(); catch(exception e){ System.out.println( Problem reading file + e.getmessage()); Это пример плохого стиля кодирования Java. Когда вы пишете программу, всегда помните, что ее может прочитать кто-то другой, и вы не хотите стыдиться своего кода. Блоки Catch получают экземпляр исключения объекта, содержащего краткое объяснение проблемы, и его метод getmessage() возвращает эту информацию. Иногда, если описание ошибки неясно, попробуйте вместо этого использовать метод tostring (): catch(exception e){ System.out.println( Problem reading file + e.tostring()); Если вам нужна более подробная информация об исключении, используйте метод printstacktrace(). Он выведет последовательность вызовов методов, которые приводят к этому исключению, аналогичную примеру из раздела Трассировка стека чтения. Давайте попробуем убить программу калькулятора из главы 6. Запустите калькулятор класса и введите с клавиатуры символы abc. Нажмите любую из кнопок действий, и вы увидите на экране консоли что-то вроде этого: java.lang.numberformatexception: Для входной строки: forinputstring(numberformatexcept ion.java:48) в java.lang.floatingdecimal.readjavaformatstring(floatingdecimal.ja va:1213) в java.lang.double.parsedouble(double.java:202) в CalculatorEngine.actionPerformed(CalculatorEngine.java:27) в javax.swing.abstractbutton.fireactionperformed(abstractbutton.jav a:1764)

129 Программирование на Java для детей, родителей и бабушек и дедушек 117 Это был пример необработанного исключения. Класс CalculatorEngine имеет следующую строку в своем методе actionperformed(): displayvalue= Double.parseDouble(dispFieldText); Если переменная dispfieldtest не имеет числового значения, метод parsedouble() не будет преобразовывать его в тип данных double и вызовет исключение NumberFormatException. Давайте обработаем это исключение и отобразим сообщение об ошибке, которое объяснит проблему пользователю. Строка с parsedouble() должна быть помещена в блок try/catch, и Eclipse поможет вам в этом. Выделите эту строку и щелкните по ней правой кнопкой мыши. Во всплывающем меню выберите источник элементов и окружите блок try/catch. Вуаля! Код изменен: try { displayvalue= Double.parseDouble(dispFieldText); catch (NumberFormatException e1) { // TODO Auto-generated catch block e1.printstacktrace(); Замените строку printstacktrace() следующей: javax.swing.joptionpane.showconfirmdialog(null, возврат; Мы избавились от страшных сообщений об ошибках трассировки стека и показали простое для понимания сообщение, пожалуйста, введите номер: Теперь NumberFormatException обрабатывается. В некоторых случаях имеет смысл обрабатывать исключение не в том методе, где оно произошло, а в вызывающем методе. В таких случаях сигнатура метода должна объявить (предупредить), что она может вызвать определенное исключение. Это делается с помощью специального

130 бросков ключевых слов. Давайте воспользуемся тем же примером, который читает файл. Поскольку метод read() может вызвать исключение IOException, вы должны либо обработать его, либо объявить. В следующем примере мы объявим, что метод getallscores() может вызвать исключение IOException: класс MySuperGame{ void getallscores() вызывает исключение IOException {///Не используйте try/ catch, если вы/ / не обрабатываете исключения в этом методе file.read(); public static void main(string[] args){ MySuperGame msg = new MySuperGame(); System.out.println( Список баллов ); try{ // Поскольку getallscores()объявляет исключение, // мы обрабатываем его здесь msg.getallscores(); catch(ioexception e){ System.out.println( Теперь основной метод должен обрабатывать это исключение. Наконец, любой код в блоке try/catch может закончиться одним из следующих wa ys: Код внутри блока try успешно закончился, и программа продолжается. Код внутри блока try запускается в оператор return, и метод завершается. Код в блоке try создает исключение, и управление переходит к соответствующему блоку catch, который либо обрабатывает ошибку

131 Программирование на Java для детей, родителей и бабушек и дедушек 119 и выполнение метода продолжается, или он повторно выбрасывает исключение вызывающему этому методу. Если есть фрагмент кода, который должен быть выполнен независимо ни от чего, поместите его под ключевое слово finally: try{ file.read(); catch(exception e){ printstacktrace(); finally{ // код, который всегда должен быть выполнен // идет сюда, например file.close(); Приведенный выше код должен закрыть файл независимо от успеха или неудачи операции чтения. Обычно вы можете найти код, который освобождает некоторые ресурсы компьютера в блоке окончательно, например, отключение от сети или закрытие файла. Если вы не планируете обрабатывать исключения в текущем методе, они будут переданы вызывающему. В этом случае вы можете использовать finally даже без блока catch: void mymethod () throws IOException{ try{ // your code that reads a file goes here finally{ // your code that closes the file goes here The Keyword throw If an exception has happened in a method, but you believe that the caller should handle it, just re-throw it to the method s caller. Иногда вы можете поймать одно исключение, но повторно бросить другое с другим описанием ошибки, как в приведенном ниже фрагменте кода. Оператор throw используется для броска объектов Java. Объект, который выбрасывает программа, должен быть выбрасываемым. Это означает, что вы можете бросать только объекты, которые являются прямыми или косвенными подклассами класса Throwable, и все исключения Java являются его подклассами.

132 Следующий фрагмент кода показывает, как метод getallscores() ловит ption IOExce и создает новый объект исключения с более дружественным описанием ошибки, и повторно бросает его в метод main(). Теперь метод main() не будет компилироваться, если вы не поместите строку, вызывающую getallscores() в блок try/catch, потому что этот метод может вызвать исключение, и оно должно быть либо h andled, либо повторно брошено снова. Метод main() не должен вызывать никаких исключений, поэтому он должен обрабатывать его. class ScoreList{ // Для компиляции этого класса необходим дополнительный код static void getallscores() throws Exception{ try{ file.read();//эта строка может выдать исключение catch (IOException e) { throw new Exception ( System.out.println(

133 Java Программирование для детей, родителей и бабушек и дедушек 121 В случае ошибки файла основной метод обработает его, и e1.getmessage() вернет сообщение Дорогой друг. Создание новых исключений Программисты также могут создавать новые классы исключений, которые ранее не существовали в Java. Такие классы должны быть производными от одного из классов исключений Java. Допустим, вы занимаетесь продажей велосипедов и должны проверять заказы клиентов. В вашем небольшом грузовике может поместиться разное количество велосипедов в зависимости от модели. Например, в вашем грузовике может поместиться не более трех мотоциклов FireBird. Создайте новый подкласс исключения с именем TooManyBikesException, и если кто-то попытается заказать более трех таких велосипедов, выбросьте это исключение: class TooManyBikesException extends Exception{ // Конструктор TooManyBikesException (){ // Просто вызовите конструктор суперкласса // и передайте ему сообщение об ошибке для отображения super (Когда какой-то блок catch получает это исключение, он может узнать, что именно произошло, вызвав метод getmessage(). Представьте себе, что пользователь выбирает в окне заказа несколько велосипедов какой-то модели и нажимает кнопку Оформить заказ. Как вы знаете из главы 6, это действие приведет к вызову функции actionperformed (), которая проверит, может ли заказ быть доставлен. Следующий код

134 пример показывает, как метод checkorder() этого окна объявляет, что он может вызвать исключение TooManyBikesException. Если заказ не помещается в грузовик, этот метод выдает исключение, блок catch перехватывает его и отображает сообщение об ошибке в текстовом поле окна. класс OrderWindow реализует ActionListener{ // Здесь необходим код для создания компонентов окна. // Пользователь нажал на кнопку Разместить заказ String selectedmodel = txtfieldmodel.gettext(); String selectedquantity = txtfieldquantity.gettext(); int quantity = Integer.parseInt(selectedQuantity); void actionperformed(actionevent e){ try{ bikeorder.checkorder(Если они не подойдут, сделайте следующее: бросьте новое исключение TooManyBikesException(Очень помогает то, что Java заставляет вас писать код, подготовленный к таким ситуациям.

135 Программирование на Java для детей, родителей и бабушек и дедушек 123 Дополнительные ошибки обработки чтения С исключениями: Практика Создания приложения Swing для размещения заказов на велосипеды. Он должен иметь два текстовых поля: Модель велосипеда и Количество, кнопку Разместить заказ и метку для подтверждения заказа. Используйте код в примерах OrderWindow TooManyBikesException. Составьте и составьте несколько комбинаций моделей велосипедов и количеств, которые вызовут исключение. Практика для Smarty Pants Измените приложение из предыдущего задания, чтобы заменить текстовое поле Bike Model выпадающим списком, который будет содержать несколько моделей, чтобы пользователь мог выбрать их из списка, а не вводить. Вам придется прочитать в Интернете о компоненте Swing JComboBox и ItemListener для обработки событий, когда пользователь выбирает модель велосипеда.

136 Глава 9. Сохранение игрового счета После завершения программы он стирается из памяти. Это означает, что все классы, методы и переменные не существуют до тех пор, пока вы не запустите эту программу снова. Если вы хотите сохранить некоторые результаты выполнения программы, они должны быть сохранены в файлах на диске, ленте, карте памяти или другом устройстве, которое может хранить данные в течение длительного времени. В этой главе вы узнаете, как сохранять данные на дисках с помощью потоков Java. По сути, вы открываете поток между вашей программой и файлом на диске. Если вам нужно прочитать данные с диска, это должен быть входной поток, а если вы записываете данные на диск, откройте выходной поток. Например, если игрок выигрывает игру и вы хотите сохранить счет, вы можете сохранить его в файле под названием scores.txt использование выходного потока. Программа считывает или записывает данные из/в поток последовательно байт за байтом, символ за символом и т. Д. Поскольку ваша программа может использовать различные типы данных, такие как String, int, double и т. Д., Вы должны использовать соответствующий поток Java, например поток байтов, поток символов или поток данных. Классы, работающие с файловыми потоками, находятся в пакетах java.io. и java.nio. Независимо от того, какой тип потока файлов вы собираетесь использовать, в вашей программе должны быть выполнены следующие три шага: Откройте поток, который указывает на какой-то файл. Считывание или запись некоторых данных из/в этот поток. Закрой ручей. Если вы создаете программу, которая читает файл, а затем отображает его содержимое на экране, вам нужно знать, какой тип данных хранится в этом файле. С другой стороны, программа, которая просто копирует

137 Java Программирование для детей, родителей и бабушек и дедушек 125 файлов из одного места в другое, даже не нужно знать, является ли это изображение, текст или файл с музыкой. Такая программа считывает исходный файл в памяти как набор байтов, а затем записывает их в целевую папку байт за байтом с помощью классов Java FileInputStream или FileOutputStream. Следующий e xample показывает, как использовать класс FileInputStream для чтения графического файла с именем abc.gif то есть находится в папке c :\practice. Если вы используете компьютер с Microsoft Windos, чтобы избежать путаницы со специальными символами Java, которые начинаются с ba ckslash, используйте двойные косые черты в коде для разделения папок и файлов d: c:\\practice. Эта маленькая программа не отображает изображение, а скорее печатает некоторые цифры, так как это изображение хранится на диске. Каждый байт имеет положительное целое значение от 0 до 255, и класс ByteReader выводит эти значения через пробел. Обратите внимание, что класс ByteRader закрывает поток в блоке окончательно. Никогда не вызывайте метод close() внутри блока try/catch сразу после завершения чтения файла, сделайте это в блоке finally. В случае исключения во время чтения файла программа перепрыгнет через зачеркнутый оператор close (), и поток не будет закрыт! Чтение заканчивается, когда метод FileInputStream.read() возвращает отрицательное значение.

138 импорт Java.Ио.fileinputstream; импорт Java.Ио.класс IOException; общественного класса ByteReader { государственной статической силы основных(строка[] args) { FileInputStream файл myfile = нуль; попробуйте { // открыть поток байтов, указывающий на файл myfile = новый FileInputStream(наконец{ try{ myfile.close(); catch (Exception e1){ e1.printstacktrace( ); System.out.println(

139 программирование на Java для детей, родителей, бабушек и дедушек 127 тип int данных[]= {56,230,123,43,11,37; поток файла myfile = нуль; попробуйте { // открыть файл XYZ.DAT и сохранить // там данные из массива файл myfile = Новый Поток(write(data[i] ); catch (IOException e) { System.out.println(Буферизованные потоки До сих пор мы читали и записывали данные по одному байту за раз, что означает, что prog ram ByteReader должен будет получить доступ к диску 1000 раз для чтения файла 1000 байт. Но доступ к данным на дисках намного медленнее, чем манипуляция данными в памяти. Чтобы свести к минимуму количество попыток программы получить доступ к диску, Java предоставляет так называемые буферы, которые являются своего рода Класс BufferedInputStream помогает быстро заполнить буфер памяти данными из FileInputStream. Буферизованный поток считывает большой кусок байтов из файла за один выстрел в буфер в памяти, а затем метод read() получает отдельные байты из буфера намного быстрее. Ваша программа может соединять потоки, как сантехник соединяет две трубы. Давайте изменим пример, который читает файл. Сначала данные

140 льется из FileInputStream в BufferedInputStream, а затем метод read(): FileInputStream файл myfile = значение null; BufferedInputStream Буфф =нуль; попробуйте { файл myfile = новый FileInputStream(Это зависит от JVM, но вы можете установить его размер и посмотреть, не ускорит ли он чтение файла. Например, чтобы установить размер буфера на 5000 байт, используйте конструктор с двумя аргументами: BufferedInputStream buff = new BufferedInputStream(myFile, 5000); Буферизованные потоки не меняют тип чтения, а просто ускоряют его. BufferedOutputStream работает точно так же, но он использует класс FileOutputStream.

141 программирование на Java для детей, родителей, бабушек и дедушек 129 тип int данных[]= {56,230,123,43,11,37; поток файла myfile = значение null; BufferedOutputStream Буфф =нуль; попробуйте { файл myfile = Новый Поток(Чтобы убедиться, что все байты из butter выталкиваются в файловый поток, вызовите метод flush (), когда запись в BufferedOutputStream будет завершена. Аргументы командной строки Наша программа ByteReader хранит имя файла abc.gif прямо в его коде, или, как говорят программисты, имя файла жестко закодировано в программе. Это значит, что создать подобную программу, которая читает файл xyz.gif, вам придется изменить код и перекомпилировать программу, что не очень приятно. Было бы гораздо лучше передать имя файла из командной строки, когда вы запускаете программу. Вы можете запустить любую Java-программу с аргументами командной строки, например: java ByteReader xyz.gif В этом примере мы передаем методу main() ByteReader только один аргумент — xyz.gif. Если вы помните, метод main() имеет аргумент : public static void main(string[] args) {

142 Да, это строковый массив, который JVM передает в основной метод, и если вы запускаете программу без каких-либо аргументов командной строки, этот луч ar остается пустым. В противном случае этот массив будет иметь ровно столько элементов, сколько аргументов командной строки передается программе. Le t s посмотрите, как мы можем использовать эти аргументы командной строки в очень простом c lass, который просто напечатает их: pu blic class TestArguments { public static void main(string[] args) { // Сколько аргументов у нас есть? int numberofargs = args.длина; для (int i=0; i]); Следующий скриншот показывает вам что произойдет если вы запустите эту программу с двумя инструментами xyz.gif и 250. Значение xyz.gif JVM помещается в элемент args[0], а второй-в args[1]. Аргументы командной строки всегда передаются программе в виде строк. Программа отвечает за преобразование данных в соответствующий тип данных, например: int myscore = Integer.parseInt(args[1]); Всегда полезно проверить, содержит ли командная строка правильное количество аргументов. Сделайте это прямо в начале метода main(). Если программа не получает ожидаемых аргументов, она должна напечатать краткое сообщение об этом и немедленно остановиться, используя специальный метод System.exit():

143 Java Программирование для детей, родителей и бабушек и дедушек 131 public static void main(string[] args) { if (args.длина!= 2){ System.out.println( Чтобы заставить эту программу работать с любыми файлами, имена исходных и целевых файлов должны быть переданы этой программе аргументы командной строки s. Вы можете тестировать свои программы в Eclipse, где также есть место для предоставления аргументов командной строки каждой из ваших программ. В окне Run выберите вкладку с надписью (x)=arguments и введите требуемые значения в поле Program Arguments.

144 VM arguments box позволяет передавать параметры в JVM. Такие параметры могут потребовать больше памяти для вашей программы, тонкой настройки производительности JVM и т. Д. В разделе Дополнительное чтение есть ссылка на веб-сайт, который подробно описывает эти параметры. Чтение текстовых файлов Java использует двухбайтовые символы для хранения букв, а классы FileReader и FileWriter удобны для работы с текстовыми файлами. Классы ese могут читать текстовые файлы либо по одному символу за раз с помощью метода read(), либо целые строки с помощью readline(). Классы FileReader и FileWriter также имеют свои аналоги BufferedReader и BufferedWriter, которые ускорят работу с файлами. Thr next class ScoreReader читает файл scores.txt строка за строкой, и программа заканчивается, когда метод readline() возвращает null, что означает конец файла. Используйте любой обычный текстовый редактор и создайте файл c:\scores.txt со следующим содержимым: David 235 Brian 190 Anna 225 Zachary 160 Запустите программу ScoreReader, и она распечатает содержимое этого файла. Добавьте еще несколько строк в файл с оценками и повторно запустите программу, чтобы увидеть, будут ли напечатаны и новые строки.

145 программирование на Java для детей, родителей, бабушек и дедушек 133 импорт Java. Ио.filereader; импорт Java.Ио.командой bufferedreader; импорт Java.Ио.класс IOException; общественного класса ScoreReader { государственной статической силы основных(строка[] args) { FileReader файл myfile = null; в Буфф командой bufferedreader = нуль; попробуйте { файл myfile=новый FileReader(myfile.close(); catch(ioexception e1){ e1.printstacktrace(); // end main Если вашей программе нужно записать текстовый файл на диск, используйте один из нескольких перегруженных методов write() класса FileWriter. Эти методы позволят вам написать символ, строку или целый массив символов. FileWriter имеет несколько перегруженных конструкторов, и если вы откроете файл для записи, указав только имя файла, этот файл будет заменяться новым каждый раз, когда вы запускаете программу: FileWriter fout = new FileWriter(Если вам нужно добавить данные в существующий файл, используйте конструктор с двумя аргументами (true означает режим добавления): FileWriter fout = new FileWriter(

146 импорт Java.Ио.метод filewriter; импорт Java.Ио.bufferedwriter; импорт Java.Ио.класс IOException; общественного класса нотный редактор { государственной статической силы основных(string[] аргументы) { записывает файл myfile = null; в Буфф BufferedWriter = null; в строке[] баллов = новая строка[3]; // заполнить массив с результатами оценки[0] = Lee 300length; i++) { // запись массива строк в scores2.txt buff.write(scores[i]); System. out.println(System.out.println(

Класс java.io.file имеет ряд удобных методов, которые позволяют переименовать файл, удалить файл, проверить, существует ли класс и т. Д. Допустим, ваша программа сохраняет какие-то данные в файл, и ей нужно вывести пользователю сообщение с предупреждением, если такой файл уже существует. Для этого вам нужно создать экземпляр объектного файла с указанием имени файла, а затем вызвать метод exists(). Если этот метод возвращает true, то файл abc.txt найден и вы должны вывести предупреждение, иначе такого файла нет: File afile = new File(Если вам действительно нужно создать файл, используйте вместо этого метод createnewfile (). Ниже перечислены некоторые полезные методы файла класса. Имя метода createnewfile() delete() renameto() length() exists() list() lastmodified() mkdir() Что он делает, создает новый пустой файл, названный в соответствии с именем файла, используемым при создании экземпляра файла. Он создает новый файл только в том случае, если файл с этим именем не существует. Удаляет файл или каталог Переименовывает файл Возвращает длину файла в байтах Возвращает true если файл существует Возвращает массив строк с именами файлов/каталогов, расположенных в определенном каталоге Возвращает время последнего изменения файла Создает каталог Следующий фрагмент кода ниже переименовывает файл customers.txt для клиентов.txt.bak. Если файл.bak уже существует, он будет переопределен.

148 File File file = новый файл(delete(); file.renameto(backup); Хотя эта глава была посвящена работе с файлами, расположенными на диске вашего компьютера, Java позволяет создавать потоки, указывающие на удаленные машины в компьютерной сети. Такие компьютеры могут располагаться довольно далеко друг от друга. Например, НАСА использует Java для управления марсоходами, и я уверен, что они просто направили свои потоки на Марс.

149 Дополнительное чтение Java Programming for Kids, Parents and Grandparents JVM command line options 2. How to use File Streams: Practice Write a file copy program called FileCopy by combining the code fragments from the section on byte streams. Откройте два потока (входной и выходной) и вызовите методы read() и write() в одном цикле. Используйте аргументы командной строки для передачи программе имен исходного файла и его нового назначения, например : java FileCopy c:\\temp\\scores.txt c:\\backup\\scores2.txt

150 Practice for Smarty Pants Создайте Swing-программу, которая позволит пользователям выбирать имена файлов для копирования с помощью класса JFileChooser, который создает стандартное окно выбора файлов. Это окно должно появиться, когда пользователь нажмет одну из кнопок Обзора. Вам нужно будет написать пару строк кода, чтобы отобразить выбранное имя файла в соответствующем текстовом поле. Когда пользователь нажимает на кнопку Копировать, код в методе actionperformed() должен скопировать выбранный файл. Попробуйте повторно использовать код из предыдущего задания, не делая копирования/вставки.

151 Программирование на Java для детей, Родителей и бабушек и дедушек 139 Глава 10. У нас была возможность использовать довольно много различных элементов Java в предыдущих главах и даже создать игру в крестики-нолики. Но я пропустил некоторые важные элементы и методы Java, и пришло время догнать их. Работа со значениями даты и времени Каждый компьютер имеет внутренние часы. Любая Java — программа может узнать, что такое текущая дата и время, и отобразить ее в различных форматах, например 15.06.2004 или 15 июня, Java имеет несколько классов, которые имеют дело с датами, но два из них-java.util.date и java.text.simpledateformat позаботятся о большинстве ваших потребностей в dat/time. Легко создать объект, который хранит текущую системную дату и время с точностью до миллисекунды: Date today = new Date(); System.out.println( Вывод этих строк может выглядеть примерно так: Дата-Пт 27 февраля 07:18:51 EST 2004 Класс SimpleDateFormat позволяет отображать дату и время в разных форматах. Сначала вы должны создать экземпляр этого класса с нужным вам форматом, а затем вызвать его метод format (), передав объект Date в качестве аргумента. Следующая программа форматирует и печатает текущую дату в нескольких различных форматах.

152 импорт Java.утиль.дата; импорт Java.текст.класса simpledateformat; ПУ блик MyDateFormat класса { государственной статической силы основных( string [] аргументы ) { // создать объект Date, / / и распечатать его в формате даты по умолчанию сегодня = новая дата(); система.из.метод println( System.out.println( Скомпилируйте и запустите класс MyDateFormat, и он напечатает что-то вроде этого: Дата-Пт 27 февраля 07:34:41 EST 2004 Дата(dd-mm-yyy) — дата(dd-mm-yyyy) — дата(eee, MMM d, Вы также можете найти больше методов, которые имеют дело с датами в другом классе Java, называемом java.util.calendar. Перегрузка метода Класс может иметь несколько методов с одинаковым именем, но с разными списками аргументов. Это называется перегрузкой метода.

153 программирование на Java для детей, родителей, бабушек и дедушек 141 например, метода println() в своем классе систему можно назвать различные типы аргументов: строка, int и char, и другие: система.из.println(Вы можете сказать, почему не создавать методы с разными именами, например printstring (), printint (), printchar()?. Одна из причин заключается в том, что легче запомнить одно имя метода печати, чем несколько. Существуют и другие причины для использования перегрузки метода, но эти причины немного сложны для объяснения и должны обсуждаться в более продвинутых книгах. Если вы помните, наш класс Fish из главы 4, в котором есть метод dive (), который ожидает один аргумент: public int dive(int howdeep) Давайте создадим еще одну версию этого метода, которая не нуждается ни в каких аргументах. Этот метод заставит рыбу нырнуть на пять футов, если текущая глубина не станет больше 100 футов. Новая версия класса Fish имеет новую конечную переменную DEFAULT_DIVING, которая имеет значение five feet. Теперь класс Fish имеет два перегруженных метода dive().

154

155 Java Программирование для детей, родителей и дедушек 143 public class FishMaster { public static void main(string[] args) { Fish myfish = new Fish(20); myfish.dive(2); myfish.dive(); // новый перегруженный метод myfish.dive(97); myfish.dive(3); myfish.sleep(); Конструкторы также могут быть перегружены, но только один из них будет использоваться при создании объекта. JVM вызовет конструктор, который имеет соответствующий список аргументов. Например, если вы добавите конструктор без аргументов в класс Fish, FishMaster может создать его экземпляр одним из следующих способов: Fish myfish = new Fish(20); или Fish myfish = new Fish(); Чтение ввода с клавиатуры В этом разделе вы узнаете, как программа может печатать вопросы в командном окне и понимать ответы, которые пользователь вводит с клавиатуры. На этот раз мы удалим из класса FishMaster все жестко закодированные значения, которые он передает классу Fish. Теперь программа задаст вопрос на какую глубину?, и рыба будет нырять в соответствии с ответами пользователя. К этому времени вы уже должны были бы вполне освоиться с использованием стандартной системы вывода. Кстати, переменная out имеет тип данных java.io.outputstream. Теперь я объясню вам, как справиться со стандартным вводом System.in, и, как вы можете догадаться, тип переменной in-это java.io.inputstream. Следующая версия класса FishMaster отображает приглашение на системной консоли и ждет ответа пользователя. После того, как пользователь наберет один или несколько символов и нажмет кнопку Enter, JVM

156 помещает эти символы во входной поток объекта и передает их программе. import java.io.ioexception; import java.io.bufferedreader; import java.io.inputstreamreader; public class FishMaster { public static void main(string[] args) { Fish myfish = new Fish(20); String feetstring=try { feetstring = stdin.readline(); if (feetstring.equals(14 Погружение на 14 футов Я нахожусь на 34 фута ниже уровня моря, Готовый нырнуть. 30 Погружений на 30 футов Я на 64 футах ниже уровня моря Готов к погружению. Q До свидания!

157 Программирование на Java для детей, родителей и бабушек и дедушек 145 Во-первых, FishMaster создает поток BufferedReader, который подключается к стандартному входу System.in. После этого он выводит сообщение Насколько глубоко? а метод readline() приостанавливает работу программы до тех пор, пока пользователь не нажмет кнопку Enter. Введенное значение приходит в виде строки, поэтому FishMaster преобразует его в целое число и вызывает метод dive() класса Fish. Эти действия повторяются в цикле до тех пор, пока пользователь не наберет букву Q для выхода из программы. Строка feetstring.equals(Мы использовали метод readline (), чтобы получить всю строку, введенную пользователем сразу, но есть еще один метод System.in.read (), который позволяет обрабатывать ввод пользователя по одному символу за раз. Когда программисты работают над большими проектами с большим количеством классов, они обычно организуют их в разные пакеты. Например, один пакет может содержать все классы, отображающие окна (экраны), а другой-прослушиватели событий. Java также хранит свои классы в пакетах, например java.io для классов, ответственных за операции ввода-вывода, или javax.swing для классов Swing. Давайте создадим новый проект в Eclipse под названием PingPong. Этот проект будет иметь классы в двух пакетах: экраны и движок. Теперь создайте новый класс PingPongTable и введите слово screens в поле Package:

158 Нажмите кнопку Finish, и Eclipse сгенерирует код, включающий строку с именем пакета. package screens; public class PingPongTable { public static void main(string[] args) { Кстати, если ваш класс включает строку с ключевым словом package, вам не разрешается писать ничего, кроме комментариев над этой строкой. Поскольку каждый пакет хранится в отдельной папке на диске, Eclipse создает экраны папок и помещает файл PinPongTable.ява там. Посмотри там должна быть папка

159 Программирование на Java для детей, Родителей и бабушек и дедушек 147 c:\eclipse\workspace\pingpong\screens на вашем диске с файлами PingPongTable.java и PingPongTable.class. Теперь создайте еще один класс под названием PingPongEngine и введите слово engine в качестве имени пакета. Проект PingPong теперь имеет два пакета: поскольку наши два класса расположены в двух разных пакетах (и папках), класс PingPongTable не увидит класс PingPongEngine, если вы не добавите оператор import.

160 пакет экраны; импорт двигателя.pingpongengine; PingPongTable общественного класса { государственной статической силы основных(string[] аргументы) { PingPongEngine gameengine = новый PingPongEngine(); Java-пакетов не только поможет лучше организовать свои занятия, но они могут также использоваться, чтобы ограничить доступ в свои классы от иностранцев сидит в другие пакеты. Уровни доступа Классы, методы и переменные-члены Java могут иметь уровни доступа public, private, protected и package. Наш класс PingPongEngine имеет уровень публичного доступа. Это означает, что любой класс может получить к нему доступ. Давайте проведем простой эксперимент, удалив ключевое слово public из объявления класса PingPongEngine. Теперь класс PingPongTable даже не будет компилироваться, выдавая ошибку PingPongEngine не может быть разрешен или не является типом. Это означает, что класс PingPongTable больше не видит класс PingPongEngine. Если уровень доступа не указан, класс будет иметь уровень доступа к пакету. Это означает, что он будет доступен только для классов, расположенных в одном пакете. Точно так же, если вы забудете предоставить публичный доступ к методам класса PingPongEngine, PingPongTable будет жаловаться, говоря, что эти методы не видны. Вы увидите, как уровни доступа используются в следующей главе при создании игры в пинг-понг.

161 Программирование на Java для детей, родителей и бабушек и дедушек 149 Уровень частного доступа используется для скрытия переменных класса или методов от внешнего мира. Большинство людей понятия не имеют, сколько деталей находится под капотом, и что на самом деле происходит, когда водитель нажимает на педаль тормоза. Посмотрите на следующий пример кода — в Java мы можем сказать, что объект Car предоставляет только один открытый метод brake(), который внутренне может вызывать несколько других методов, о которых водителю не нужно знать. Например, если водитель слишком сильно нажимает на педаль тормоза, компьютер автомобиля может применить специальные антиблокировочные тормоза. Я уже упоминал, что Java-программы управляют такими сложными роботами, как марсоходы, не говоря уже о простых автомобилях.

162// Этот частный метод может быть вызван внутри этого // класса только private void useregularbrakes(){ // код, который посылает сигнал обычным тормозам // Этот частный метод может быть вызван внутри этого // класса только private void useantilockbrakes(){ // код, который посылает сигнал антиблокировочным тормозам Существует еще одно ключевое слово Java protected, управляющее уровнем доступа. Если вы используете это ключевое слово в сигнатуре метода, этот метод будет виден внутри класса, из его подклассов и из других классов, расположенных в том же пакете. Но он не будет доступен для независимых классов, расположенных в других пакетах. Одна из главных особенностей объектно-ориентированных языков называется инкапсуляцией, то есть способностью скрывать и защищать элементы класса.

163 Программирование на Java для детей, родителей и бабушек и дедушек 151 При разработке класса скрывайте методы и переменные-члены, которые не должны быть видны снаружи. Если бы конструкторы автомобилей не скрывали контроль над некоторыми операциями под капотом, водителю пришлось бы иметь дело с сотнями кнопок, переключателей и датчиков. В следующем разделе вы можете найти оценку класса, которая скрывает свои атрибуты в частных переменных. Возвращаясь к массивам В главе 9, программа ScoreWriter создала массив строковых объектов, которые хранят имена и оценки игроков в файле. Самое время научиться использовать массивы для хранения любых объектов. На этот раз мы создадим объект для представления игрового счета, и он будет иметь такие атрибуты, как имя и фамилия игрока, счет и последняя дата, когда игра была сыграна. Следующим идет оценка класса. Он имеет геттеры и сеттеры для каждого из своих атрибутов, которые объявлены частными. Ну, может быть не очевидно, почему вызывающий класс не может просто установить значение атрибута score таким образом: Score.score = 250; вместо Score.setScore(250);

Попытайтесь мыслить нестандартно. Что, если позже мы решим, что наша программа должна воспроизводить музыку всякий раз, когда игрок достигает счета 500? Если в классе Score есть метод setscore(), вам просто нужно изменить только этот метод, чтобы добавить код, который проверяет оценку и воспроизводит музыку, если это необходимо. Класс caller будет продолжать вызывать музыкальную версию метода setscore() таким же образом. Если вызывающий класс будет видеть значение непосредственно, музыкальные изменения должны быть реализованы в этом вызывающем. А что, если вы захотите повторно использовать оценку класса в двух разных игровых программах? В случае прямых изменений атрибутов вам придется реализовать эти изменения в двух вызывающих классах, но если у вас есть метод setter, изменения инкапсулируются там и сразу же начнут работать для каждого вызывающего класса. импорт java.util.date; public class Score { private String firstname; private String lastname; private int score; private Date playdate; public String getfirstname(){ return firstname; public void setfirstname(string firstname){ this.firstname = firstname; public String getlastname(){ return lastname; public void setlastname(string lastname){ this.lastname = lastname; public int getscore(){ return score; public void setscore(int score){ this.score=score; public Date getplaydate(){ return playdate; public void setplaydate(date playdate){ this.playdate=playdate; // Объедините все атрибуты в строку // и добавьте новый символ строки в конце. // Этот метод удобен, если классу вызывающего абонента нужно // распечатать все значения за один кадр, например // System.out.println(MyScore.toString()); public String tostring(){ String scorestring = firstname +

165 Java — программирование для детей, родителей и бабушек с дедушками 153 Программа ScoreWriter2 будет создавать экземпляры объекта Score и присваивать значения их атрибутам. import java.io.filewriter; import java.io.bufferedwriter; import java.io.ioexception; import java.util.date; public class ScoreWriter2 { /** Метод main выполняет следующие действия: 1. Создайте экземпляр массива 2. 3. Запишите данные баллов в файл */ public static void main(string[] args) { FileWriter myfile = null; BufferedWriter buff = null; Date today = new Date(); Score scores[] = new Score[3]; // The player #1 scores[0]=new Score(); scores[0].setfirstname(

166 попробуйте { myfile = new FileWriter(length; i++) { // Преобразуйте каждую из оценок в строку // и запишите ее в scores2.txt buff.write(scores[i].tostring()); System.out.println(Класс ScoreWriter2 (часть 2 из 2) Если программа пытается получить доступ к элементу массива, который находится за пределами длины массива, то есть scores[5].getlastname (), Java выдает исключение ArrayIndexOutOfBoundsException. Класс ArrayList Пакет java.util включает в себя классы, которые весьма удобны, когда программе необходимо хранить в памяти несколько экземпляров (коллекций) каких-либо объектов. Некоторые из популярных классов коллекций из этого пакета-ArrayList, Vector, HashTable, HashMap и List. Я покажу вам, как использовать класс java.util.arraylist. Недостатком обычных массивов является то, что вы должны заранее знать количество элементов массива. Помните, что для создания экземпляра массива вы должны поместить число в скобки: String[] myfriends = new String[5];

167 Программирование на Java для детей, родителей и бабушек и дедушек 155 Класс ArrayList не имеет этого ограничения вы можете создать экземпляр этой коллекции, не зная, сколько объектов будет там, просто добавьте больше элементов по мере необходимости. Зачем использовать массивы, давайте просто всегда использовать ArrayList! К сожалению, ничего не приходит бесплатно, и вы должны заплатить цену за удобство ArrayList немного медленнее, чем обычный массив, и вы можете хранить там только объекты, например, вы не можете просто хранить кучу чисел int в ArrayList. Чтобы создать и заполнить объект ArrayList, необходимо сначала создать его экземпляр, создать экземпляры объектов, которые вы планируете там хранить, и добавить их в ArrayList, вызвав его метод add(). Следующая маленькая программа заполнит ArrayList строковыми объектами и распечатает содержимое этой коллекции. import java.util.arraylist; public class ArrayListDemo { public static void main(string[] args) { // Создать и заполнить ArrayList ArrayList friends = new ArrayList(); friends.add(int friendscount = friends.size(); // Выведите содержимое ArrayList for (int i=0; i Поскольку вы можете хранить любые объекты в коллекции, метод get() возвращает каждый элемент как объект Java, и программа несет ответственность за приведение этого объекта к правильному типу данных. В предыдущем примере нам не пришлось этого делать только потому, что мы хранили строковые объекты в коллекции friends, а Java автоматически преобразует объект в строку.

168 Но если вы решите хранить в ArrayList некоторые другие объекты, например экземпляры класса Fish, правильный код для добавления и извлечения конкретной рыбы может выглядеть так, как в программе FishTank, которая идет дальше. Во-первых, эта программа создает пару экземпляров класса Fish, присваивает некоторое значение цвету, весу и текущей глубине и сохраняет t hem в ArrayList под названием fishtank. Затем программа получает объекты из этой коллекции, бросает их в класс Fish и выводит их значения. импорт java.util.arraylist; public class FishTank { public static void main(string[] args) { ArrayList fishtank = new ArrayList(); Fish thefish; Fish afish = new Fish(20); afish.color = вес = 2; fishtank.add(afish); afish = new Fish(10); afish.color = weight = 5; fishtank.add(afish); int fishcount = fishtank.size(); for (int i=0;iвес + Глубина: Глубина:20 Получил зеленую рыбу, которая весит 5,0 фунта. Глубина:10 Теперь, когда вы прочитали об уровнях доступа Java, классы Pet и Fish могут быть немного изменены. Такие переменные, как возраст, цвет, вес и рост, должны быть объявлены защищенными, а переменная currentdepth должна быть закрытой. Вы должны добавить новые открытые методы, такие как getage (), чтобы вернуть значение переменной age, а setage() должен установить значение этой переменной и так далее.

169 Программирование на Java для детей, родителей и бабушек и дедушек 157 Программисты с хорошими манерами не позволяют одному классу напрямую изменять свойства другого класс должен предоставлять методы, которые изменяют его внутренние функции. Вот почему оценка класса из предыдущего раздела была разработана с частными переменными, которые можно было изменить с помощью setters и getters. В этой главе я показал вам различные элементы и методы Java, которые кажутся не связанными друг с другом. Но все эти элементы часто используются профессиональными Java-программистами. После выполнения практических заданий этой главы вы должны лучше понять, как эти элементы работают вместе.

170 Дополнительное Чтение 1. Коллекции Java: 2. Класс ArrayList: l 3. Вектор класса: 4. Календарь класса: Практика 1.Добавьте перегруженный конструктор без аргумента в класс Fish. Этот конструктор должен установить исходное положение в 10 футов. Класс FishMaster создаст экземпляр объекта Fish точно так же: Fish myfish = new Fish(); 2. Добавьте конструктор с четырьмя аргументами в оценку класса. Создайте программу ScoreWriter3, которая будет заполнять экземпляры объектов Score не с помощью сеттеров, а в то время, когда они создаются, например Score ascore = new Score(

171 Практика для Smarty Pants Java Программирование для детей, родителей и бабушек и дедушек 159 Узнайте онлайн, как использовать класс Vector и попробуйте создать программу VectorDemo, которая похожа на программу ArrayLiastDemo.

Глава 11. Возвращаясь к графике игры в пинг-понг В главах 5, 6 и 7, мы использовали некоторые компоненты AWT и Swing. Теперь я покажу вам, как вы можете рисовать и перемещать такие объекты, как овалы, прямоугольники и линии в окне. Вы также узнаете, как обрабатывать события мыши и клавиатуры. Чтобы добавить немного удовольствия к этим скучным предметам, в этой главе мы будем изучать все эти вещи, создавая игру в пинг-понг. В этой игре будет два игрока, и я называю их малыш и компьютер. Стратегия Позволяет придумать некоторые правила игры: 1. Игра длится до тех пор, пока один из игроков (малыш или компьютер) не достигнет счета, движения ракетки малыша будут контролироваться компьютерной мышью. 3. Игровой счет должен быть отображен в нижней части окна. 4. Новая игра начинается, когда игрок нажимает клавишу N на клавиатуре, Q заканчивает игру, а S подает мяч. 5. Только малыш может подавать мяч. 6. Чтобы выиграть очко, мяч должен выйти за вертикальную линию ракетки, когда ракетка не блокирует мяч. 7. Когда компьютер отскакивает мяч, он может двигаться только горизонтально вправо. Если мяч соприкасается с ракеткой малыша в верхней половине стола, он должен двигаться вверх и влево. Если шар находился в нижней части стола, он должен двигаться в направлении вниз и влево.

173 Вы, должно быть, думаете, что это будет слишком сложно запрограммировать. Хитрость заключается в том, чтобы разбить сложную задачу на множество более мелких и простых задач и попытаться решить каждую из них по одной. Этот трюк называется аналитическим мышлением, и он помогает не только в программировании, но и везде в вашей жизни не расстраивайтесь, если вы не можете достичь большой цели, разбейте ее на множество меньших и достигайте их по одному! Вот почему первая версия игры будет иметь только некоторые Java-программы для детей, родителей и бабушек и дедушек 161 эти правила реализованы, она будет просто рисовать стол, перемещать ракетку и отображать координаты указателя мыши при нажатии кнопки мыши. Код Вместо того, чтобы просто сказать, что мой компьютер не работает (большая проблема), попробуйте посмотреть, что именно не работает (найдите меньший). 1.Is компьютер подключен к электрической розетке (да/нет)? 2. Когда я запускаю компьютер, вижу ли я экран со всеми этими значками (да/нет)? 3. Могу ли я перемещать мышь по экрану (да/нет)? Нет. 4. Правильно ли подключен кабель мыши (да/нет)? Нет, просто подключите мышь, и компьютер снова начнет работать! Большая проблема заключалась в том, чтобы починить свободный кабель мыши. Эта игра будет состоять из следующих трех классов: Класс PingPongGreenTable позаботится о визуальной части. Во время игры он будет показывать стол, ракетки и мяч. Класс PingPongGameEngine будет отвечать за вычисления координат мяча и ракетки, начало и окончание игры, а также подачу мяча. Класс движка передаст текущие координаты компонентов в PingPongGreenTable, который соответственно перекрасится. Интерфейс GameConstants будет содержать объявления всех констант, необходимых игре, например ширины и высоты стола, стартовых позиций ракеток и так далее. Стол для пинг — понга будет выглядеть так:

174 Первая версия этой игры будет делать только три вещи: отображать зеленый стол для пинг-понга. Отображение координат указателя мыши при щелчке мыши. Двигайте ракетку малыша вверх и вниз. Через две страницы вы можете увидеть наш PingPongGreenTable класс, который является подклассом Swing s JPanel. Посмотрите на код, читая текст ниже. Поскольку нашей игре необходимо знать точные координаты указателя мыши, конструктор класса PingPongGreenTable создаст экземпляр класса прослушивателя событий PingPongGameEngine. Этот класс будет выполнять некоторые действия, когда ребенок нажимает на кнопку мыши или просто двигает мышью. Метод addpaneltoframe() создает метку, которая будет отображать координаты мыши. Этот класс не является апплетом, и именно поэтому вместо метода paint() он использует метод paintcomponent(). Этот метод вызывается либо JVM, когда она пытается обновить окно, либо когда наша программа вызывает метод repaint(). Вы правильно прочитали, метод repaint() внутренне вызывает paintcomponent() и предоставляет вашему классу объект Graphics, чтобы вы могли рисовать на окне. Мы будем вызывать этот метод каждый раз после пересчета координат ракеток или мяча, чтобы отобразить их в правильном положении. Чтобы нарисовать ракетку, сначала установите цвет, а затем заполните прямоугольник этой краской с помощью метода fillrect(). Этот метод должен знать координаты X и Y верхнего левого угла прямоугольника и

175 Программирование на Java для детей, родителей и бабушек с дедушками 163 его ширина и высота в пикселях. Шар окрашивается по методу filloval(), и ему необходимо знать координаты центра овала, его высоту и ширину. Когда высота и ширина овала одинаковы, он выглядит как круг. Координата X в окне растет слева направо, а координата Y увеличивается сверху вниз. Например, ширина этого прямоугольника составляет 100 пикселей, а высота-70: X (0,0) (100,0) Y (0,70) (110,70) Координаты X и Y углов этого прямоугольника показаны в скобках. Еще один интересный метод-getpreferredsize(). Мы создаем экземпляр измерения класса Swing, чтобы установить размер таблицы. JVM должен знать размеры окна, поэтому он вызывает метод getpreferredsize() объекта PingPongGreenTable. Этот метод возвращает в JVM измерение объекта, которое мы создали в коде в соответствии с размером нашей таблицы. Как табличные, так и движковые классы используют некоторые постоянные значения, которые не изменяются. Например, класс PingPongGreenTable использует ширину и высоту таблицы, а PingPongGameEngine должен знать приращения движения мяча: чем меньше приращение, тем плавнее движение. Удобно хранить все константы (конечные переменные) в интерфейсе. В нашей игре название интерфейса-GameConstants. Если классу нужны эти значения, просто добавьте implements GameConstants в объявление класса и используйте любую из конечных переменных этого интерфейса так, как если бы они были объявлены в самом классе! Именно поэтому как табличные, так и движковые классы реализуют интерфейс GameConstants. Если вы решите изменить размер стола, мяча или ракетки, вам нужно будет сделать это только в одном месте в интерфейсе GameConstants. Давайте посмотрим на код класса PingPongGreenTable и интерфейс GameConstants.

176 экраны пакетов; импорт javax.swing.jpanel; импорт javax.swing.jframe; импорт javax.swing.boxlayout; импорт javax.swing.jlabel; импорт javax.swing.windowconstants; import java.awt.point; import java.awt.dimension; import java.awt.container; import java.awt.graphics; import java.awt.color; import engine.pingponggameengine; /** * Этот класс рисует зеленый стол для пинг-понга * и отображает координаты точки*, где пользователь щелкнул мышью */ public class PingPongGreenTable extends JPanel implements GameConstants{ JLabel label; public Point point = new Point(0,0); public int ComputerRacket_X =15; private int kidracket_y =KID_RACKET_Y_START; Dimension preferredsize = new Dimension(TABLE_WIDTH,TABLE_HEIGHT); // Этот метод устанавливает размер кадра. // Он вызывается JVM public Dimension getpreferredsize() { return preferredsize; Class PingPongGreenTable (part 1 of 3)

177 Программирование на Java для детей, родителей, бабушек и дедушек 165 // Конструктор. Создает прослушиватель для событий мыши PingPongGreenTable(){ PingPongGameEngine gameengine = new PingPongGameEngine(this); // Слушайте щелчки мыши, чтобы показать ее координаты addmouselistener(gameengine); // Слушайте движения мыши, чтобы переместить ракетки addmousemotionlistener(gameengine); // Добавьте панель с JLabel в кадр void addpaneltoframe(container container) { container.setlayout(new BoxLayout(container, BoxLayout.Y_AXIS)); container.add(this); label = new JLabel(// перекрасить окно. Этот метод вызывается JVM // когда ему нужно обновить экран или когда // метод repaint() вызывается из PingPointGameEngine public void paintcomponent(graphics g) { super.paintcomponent(g); g.setcolor(color.green); // paint the table green g.fillrect(0,0,table_width,table_height); g.setcolor(color.желтый); // покрасить правую ракетку g.fillrect(kid_racket_x_start,kidracket_y,5,30); g.setcolor(color.blue); // покрасить левую ракетку g.fillrect(computerracket_x,100,5,30); g.setcolor(color.red); g.filloval(25,110,10,10); //покрасить мяч g.setcolor(color.Белый); g.drawrect(10,10,300,200); g drawline(160,10,160,210); Класс PingPongGreenTable (часть 2 из 3)

178 // отобразить как небольшой 2×2 пикселей прямоугольника если (место!= значения null) { метка.помощью setText(// Убедитесь, что окно можно закрыть//, нажав маленький крестик в углу f.setdefaultcloseoperation( WindowConstants.EXIT_ON_CLOSE); PingPongGreenTable table = new PingPongGreenTable(); table.addpaneltoframe(f.getcontentpane()); // Установите размер и сделайте кадр видимым f.pack(); f.setvisible(true); Класс PingPongGreenTable (часть 3 из 3)

179 Программирование на Java для детей, родителей и бабушек и дедушек 167 Следующим является интерфейс GameConstants. Все значения переменных указаны в пикселях. Используйте заглавные буквы для именования конечных переменных: package screens; public interface GameConstants { public final int TABLE_WIDTH = 320; public final int TABLE_HEIGHT = 220; public final int KID_RACKET_Y_START = 100; public final int KID_RACKET_X_START = 300; public final int TABLE_TOP = 12; public final int TABLE_BOTTOM = 180; public final int RACKET_INCREMENT = 4; Запущенная программа не может изменить значения этих переменных, поскольку они были объявлены как final. Но если, например, вы решите увеличить размер таблицы, вам нужно будет изменить значения TABLE_WIDTH и TABLE_HEIGHT, а затем перекомпилировать интерфейс GameConstants. Лицом,принимающим решения в этой игре, является класс PingPongGameEngine, который реализует два интерфейса, связанных с мышью. MouseListener будет иметь код только в методе mousepressed(). При каждом щелчке мыши этот метод будет рисовать на столе маленькую белую точку и отображать ее координаты. На самом деле, этот код бесполезен для нашей игры, но он покажет вам простым способом, как получить координаты мыши из объекта MouseEvent, который дается программе JVM. Метод mousepressed() устанавливает координаты переменной точки в зависимости от того, где находился указатель мыши, когда игрок нажимал его кнопку. После того как координаты установлены, он просит JVM перекрасить таблицу. MouseMotionListener реагирует на движения мыши над столом, и мы будем использовать его метод mousemoved() для перемещения ракетки малыша вверх или вниз. Метод mousemoved() вычисляет следующую позицию детской ракетки. Если указатель мыши находится над ракеткой (координата Y мыши меньше координаты Y ракетки), это гарантирует, что ракетка не пройдет над верхней частью стола. Когда конструктор таблицы создает объект engine, он передает движку ссылку на экземпляр таблицы s (ключевое слово this представляет собой ссылку на ячейку памяти объекта PingPongGreenTable). Теперь движок может разговаривать со столом, например, устанавливать новые координаты шара или перекрашивать стол, если

180 нужно. Если эта часть не ясна, вы можете перечитывать раздел о передаче данных между классами в главе 6. В нашей игре ракетки перемещаются вертикально из одной позиции в другую с шагом в четыре пикселя, как это определено в интерфейсе GameConstants (класс движка реализует этот интерфейс). Например, следующая строка вычитает четыре из значения переменной kidracket_y: kidracket_y -= RACKET_INCREMENT; Например, если координата Y ракетки была равна 100, то после этой строки кода ее значение становится 96, а это значит, что ракетку нужно переместить вверх. Вы можете получить тот же результат, используя следующий синтаксис: kidracket_y = kidracket_y — RACKET_INCREMENT; Если вы помните, мы говорили о различных способах изменения значений переменных в главе 3. Класс PingPongGameEngine следующий.

181 программирование на Java для детей, родителей, бабушек и дедушек 169 пакета; импорт Java.авт.события.события mouseevent; импорт Java.авт.события.mouselistener; импорт Java.авт.события.mousemotionlistener; импорт экраны.*; общественные PingPongGameEngine класс реализует MouseListener, MouseMotionListener, GameConstants{ PingPongGreenTable стол; общественного инт kidracket_y = KID_RACKET_Y_START; // конструктор. Хранит ссылку на таблицу public PingPongGameEngine(PingPongGreenTable greentable){ table = greentable; // Методы, требуемые интерфейсом MouseListener public void mousepressed(mouseevent e) { // Получить координаты X и Y указателя мыши // и установить его в y = e.gety(); //Метод repaint внутренне вызывает таблицу // method paintcomponent (), которая обновляет таблицу окна.repaint(); public void mousereleased(mouseevent e) {; public void mouseentered(mouseevent e) {; public void mouseexited(mouseevent e) {; public void mouseclicked(mouseevent e) {; public void mouseexited (mouseevent e) {; public void mouseclicked (mouseevent e) {; setkidracket_y(kidracket_y); таблица.перекраска(); До сих пор все наши программы выполняют действия в последовательности одно за другим. Если программа вызывает два метода, второй метод ожидает завершения первого. Другими словами, каждая из наших программ имеет только один поток выполнения.

Однако в реальной жизни мы можем делать несколько вещей одновременно, например, есть, разговаривать по телефону, смотреть телевизор и делать домашнюю работу. Для выполнения всех этих действий параллельно мы используем несколько процессоров: руки, глаза и рот. Некоторые из более дорогих компьютеров также имеют два или более процессоров. Но, скорее всего, ваш компьютер имеет только один процессор, который выполняет вычисления, посылает команды на монитор, диск, удаленные компьютеры и так далее. Но даже один процессор может выполнять несколько действий одновременно, если программа использует несколько потоков. Один класс Java может запускать несколько потоков выполнения, которые будут по очереди получать срезы времени процессора. Хорошим примером программы, создающей несколько потоков, является веб — браузер. Вы можете просматривать Интернет во время загрузки некоторых файлов, одна программа запускает два потока выполнения. Следующая версия нашей игры в пинг-понг будет иметь один поток, который отображает таблицу. Второй поток вычислит координаты мяча и ракеток и пошлет команды первому потоку перекрасить окно. Но сначала я покажу вам две очень простые программы, чтобы вы лучше поняли, зачем нужны потоки. Каждый из этих примеров программ будет отображать кнопку и текстовое поле.

183 Программирование на Java для детей, родителей и бабушек и дедушек 171 При нажатии кнопки Kill Time программа запустит цикл, который увеличит переменную в тридцать тысяч раз. Текущее значение счетчика переменных будет отображаться в строке заголовка окна. Класс NoThreadsSample имеет только один поток выполнения, и вы не сможете ввести что-либо в текстовое поле, пока цикл не будет выполнен. Этот цикл занимает все время процессора, поэтому окно заблокировано. Скомпилируйте и запустите этот класс и убедитесь сами, что окно заблокировано на некоторое время. Обратите внимание, что этот класс создает экземпляр JTextField и передает его в панель содержимого без объявления переменной для этого экземпляра. Если вы не планируете получать или устанавливать атрибуты этого объекта в данной программе, то такая ссылочная переменная вам не нужна.

184 импорт пакета javax.качели.*; импорт Java.авт.gridlayout; импорт Java.авт.события.действие actionlistener; импорт Java.авт.события.типа actionevent; NoThreadsSample общественный класс расширяет форму JFrame реализует actionlistener и{ // NoThreadsSample конструктор(){ // создать рамку с кнопкой и текстовым полем GridLayout гл =новый GridLayout( 2,1); этот.полностью().то setlayout(гл); jbutton с кнопки mybutton = новый jbutton с(// Process button clicks public void actionperformed(actionevent e){ // Just kill some time to show // that window controls are locked for (int i=0; iEXIT_ON_CLOSE); // Установить размер кадра в верхнем левом углу // координаты, ширина и высота mywindow.setbounds(0,0,150, 100); //Сделать окно видимым mywindow.setvisible(true);

185 Программирование на Java для детей, родителей и бабушек и дедушек 173 Следующая версия этого маленького окна создаст и запустит отдельный поток для цикла, а поток главного окна позволит вам вводить текст в текстовое поле во время выполнения цикла. Вы можете создать поток в Java одним из следующих способов: 1. Создайте экземпляр потока класса Java и передайте этому экземпляру объект, реализующий интерфейс Runnable. Если ваш класс реализует запускаемый интерфейс, то код будет выглядеть следующим образом: Thread worker = new Thread(this); Этот интерфейс требует, чтобы вы написали в методе run() код, который должен выполняться как отдельный поток. Но чтобы запустить поток, вы должны вызвать метод start(), который на самом деле вызовет ваш метод run(). Я согласен, это немного сбивает с толку, но вот как вы запускаете поток: worker.start(); 2. Создайте подкласс класса Thread и реализуйте там метод run (). Для запуска потока вызовите метод start(). public class MyThread extends Thread{ public static void main(string[] args) { MyThread worker = new MyThread(); worker.start(); public void run(){ // your code goes here I ll be using the first method in the class ThreadsSample because this class already extends JFrame, and you can t extend more than one class in Java.

186 импорт пакета javax.качели.*; импорт Java.авт.gridlayout; импорт Java.авт.события.действие actionlistener; импорт Java.авт.события.типа actionevent; ThreadsSample общественный класс расширяет форму JFrame реализует actionlistener с, интерфейс Runnable{ // конструктор ThreadsSample(){ // создать рамку с кнопкой и текстовым полем GridLayout гл =новый GridLayout(2,1); этот.полностью().то setlayout(гл); jbutton с кнопки mybutton = новый jbutton с(public void actionperformed(actionevent e){ // Создайте поток и выполните код kill-time-code // без блокировки окна Thread worker = new Thread(this); worker.start(); // это вызывает метод run() public void run(){ // Просто убейте некоторое время, чтобы показать, что // элементы управления окном НЕ заблокированы для (int i=0; iEXIT_ON_CLOSE); // Установите размер кадра и сделайте его видимым mywindow.setbounds(0,0,150, 100); mywindow.setvisible(true);

187 Программирование на Java для детей, родителей и бабушек и дедушек 175 Класс ThreadsSample запускает новый поток при нажатии на кнопку Kill Time. После этого поток с петлей и основной поток по очереди получают срезы времени процессора. Теперь вы можете ввести текстовое поле (основной поток), в то время как другой поток запускает цикл! Темы заслуживают гораздо лучшего изучения, чем эти две страницы, и я призываю вас сделать некоторые дополнительные чтения по этой теме. Завершение игры в пинг-понг После краткого введения потоков мы готовы изменить код наших классов игр в пинг-понг. давайте начнем с класса PingPongGreenTable. Нам не нужно отображать белую точку, когда пользователь щелкает мышью это было просто упражнение, чтобы узнать, как отображать координаты указателя мыши. Вот почему мы удалим объявление переменной точки и линии, которые окрашивают белую точку, из метода paintcomponent(). Кроме того, конструктору больше не нужно добавлять MouseListener, поскольку он отображает только координаты точки s. С другой стороны, этот класс должен реагировать на некоторые кнопки клавиатуры (N для новой игры, S для подачи мяча и Q для выхода из игры). Об этом позаботится метод addkeylistener (). Чтобы сделать наш код немного более инкапсулированным, я также переместил вызовы repaint() из класса engine в PingPongGreenTable. Теперь он будет отвечать за перекраску самого себя, когда это будет необходимо. Я также добавил методы для изменения положения мяча, компьютерной ракетки и отображения сообщений.

188 экраны пакетов; импорт javax.swing.jpanel; импорт javax.swing.jframe; импорт javax.swing.boxlayout; импорт javax.swing.jlabel; импорт javax.swing.windowconstants; import java.awt.dimension; import java.awt.container; import java.awt.graphics; import java.awt.color; import engine.pingponggameengine; /** * Этот класс рисует зеленый стол для пинг-понга, * мяч, ракетки и отображает счет */ public class PingPongGreenTable extends JPanel implements GameConstants{ private JLabel label; private int computerracket_y = COMPUTER_RACKET_Y_START; private int kidracket_y = KID_RACKET_Y_START; private int ballx = BALL_START_X; private int bally = BALL_START_Y; Dimension preferredsize = new Dimension(TABLE_WIDTH,TABLE_HEIGHT); // Этот метод устанавливает размер кадра. // Он вызывается JVM public Dimension getpreferredsize() { return preferredsize; // Конструктор. Создает прослушиватель для событий мыши PingPongGreenTable(){ PingPongGameEngine gameengine = new PingPongGameEngine(this); // Прослушивает движения мыши для перемещения ракеток addmousemotionlistener(gameengine); //Прослушивает события клавиатуры addkeylistener(gameengine); Класс PingPongGreenTable (часть 1 из 3)

189 Java Программирование для детей, родителей и бабушек и дедушек 177 // Добавить панель с JLabel в фрейм void addpaneltoframe(container container) { container.setlayout(new BoxLayout(container, BoxLayout.Y_AXIS)); container.add(this); label = new JLabel( Этот метод вызывается JVM // когда ему нужно обновить экран или когда // метод repaint() вызывается из PingPointGameEngine public void paintcomponent(graphics g) { super.paintcomponent(g); g.setcolor(color.green); // покрасьте таблицу в зеленый цвет g.fillrect(0,0,table_width,table_height); g.setcolor(color.желтый); // нарисуйте правую ракетку g.fillrect(kid_racket_x, kidracket_y, RACKET_WIDTH, RACKET_LENGTH); g.setcolor(color.blue); // нарисуйте левую ракетку g.fillrect(computer_racket_x, computerracket_y, RACKET_WIDTH,RACKET_LENGTH); // нарисуйте мяч g.setcolor(color.red); g.filloval(ballx,bally,10,10); //нарисуйте белые линии g.setcolor(color.белый); g.drawrect(10,10,300,200); g.drawline(160,10,160,210); // Установите фокус на таблицу, чтобы клавиша // listenerwill посылала команды в таблицу requestfocus(); // Set the current position of the kid’s racket public void setkidracket_y(int ycoordinate){ this.kidracket_y = ycoordinate; repaint(); Class PingPongGreenTable (part 2 of 3)

190 // возвращает текущую posiition на детские ракетки общественного инт getkidracket_y(){ возвращение kidracket_y; // установить текущее положение системы рэкета общественного недействительными setcomputerracket_y(тип int ycoordinate){ это.computerracket_y = ycoordinate; перекрасить(); // установить сообщение setmessagetext публичных игры недействительными(строка текста){ метка.помощью setText(текст); перекрасить(); // Установить игру послание общественного недействительными setballposition(инт системе XPOS, int и Оум){ помощью переменных ballx=системе XPOS; Балли=Оум; перекрасить(); государственной статической силы основных(string[] аргументы) { // создание экземпляра фрейма форму Ф = новое JFrame(// Убедитесь, что окно можно закрыть//, нажав маленький крестик в углу f.setdefaultcloseoperation( WindowConstants.EXIT_ON_CLOSE); PingPongGreenTable table = new PingPongGreenTable(); table.addpaneltoframe(f.getcontentpane()); // Установите размер кадра и сделайте его видимым f.setbounds(0,0,table_width+5, TABLE_HEIGHT+40); f.setvisible(true); Класс PingPongGreenTable (часть 3 из 3)

Я добавил еще несколько конечных переменных в интерфейс GameConstants, и вы должны быть в состоянии догадаться, для чего они предназначены, просто взглянув на имена переменных. package screens; /** * Этот интерфейс содержит все определения * конечных переменных, используемых в игре */ public interface GameConstants { // Size of the ping pong table public final int TABLE_WIDTH = 320; public final int TABLE_HEIGHT = 220; public final int TABLE_TOP = 12; public final int TABLE_BOTTOM = 180; // Приращение движения шара в пикселях public final int BALL_INCREMENT = 4; // Максимальные и минимальные допустимые координаты шара public final int BALL_MIN_X = 1+ BALL_INCREMENT; public final int BALL_MAX_X = TABLE_WIDTH — BALL_INCREMENT; public final int BALL_MAX_Y = TABLE_HEIGHT — BALL_INCREMENT; / / Начальные координаты шара public final int BALL_START_X = TABLE_WIDTH/2; public final int BALL_START_Y = TABLE_HEIGHT/2; //Размеры ракеток, позиции и приращения движений public final int KID_RACKET_X = 300; public final int KID_RACKET_Y_START = 100; public final int COMPUTER_RACKET_X = 15; public final int COMPUTER_RACKET_Y_START = 100; public final int RACKET_INCREMENT = 2; public final int RACKET_LENGTH = 30; public final int RACKET_WIDTH = 5; public final int WINNING_SCORE = 21; //Slow down fast computers — при необходимости измените значение public final int SLEEP_TIME = 10; //time in miliseconds Ниже приведены основные моменты изменений Я сделал в классе PingPongGameEngine: Я удалил интерфейс MouseListener и все его методы, потому что мы больше не обрабатываем щелчки мыши. MouseMotionListener позаботится обо всех движениях мыши. Этот класс теперь реализует интерфейс Runnable, и вы можете найти код принятия решений в методе run(). Посмотрите на конструктор, который я создаю, и начните там новый поток. Метод run() применяет правила стратегии игры в несколько этапов,

192 и все эти шаги запрограммированы внутри оператора if if(ballserved). Это короткая версия if(ballserved==true). Обратите внимание на использование условного оператора if, который присваивает значение переменной canbounce на шаге 1. В зависимости от выделенного выражения эта переменная получит значение либо true, либо false. Класс реализует интерфейс KeyListener, а метод keypressed() проверяет, какая буква была введена, чтобы начать/выйти из игры или подать мяч. Код этого метода позволяет пользователю вводить как заглавные, так и строчные буквы, например N и n. Я добавил несколько частных методов, таких как displayscore (), kidserve() и isballonthetable(). Эти методы объявлены закрытыми, потому что они используются только в этом классе, а другие классы даже не должны знать о них. Это пример инкапсуляции в действии. Некоторые компьютеры работают слишком быстро, и это затрудняет управление движением мяча. Вот почему я замедлил ход игры, вызвав метод Thread.sleep(). Статический метод sleep() приостанавливает этот конкретный поток на несколько миллисекунд, заданных в качестве аргумента этого метода. Чтобы добавить немного веселья в игру, когда ракетка ребенка ударяет по мячу, он движется по диагонали. Вот почему код изменяет не только координату X шара, но и координату Y.

193 программирование на Java для детей, родителей, бабушек и дедушек 181 пакета; импорт Java.авт.события.mousemotionlistener; импорт Java.авт.события.события mouseevent; импорт Java.авт.события.keylistener; импорт Java.авт.события.keyevent не; импорт экраны.*; /** * Этот класс является мышь и клавиатура слушателя. * Он вычисляет движения мяча и ракетки, * изменяет их координаты. */ публичный класс PingPongGameEngine реализует Runnable, MouseMotionListener, KeyListener, GameConstants{ private PingPongGreenTable table;//ссылка на таблицу private int kidracket_y = KID_RACKET_Y_START; private int computerracket_y=computer_racket_y_start; private int kidscore; private int computerscore; private int ballx; // ball X position private int bally; // ball Y position private boolean movingleft = true; private boolean ballserved = false; //Значение в пикселях вертикального движения мяча private int verticalslide; // Конструктор. Хранит ссылку на таблицу public PingPongGameEngine( PingPongGreenTable greentable){ table = greentable; Thread worker = new Thread(this); worker.start(); // Методы, требуемые MouseMotionListener // интерфейс (некоторые из них пусты, но должны быть // включены в класс в любом случае) public void mousedragged(mouseevent e) { Класс PingPongGameEngine (часть 1 из 5)

194

195 Java — программирование для детей, родителей и бабушек и дедушек 183 // Метод run() требуется запуском открытого пустого интерфейса(){ boolean canbounce=false; while (true) { if(ballserved){ // if ball is moving //Step 1. Мяч движется слева? true: false); ballx-=ball_increment; // Add up or down slide to any left/right ball // movement bally-=verticalslide; таблица.setballposition(ballx,bally); // Может отскакивать? если (ballx; // Шаг 2. Движется ли мяч вправо? setballposition(ballx,bally); // Может отскакивать?

196setcomputerracket_y(computerracket_y); // Шаг 4. setballposition(ballx,bally); табл.setkidracket_y(kidracket_y); Класс PingPongGameEngine (часть 4 из 5)

197 Программирование на Java для детей, родителей и бабушек и дедушек 185 private void displayscore(){ ballserved = false; if (computerscore ==WINNING_SCORE){ table.setmessagetext(Класс PingPongGameEngine (часть 5 из 5) Поздравляю! Вы закончили свою вторую партию. Скомпилируйте классы и играйте в игру. После того, как вы почувствуете себя более комфортно с кодом, попробуйте изменить его, я уверен, у вас будут некоторые идеи о том, как сделать эту игру лучше. Что читать дальше по Игровому программированию 1. CodeRally-это спонсируемая IBM Java-игра для программирования в реальном времени на основе платформы Eclipse. Это позволяет пользователям, незнакомым с Java, легко конкурировать, пока они изучают язык Java. Игроки разрабатывают раллийный автомобиль и принимают решения о том, когда ускоряться, поворачивать или замедляться, основываясь на местоположении других игроков или контрольно-пропускных пунктов, их текущем уровне топлива и других факторах.

198 Дополнительное чтение Учебник Java Threads Tutorial: Введение в Java Threads: javathread-i.html Класс java.awt.graphics: Практика 1. Класс PingPongGameEngine устанавливает координаты белой точки, используя следующий код: table.point.x = e.getx();. В классе PingPongGreenTable сделайте переменную point private и добавьте открытый метод setpointcoordinates(int x, int y). Измените код этого метода. класс движка для использования 2. Наша игра в пинг-понг имеет ошибку: после объявления победителя вы все еще можете нажать клавишу S на клавиатуре, и игра продолжится. Исправьте эту ошибку. Практика для Умных штанов 1. Попробуйте изменить значения RACKET_INCREMENT и BALL_INCREMENT. Более высокие значения увеличивают скорость движения ракетки и мяча. Измените код, чтобы разрешить выбор уровня игрока от 1 до 10. Используйте выбранные значения в качестве мяча и ракетки

199 Программирование на Java для детей, Родителей и бабушек и дедушек 187 инкрементов. 2. Когда ракетка ребенка отскакивает от мяча в верхней части стола, мяч движется по диагонали вверх и быстро падает со стола. Измените программу, чтобы переместить шар по диагонали вниз от верхней части стола и по диагонали вверх от нижней части.

200 Приложение A. Java Archives — JARs пользователи omputer довольно часто нуждаются в обмене файлами. Они могут либо копировать файлы на дискеты, компакт-диски, использовать , либо просто отправлять данные по сети. Существуют специальные программы, которые могут сжимать несколько файлов в один архивный файл. Размер такого архива обычно меньше, чем суммарные размеры каждого файла, и это делает копирование быстрее, а также экономит место на ваших дисках. Java поставляется с программой под названием jar, которая используется для архивирования нескольких классов Java и других файлов в файл с именем extension.jar. Внутренний формат jar — файлов такой же, как и в популярной программе WinZip (мы использовали ее в главе 2). Следующие древовидные команды иллюстрируют использование инструмента jar: Чтобы создать jar, который будет содержать все файлы с extension.class, откройте это черное командное окно, войдите в папку, где находятся ваши классы, и введите следующую команду: jar cvf myclasses.jar *.класс

201 Программирование на Java для детей, родителей и бабушек и дедушек 189 После слова jar вы должны указать параметры этой команды. В последнем примере c предназначен для создания нового архива, v-для отображения того, что там находится, а f означает, что указано имя файла нового архива. Теперь вы можете скопировать этот файл на другой диск или передать его своему другу. Разархивировать (извлечь) файлы из архива myclasses.jar, введите следующую команду: jar xvf myclasses.jar Все файлы будут извлечены в текущий каталог. В этом примере опция x предназначена для извлечения файлов из архива. Если вы просто хотите увидеть содержимое jar без извлечения файлов, используйте следующую команду, где t для оглавления: jar tvf myclasses.jar На самом деле, я предпочитаю использовать программу WinZip, чтобы увидеть, что s в файле jar. Во многих случаях реальные Java-приложения состоят из нескольких классов, которые живут в JAR. Хотя есть много других вариантов, которые могут быть использованы с программой jar, три примера из этой главы-это все, что вам нужно знать для большинства ваших будущих проектов. Дополнительное чтение Java Archive Tool:

Eclipse содержит множество небольших удобных команд, которые делают программирование на Java немного быстрее. Я перечислил здесь некоторые полезные советы Eclipse, но я уверен, что вы найдете их еще больше, когда начнете использовать этот инструмент. Если вы видите маленькую звездочку на вкладке с классом, это означает, что в классе есть некоторые несохраненные изменения кода. Выделите имя класса или метода, используемого в вашем коде, и нажмите кнопку F3 на клавиатуре. Это приведет вас к строке, где был объявлен этот класс или метод. Если некоторые строки отмечены красными кружочками ошибок, наведите курсор мыши на кружок, чтобы увидеть текст ошибки. Нажмите Ctrl-F11, чтобы снова запустить последнюю запущенную программу. Поместите курсор после фигурной скобки, и Eclipse отметит соответствующую скобку. Чтобы изменить суперкласс при создании нового класса, нажмите кнопку Обзор, удалите класс java.lang.object и введите первую букву класса, который вы хотите использовать. Вы увидите список доступных классов на выбор. Чтобы скопировать класс из одного пакета в другой, выберите класс и нажмите Ctrl-C. Выберите целевой пакет и нажмите Ctrl-V. Чтобы переименовать класс, переменную или метод, щелкните его правой кнопкой мыши и выберите во всплывающем меню пункт Рефакторинг и переименование. Это приведет к переименованию каждого вхождения этого имени.

203 Программирование на Java для детей, родителей и бабушек и дедушек 191 Если вашему проекту нужны внешние банки, щелкните правой кнопкой мыши имя проекта, выберите Свойства, Путь сборки Java и нажмите кнопку Добавить внешние банки. Ходят слухи, что около 40 лет назад, когда компьютеры были большими и даже не помещались в вашей комнате, внезапно одна из программ начала давать неправильные результаты. Все эти неприятности были вызваны маленьким жучком, который сидел внутри компьютера где-то в проводах. Когда люди удалили ошибку, программа снова начала работать нормально. С тех пор отлаживать программу-значит выяснять, почему она не дает ожидаемых результатов. Не путайте ошибки с ошибками компиляции. Скажем, например, вместо того, чтобы умножить переменную на 2, вы умножите ее на 22. Эта опечатка не вызовет никаких ошибок компиляции, но результат будет неверным. Отладчики позволяют шагать по запущенной программе по одной строке за раз, и вы можете видеть и изменять значения всех переменных в каждой точке выполнения программы. Я покажу вам, как использовать отладчик Eclipse с помощью программы FishMaster из главы 4. Точка останова-это строка в коде, где вы хотите, чтобы программа остановилась, чтобы вы могли видеть/изменять текущие значения переменных и некоторую другую информацию во время выполнения. Чтобы установить точку останова, просто дважды щелкните на серой области слева от линии, где вы хотите, чтобы программа остановилась. Давайте сделаем это в классе FishMaster на линии

204 myfish.dive(2). Вы увидите круглую пулю на этой линии, которая является точкой останова. Теперь выберите меню Run, Debug. Выберите приложение FishMaster и нажмите кнопку Debug. FishMaster начнет работать в режиме отладки, и как только программа достигнет линии myfish.dive(2), она остановится и будет ждать ваших дальнейших инструкций. Вы увидите окно, похожее на следующее. В левой нижней части перспективы отладки вы видите, что линия с точкой останова выделена. Синяя стрелка указывает на линию, которая должна быть выполнена. С правой стороны (в представлении переменных) нажмите на маленький знак плюс рядом с переменной myfish. Поскольку эта переменная указывает на объект Fish, вы увидите все переменные-члены этого класса и их текущие значения, например currentdepth=20. Стрелки в левом верхнем углу позволяют продолжить выполнение программы в различных режимах. Первая желтая стрелка означает шаг в метод. Если вы нажмете эту стрелку (или F5), то окажетесь внутри метода dive(). Окно меняется, и вы видите значения аргумента howdeep=2, как на следующем снимке экрана. Нажмите на маленький плюсик рядом со словом this, чтобы увидеть текущие значения переменных-членов этого объекта. Чтобы изменить значение переменной, щелкните ее правой кнопкой мыши и введите новое значение. Это может помочь, когда вы не уверены, почему

205 Java Программирование для детей, родителей и бабушек и дедушек 193 программа не работает правильно и хотела бы играть в игру what if. Чтобы продолжить выполнение по одной строке за раз, продолжайте нажимать следующую стрелку step over (или кнопку F6). Если вы хотите продолжить программу в быстром режиме, нажмите маленький зеленый треугольник или кнопку F8. Чтобы удалить точку останова, просто дважды щелкните по маленькой круглой пуле, и она исчезнет. Мне нравится использовать отладчик, даже если в моей программе нет ошибки, это помогает мне лучше понять, что именно происходит внутри запущенной программы. Где поставить точку останова? Если у вас есть идея, какой метод дает вам проблемы, поставьте его прямо перед подозрительной строкой. Если вы не уверены, просто поместите первую строку метода main() и медленно пройдитесь по программе.

Как опубликовать веб-страницу I Интернет-страницы состоят из HTML-файлов, изображений, звуковых файлов и т. Д. HTML был кратко упомянут в главе 7, но если вы планируете стать веб-дизайнером, вам следует потратить больше времени на изучение HTML, и одним из хороших мест для начала является веб-страница На самом деле существует множество веб-сайтов и программ, которые позволяют вам создать веб-страницу за несколько минут, даже не зная, как это делается. Эти программы будут генерировать HTML в любом случае, но они просто скрывают это от вас. Но если вы освоили эту книгу, я объявляю вас Младшим программистом Java (я не шучу!), и изучение HTML для вас-это кусок пирога. Чтобы разработать веб-страницу, вы обычно создаете один или несколько HTML-файлов на диске вашего компьютера, но проблема в том, что ваш компьютер не виден другим пользователям Интернета. Вот почему, когда страница будет закончена, вам нужно скопировать (загрузить) эти файлы в место, которое все могут видеть. Таким местом является диск, расположенный в компьютере компании, которая является вашим интернет-провайдером (ISP). Прежде всего, вам нужно иметь свою собственную папку на компьютере вашего провайдера. Свяжитесь со своим провайдером по телефону или , сказав, что вы создали HTML-страницу и хотите ее опубликовать. Они обычно отвечают со следующей информацией: Сетевое имя их компьютера (хост-машины). Имя папки на их компьютере, где они позволяют хранить ваши файлы. Веб — адрес (URL) вашей новой страницы-вы дадите его всем, кто заинтересован в просмотре вашей страницы. Идентификатор пользователя и пароль, необходимые для загрузки новых или изменения старых файлов.

В наши дни большинство интернет-провайдеров бесплатно предоставят вам по крайней мере 10 МБ места на своем диске, чего более чем достаточно для большинства людей. Теперь вам понадобится программа, которая позволит вам копировать файлы с вашего компьютера на компьютер вашего провайдера. Копирование файлов с компьютера на компьютер Интернета называется загрузкой, а копирование файлов из Интернета на компьютер называется загрузкой. Вы можете загружать или скачивать файлы с помощью так называемой программы FTP — клиента. Одним из простых и удобных в использовании FTP — клиентов является FTP Explorer, и вы можете скачать его с помощью Установки этой программы и добавить свой интернет-провайдер в список подключений вашего FTP-клиента-запустите FTP Explorer, и первое окно, которое вы увидите, — это экран подключения. Вы также можете нажать на пункт Co nnection в меню Сервис. Нажмите кнопку Добавить и введите хост, логин и пароль, который вы получили от своего провайдера. Просто введите имя вашего провайдера в поле Имя профиля. Если вы все сделали правильно, то увидите свой новый профиль подключения в списке доступных FTP-серверов. Нажмите кнопку Connect, и вы увидите папки на компьютере вашего провайдера. Найдите свой fol der там и начните процесс загрузки, который описан ниже. Панель инструментов имеет две синие стрелки. Стрелка, указывающая вверх, предназначена для загрузки. Нажмите эту стрелку, и вы увидите стандартное окно, которое позволит вам попасть в папку с вашими HTML-файлами. Выберите файлы, которые вы планируете загрузить, и нажмите

208 кнопка Открыта. Через пару секунд вы увидите эти файлы на компьютере вашего провайдера. Обратите внимание на нижнюю часть этого окна, чтобы убедиться, что при загрузке не было никаких проблем. Назовите основной файл вашей страницы index.html. Таким образом, ваш URL-адрес будет короче, и людям не нужно будет вводить имя файла в конце вашего URL-адреса. Например, если имя папки на диске ISP равно имени основного файла вашей веб-страницы. mymainpage.html, адрес вашей веб-страницы будет таким, но если название главной страницы index.html Теперь URL-адрес вашей страницы короче, и все, кто знает этот URL-адрес, смогут видеть вашу страницу онлайн. Если позже вы решите изменить эту веб — страницу, то повторите тот же процесс снова-внесите исправления на свой диск, а затем просто загрузите его, чтобы заменить старые файлы новыми. Если вы решили стать веб-дизайнером, то следующий язык для изучения-это JavaScript. Этот язык намного проще Java и позволит вам сделать ваши веб-страницы более привлекательными.