Логин:   Пароль:






Новости
Рассылки
Форум
Поиск


Java
- Апплеты
- Вопрос-ответ
- Классы
- Примеры
- Руководства
- Статьи
- IDE
- Словарь терминов
- Скачать

Мобильная Java
- Игры
- Примеры
- Статьи
- WAP, WML и пр.

JavaScript
- Вопрос-ответ
- Примеры
- Статьи

Веб-мастеринг
- HTML
- CSS
- SSI

Разминка для ума
Проекты
Книги
Ссылки
Программы
Юмор :)




Rambler's Top100
Rambler's Top100

РассылкиАрхив Java programmingВыпуск 28-й

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 платформе. По этому вопросу могу порекомендовать пару статей:

Сегодня разделы «Тема на заказ», «Вопрос-Ответ» и «Программный код…» мы объединим в одну тему – «Создание игр на 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

Прошу вас не пропустить интересный цикл статей:

Вопрос: Как получить закладки из ИЕ? Возможно ли ето?
rage

Ответ от Екатерины Ситченко: Сами закладки получить действительно нельзя, но вот проверить - находишься ли ты в закладках и был ли осуществлен переход на страницу со ссылки в меню "Избранное" можно. Вот код:


<html>
<head>
<title>Test of save to favorites</title>
<style type="text/css">
<!--
.sFavorite{ behavior: url( #default#savefavorite ); }
//-->
</style>
<script language="JavaScript" type="text/javascript">
<!--

function loaded() {
/*@cc_on
if( oFavor.getAttribute( "favorites" ) != null )
alert( oFavor.getAttribute( "favorites" ) );
@cc_off @*/
}

function saved() {
oFavor.setAttribute( "favorites", "Пользователь перешел по ссылке в меню \"Избранное\"" );
alert( "Сайт добавлен пользователем через меню в избранное" );
}

//-->
</script>
</head>
<body>
<div class="sFavorite" onsave="saved()" onload="loaded()" id="oFavor"></div>
</body>
</html>


P.S. Читайте MSDN!

Вопрос: Можно ли запустить приложение из окна браузера с помощью html и javascript? При нажатии на ссылку запускается приложение?
PLOFFF

Ответ от Екатерины Ситченко: Можно используя ActiveX:



<html>
<head>
<title>execute</title>
<script language="JavaScript" type="text/javascript">
<!--
function MyExec() {
var WShell = new ActiveXObject("WScript.Shell");
WShell.Run( "notepad.exe" );
}
//-->
</script>
</head>
<body>
<input type="button" value="execute" OnClick="MyExec()">
</body>
</html>
Также можете ознакомиться с более кроссбраузерным примером и принять участие в его обсуждении:
http://www.javaportal.ru/forum/content.php?action=showans&tID=593&from=6

Вопросы присылайте на E-mail faq@javaportal.ru с пометкой "Вопрос по Java".
А лучше задавайте их в форуме.

Жду вопросов и предложений.

Юрий Ладик.


Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 11

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/books/show2b.php on line 19

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/books/show2b.php on line 30
Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Warning: mysql_connect() [function.mysql-connect]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 91

Warning: mysql_db_query() [function.mysql-db-query]: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_db_query() [function.mysql-db-query]: A link to the server could not be established in /pub/home/javaport/javaportal/news/worldnews.php on line 93

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /pub/home/javaport/javaportal/news/worldnews.php on line 95



Выпуск 29-й
Выпуск 28-й
Выпуск 27-й
Выпуск 26-й
Выпуск 25-й
Выпуск 24-й
Выпуск 23-й
Выпуск 22-й
Выпуск 21-й
Выпуск 20-й
Выпуск 19-й
Выпуск 18-й
Выпуск 17-й
Выпуск 16-й
Выпуск 15-й
Выпуск 14-й
Выпуск 13-й
Выпуск 12-й
Выпуск 11-й
Выпуск 10-й
Выпуск 9-й
Выпуск 8-й
Выпуск 7-й
Выпуск 6-й
Выпуск 5-й
Выпуск 4-й
Выпуск 3-й
Выпуск 2-й
Выпуск 1-й