Java programming выпуск 28-й
Здравствуйте дорогие читатели!
Начинающим
Интерфейсы
Интерфейсы Java созданы для поддержки динамического выбора (resolution) методов во время выполнения программы. Интерфейсы похожи на классы, но в отличие от последних у интерфейсов нет переменных представителей, а в объявлениях методов отсутствует реализация. Класс может иметь любое количество интерфейсов. Все, что нужно сделать — это реализовать в классе полный набор методов всех интерфейсов. Сигнатуры таких методов класса должны точно совпадать с сигнатурами методов реализуемого в этом классе интерфейса. Интерфейсы обладают своей собственной иерархией, не пересекающейся с классовой иерархией наследования. Это дает возможность реализовать один и тот же интерфейс в различных классах, никак не связанных по линии иерархии классового наследования. Именно в этом и проявляется главная сила интерфейсов. Интерфейсы являются аналогом механизма множественного наследования в C++, но использовать их намного легче.
Оператор interface
Определение интерфейса сходно с определением класса, отличие состоит в том, что в интерфейсе отсутствуют объявления данных и конструкторов. Общая форма интерфейса приведена ниже:
interface имя {
тип_результата имя_метода1(список параметров);
тип имя_final1-переменной = значение;
}
Обратите внимание — у объявляемых в интерфейсе методов отсутствуют операторы тела. Объявление методов завершается символом ; (точка с запятой). В интерфейсе можно объявлять и переменные, при этом они неявно объявляются final - переменными. Это означает, что класс реализации не может изменять их значения. Кроме того, при объявлении переменных в интерфейсе их обязательно нужно инициализировать константными значениями. Ниже приведен пример определения интерфейса, содержащего единственный метод с именем callback и одним параметром типа int.
interface Callback {
void callback(int param);
}
Оператор implements
Оператор implements — это дополнение к определению класса, реализующего некоторый интерфейс(ы).
class имя_класса [extends суперкласс]
[implements интерфейс0 [, интерфейс1...]] { тело класса }
Если в классе реализуется несколько интерфейсов, то их имена разделяются запятыми. Ниже приведен пример класса, в котором реализуется определенный нами интерфейс:
class Client implements Callback {
void callback(int p) {
System.out.println("callback called with " + p);
} }
В очередном примере метод callback интерфейса, определенного ранее, вызывается через переменную - ссылку на интерфейс:
class TestIface {
public static void main(String args[]) { Callback с = new client();
c.callback(42);
} }
Ниже приведен результат работы программы:
С:\> Java TestIface
callback called with 42
Переменные в интерфейсах
Интерфейсы можно использовать для импорта в различные классы совместно используемых констант. В том случае, когда вы реализуете в классе какой-либо интерфейс, все имена переменных этого интерфейса будут видимы в классе как константы. Это аналогично использованию файлов-заголовков для задания в С и C++ констант с помощью директив #define или ключевого слова const в Pascal / Delphi.
Если интерфейс не включает в себя методы, то любой класс, объявляемый реализацией этого интерфейса, может вообще ничего не реализовывать. Для импорта констант в пространство имен класса предпочтительнее использовать переменные с модификатором final. В приведенном ниже примере проиллюстрировано использование интерфейса для совместно используемых констант.
import java.util.Random;
interface SharedConstants { int NO = 0;
int YES = 1;
int MAYBE = 2;
int LATER = 3;
int SOON = 4;
int NEVER = 5; }
class Question implements SharedConstants {
Random rand = new Random();
int ask() {
int prob = (int) (100 * rand.nextDouble());
if (prob < 30)
return NO; // 30% else if (prob < 60)
return YES; // 30% else if (prob < 75)
return LATER; // 15% else if (prob < 98)
return SOON; // 13% else
return NEVER; // 2%
} }
class AskMe implements SharedConstants {
static void answer(int result) {
switch(result) {
case NO:
System.out.println("No");
break;
case YES:
System.out.println("Yes");
break;
case MAYBE:
System.out.println("Maybe");
break;
case LATER:
System.out.println("Later");
break;
case SOON:
System.out.priniln("Soon");
break;
case NEVER:
System.out.println("Never");
break;
} }
public static void main(String args[]) {
Question q = new Question();
answer(q.ask());
answer(q.ask());
answer(q.askO);
answer(q.ask());
} }
Обратите внимание на то, что результаты при разных запусках программы отличаются, поскольку в ней используется класс генерации случайных чисел Random пакета java.util.
С:\> Java AskMe
Later
Scon
No
Yes
В следующем номере мы рассмотрим работу со строками.
Тема "на заказ"
После выхода прошлого номера в котором мы затрагивали установку Tomcat в связке с Apache на Windows XP, мне посыпались вопросы по установке и конфигурации на Linux платформе. По этому вопросу могу порекомендовать пару статей:
- Установка и конфигурация Tomcat 5.5 на ALT Linux Master 2.4
/articles/install_Tomcat_ALTLinux.html
-
Интеграция Tomcat с Apache. Развертывание веб-приложений Java2 на Linux-платформе
/articles/Apache_Tomcat_Linux.html
Сегодня разделы «Тема на заказ», «Вопрос-Ответ» и «Программный код…» мы объединим в одну тему – «Создание игр на Java», а точнее попробуем создать вместе игру.
Создание игр на Java
Предлагаю рассмотреть вариант игры "Tiler":
Цель игры: Игровое поле заполнено плитками различных цветов. Ваша цель - захватить как можно больше плиток на поле. Ходите вы по очереди с соперниками. Битва происходит путем выбора цвета, после чего все плитки этого цвета, которые прикасаются к вашим хотя бы одной стороной, переходят в ваше владение. Заполненная территория переходит полностью под вашу власть и окрашивается в цвет, который вы только что выбрали. После вашего удара свой ответный ход делают противники. Тот, кто соберет под свое влияние больше плиток, тот и станет победителем в конце схватки.
Наверное все вы играли в подобную игру. В общем мне это игра понравилась, но я быстро в неё наигрался и тут пришла мысль, написать подобную игру. В той игре в которую я играл боло всего 6 цветов плиток и один противник. Я же предлагаю сделать побольше цветов плиток и сделать возможным играть сразу с тремя противниками.
Конечно дизайнер из меня никудышный, но вот посмотрите, что у меня получилось:
А вот что получается во время игры и как выделяется завоеванное поле:
Да и сразу по названию новой игры, когда я её писал и тестировал, вместо банального названия «SuperTiler» мне в голову пришло название «Черви разума». Просто эта игра так затягивает и просто «съедает мозги» от напряжения когда ты пытаешься прокрутить все возможные варианты дальнейших действий. Так что и противников я назвал червями:)
И так всю программу я разбил на шесть классов:
- class SplashScreen
- class STButtonPanel
- class STGameField
- class STHelpWindow
- class STSettingsWindow
- class SuperTilerApplication
class SuperTilerApplication – класс реализует само приложение, т.е. содержит main метод и реализует сома основное окно, так как наследуется от JFrame в котором и размещаються два основных компонента: STGameField и STButtonPanel.
STGameField – компонент реализующий непосредственно само игровое поле.
STButtonPanel – компонент на котором располагаются кнопочки для выбора цвета хода.
STSettingsWindow – окошко с настройками.
STHelpWindow – окошко помощи.
SplashScreen – небольшая заставка к игре.
Сразу привету класс SuperTilerApplication там все довольно стандартно и просто, а уже в следующем номере мы рассмотрим класс STButtonPanel, где уже есть кое-что интересное:) Мы рассмотрим в нем детально работу с определением местоположения курсора мыши и обработку событий.
package supertiler;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.UIManager;
/**
* Title: Super Tiler
* Description:
* Copyright: Copyright (c) 2004
* Company: Ladik Studio
* @author Yura Ladik
* @version 1.0
*/
public class SuperTilerApplication extends JFrame
{
JPanel contentPane;
STGameField gameField;
STButtonPanel buttonPanel;
static SplashScreen intro;
/**Construct the application*/
public SuperTilerApplication()
{
//Заставка
intro=new SplashScreen("","");
intro.showFor(2000);
// Создаем игровое поле
gameField = new STGameField(this);
// Создаем панель с игровыми кнопочками
buttonPanel=new STButtonPanel(gameField);
// Дабавляем все на панель и указываем размеры
contentPane = (JPanel) this.getContentPane();
contentPane.add(gameField,BorderLayout.CENTER);
buttonPanel.setPreferredSize(new Dimension(52,100));
contentPane.add(buttonPanel,BorderLayout.EAST);
this.setSize(new Dimension(1008,731));
// Запрещаем изменять размеры окна, так как нам это не на руку:)
setResizable(false);
// Начинаем игру
gameField.newGame();
//** Этот блок кода производит центровку окошка по центу экрана
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = getSize();
if (frameSize.height > screenSize.height)
{
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width)
{
frameSize.width = screenSize.width;
}
setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
//**
setTitle("The worms of mind");
// Убираем заставку и делаем видимым основное окно
intro.setVisible(false);
setVisible(true);
}
/**Выходим из программы когда закрывается окно*/
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING)
{
if(gameField.bpadClip!=null)
{
gameField.bpadClip.stop();
gameField.bpadClip=null;
System.exit(0);
}
}
}
/**Main method*/
public static void main(String[] args)
{
try
{
UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
}
catch(Exception e)
{
e.printStackTrace();
}
new SuperTilerApplication();
}
}
JavaScript
Прошу вас не пропустить интересный цикл статей:- JSHttpRequest: динамическая подкачка данных без перезагрузки страницы
/javascript/articles/nablas41.html - Наследование в JavaScript
/javascript/articles/nablas40.html - Большие хитрости JavaScript
/javascript/articles/nablas39.html - Маленькие хитрости JavaScript, или пишем скрипты по-новому
/javascript/articles/nablas38.html
Вопрос: Как получить закладки из ИЕ? Возможно ли ето?
|
Ответ от Екатерины Ситченко: Сами закладки получить действительно нельзя, но вот проверить - находишься ли ты в закладках и был ли осуществлен переход на страницу со ссылки в меню "Избранное" можно. Вот код: <html> P.S. Читайте MSDN! |
Вопрос: Можно ли запустить приложение из окна браузера с помощью html и javascript? При нажатии на ссылку запускается приложение?
|
Ответ от Екатерины Ситченко: Можно используя ActiveX: <html>Также можете ознакомиться с более кроссбраузерным примером и принять участие в его обсуждении: /forum/content.php?action=showans&tID;=593&from;=6 |
Вопросы присылайте на E-mail
[email protected] с пометкой "Вопрос по Java".
А лучше задавайте их в форуме.
Жду вопросов и предложений.