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




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


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

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

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

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

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




Rambler's Top100

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

Java programming выпуск 27-й

Здравствуйте дорогие читатели!

Уважаемые читатели!
На сегодняшний момент развитие сайта и рассылки затормозилось, чего бы мне не хотелось, но в связи с личными проблемами не могу в полную силу работать над сайтом. И по этому обращаюсь к вам с просьбой:
если у кого есть какие либо наработанные материалы по публикуемым темам на сайте, просьба не жадничать и высылать их незамедлительно!!! :)

Начинающим

Пакеты и интерфейсы

Пакет (package) — это некий контейнер, ко­торый используется для того, чтобы изолиро­вать имена классов. Например, вы можете со­здать класс List, заключить его в пакет и не думать после этого о возможных конфликтах, которые могли бы возникнуть если бы кто-ни­будь еще создал класс с именем List.

Интерфейс — это явно указанная спецификация набора методов, ко­торые должны быть представлены в классе, который реализует эту спе­цификацию. Реализация же этих методов в интерфейсе отсутствует. По­добно абстрактным классам интерфейсы обладают замечательным дополнительным свойством — их можно многократно наследовать. Кон­кретный класс может быть наследником лишь одного суперкласса, но зато в нем может быть реализовано неограниченное число интерфейсов.

Пакеты

Все идентификаторы, которые мы до сих пор использовали в наших примерах, располагались в одном и том же пространстве имен (name space). Это означает, что нам во избежание конфликтных ситуаций при­ходилось заботиться о том, чтобы у каждого класса было свое уникаль­ное имя. Пакеты — это механизм, который служит как для работы с пространством имен, так и для ограничения видимости. У каждого файла .java есть 4 одинаковых внутренних части, из которых мы до сих пор в наших примерах ис­пользовали только одну. Ниже приведена общая форма исходного файла Java.

одиночный оператор package (необязателен)
любое количество операторов import (необязательны)
одиночное объявление открытого (public) класса
любое количество закрытых (private) классов пакета (необязательны)

Оператор package

Первое, что может появиться в исходном файле Java — это оператор package, который сообщает транслятору, в каком пакете должны опре­деляться содержащиеся в данном файле классы. Пакеты задают набор раздельных пространств имен, в которых хранятся имена классов. Если оператор package не указан, классы попадают в безымянное пространст­во имен, используемое по умолчанию. Если вы объявляете класс, как принадлежащий определенному пакету, например,
package java.awt.image;
то и исходный код этого класса должен храниться в каталоге java/awt/image.

ЗАМЕЧАНИЕ

Каталог, который транслятор Java будет рассматривать, как корневой для иерархии пакетов, можно задавать с помощью переменной окру­жения СLASSPATH. С помощью этой переменной можно задать не­сколько корневых каталогов для иерархии пакетов (через ; как в обычном PATH).

Трансляция классов в пакетах

При попытке поместить класс в пакет, вы сразу натолкнетесь на жесткое требование точ­ного совпадения иерархии каталогов с иерархией пакетов. Вы не можете переименовать пакет, не переименовав каталог, в котором хранятся его классы. Эта трудность видна сразу, но есть и менее очевидная проблема.

Представьте себе, что вы написали класс с именем PackTest в пакете test. Вы создаете каталог test, помещаете в этот каталог файл PackTest.Java и транслируете. Пока — все в порядке. Однако при попытке запустить его вы получаете от интерпретатора сообщение «can't find class PackTest» («He могу найти класс PackTest»). Ваш новый класс теперь хранится в пакете с именем test, так что теперь надо указывать всю иерархию пакетов, разделяя их имена точками - test.PackTest. Кроме того Вам надо либо под­няться на уровень выше в иерархии каталогов и снова набрать «java test.PackTest», либо внести в переменную CLASSPATH каталог, который является вершиной иерархии разрабатываемых вами классов.

Оператор import

После оператора package, но до любого определения классов в исход­ном Java-файле, может присутствовать список операторов import. Паке­ты являются хорошим механизмом для отделения классов друг от друга, поэтому все встроенные в Java классы хранятся в пакетах. Общая форма оператора import такова:
import пакет1 [.пакет2].(имякласса|*);
Здесь пакет1 — имя пакета верхнего уровня, пакет2 — это необя­зательное имя пакета, вложенного в первый пакет и отделенное точкой. И, на­конец, после указания пути в иерархии пакетов, указывается либо имя класса, либо метасимвол звездочка. Звездочка означает, что, если Java-транслятору потребуется какой-либо класс, для которого пакет не указан явно, он должен просмотреть все содержимое пакета со звездочкой вмес­то имени класса. В приведенном ниже фрагменте кода показаны обе формы использования оператора import :
import java.util.Date

import java.io.*;

ЗАМЕЧАНИЕ

Но использовать без нужды форму записи оператора import с использованием звездочки не рекомендуется, т.к. это может значительно увеличить время трансляции кода (на скорость работы и размер программы это не влияет).

Все встроенные в Java классы, которые входят в комплект поставки, хранятся в пакете с именем java. Базовые функции языка хранятся во вложенном пакете java.lang. Весь этот пакет автоматически импортируется транслятором во все программы. Это эквивалентно размещению в начале каждой программы оператора
import java.lang.*;
Если в двух пакетах, подключаемых с помощью формы оператора im­port со звездочкой, есть классы с одинаковыми именами, однако вы их не используете, транслятор не отреагирует. А вот при попытке исполь­зовать такой класс, вы сразу получите сообщение об ошибке, и вам при­дется переписать операторы import, чтобы явно указать, класс какого пакета вы имеете ввиду.
class MyDate extends Java.util.Date { }

Ограничение доступа

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

  • Подклассы в том же пакете.
  • Не подклассы в том же пакете.
  • Подклассы в различных пакетах.
  • Классы, которые не являются подклассами и не входят в тот же пакет.

В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищен­ный), которые употребляются в различных комбинациях. Содержимое ячеек таблицы определяет доступность переменной с данной комбинацией модификаторов (столбец) из указанного места (строка).

 

 

private

модификатор отсутствует

private protected

protected

public

тот же класс

да

да

Да

да

да

подкласс в том же пакете

нет

да

Да

да

да

независимый класс в том же пакете

нет

да

Нет

да

да

подкласс в дру­гом пакете

нет

нет

Да

да

да

независимый класс в другом пакете

нет

нет

Нет

нет

да

На первый взгляд все это может показаться чрезмерно сложным, но есть несколько правил, которые помогут вам разобраться. Элемент, объ­явленный public, доступен из любого места. Все, что объявлено private, доступно только внутри класса, и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета. Именно такой уровень доступа используется в языке Java по умолчанию. Если же вы хотите, чтобы элемент был доступен извне пакета, но только подклассам того класса, которому он принадлежит, вам нужно объявить такой элемент protected. И наконец, если вы хотите, чтобы элемент был доступен только под­классам, причем независимо от того, находятся ли они в данном пакете или нет — используйте комбинацию private protected.

Ниже приведен довольно длинный пример, в котором представлены все допустимые комбинации модификаторов уровня доступа. В исходном коде первого пакета определяется три класса: Protection, Derived и SamePackage. В первом из этих классов определено пять целых переменных — по одной на каждую из возможных комбинаций уровня доступа. Переменной n приписан уровень доступа по умолчанию, n_pri — уровень private, n_pro — protected, n_pripro — private protected и n_pub — public. Во всех остальных классах мы пытаемся использовать переменные первого класса. Те строки кода, которые из-за ограничения доступа при­вели бы к ошибкам при трансляции, закомментированы с помощью однострочных комментариев (//) — перед каждой указано, откуда доступ при такой комбинации модификаторов был бы возможен. Второй класс — Derived — является подклассом класса Protection и расположен в том же пакете р1. Поэтому ему доступны все перечислен­ные переменные за исключением n_pri. Третий класс, SamePackage, расположен в том же пакете, но при этом не является подклассом Protection. По этой причине для него недоступна не только переменная n_pri, но и n_pripro, уровень доступа которой — private protected.


package р1; 
public class Protection
{ 

 int n = 1; 
 private int n_pri = 2; 
 protected int n_pro = 3; 
 private protected int n_pripro = 4; 
 public int n_pub = 5; 

 public Protection() 
 { 
  System.out.println("base constructor"); 
  System.out.println("n = " + n); 
  System.out.println("n_pri = " + n_pri); 
  System.out.println("n_pro = "  + n_pro); 
  System.out.println("n_pripro = " + n_pripro); 
  System.out.println("n_pub = " + n_pub); 
 }
} 

class Derived extends Protection 
{ 
 Derived() 
 { 
  System.out.println("derived constructor"); 
  System.out.println("n = " + n); 
  // только в классе 
  // System.out.println("n_pri = " + n_pri); 
  System.out.println("n_pro = "    + n_pro); 
  System.out.println("n_pripro = " + n_pripro); 
  System.out.println("n_pub = "    + n_pub); 
 }
} 

class  SamePackage 
{ 
 SamePackage() 
 { 
  Protection p = new Protection(); 
  System.out.println("same package constructor"); 
  System.out.println("n = " + p.n); 
  // только в классе 
  // System.out.println("n_pri = " + p.n_pri); 
  System.out.println("n_pro = " + p.n_pro); 
  // только в классе и подклассе 
  // System.out.println("n_pripro = " + p.n_pripro): 
  System.out.println("n_pub = " + p.n_pub): 
 } 
} 

В следующем номере мы рассмотрим Интерфейсы

Тема "на заказ"

После выхода 26 номера, меня сразу засыпали вопросами относительно сервлетов:
/java/examples/firstservlet.html
Но плавно, вся дискуссия свелась к JSP, я рекомендую всем интересующимся статьи:
/java/articles/Java_Server_Pages.html
/java/articles/jsp.html
/java/examples/filearchive.html

Попутно решая все вопросы, возник еще один как установить Tomcat в связке с Apache. При обсуждении этого вопроса появилась долгожданная статья «Установка и конфигурация веб сервера Apache с поддержкой PHP, JSP и MySQL на Windows XP»

Вопрос - ответ

Вопрос: Как можно заставит URLConnection работать чарез прокси?

Ответ: Необходимо указать свойства HTTP и FTP
Для HTTP:


http.proxyHost (default: )
http.proxyPort (default: 80 if http.proxyHost specified)
http.nonProxyHosts (default: )
Для FTP:

ftp.proxyHost (default: )
ftp.proxyPort (default: 80 if ftp.proxyHost specified)
ftp.nonProxyHosts (default: )

Вопрос: У меня проблема при пересылке с помощью JavaMail сообщения с content-type "text/html" (персылаю веб-страницу). В полученных сообщениях все что не ASCII-символы( весь русский текст) отображается как ??????? . В то же время при пересылке как текст - "text/plain" - все нормально (отображается не html страница а ее код, но символы кирилицы присутствуют).
Владимир

Ответ: /java/articles/ruschars/ruschars.html#javamail

Вопрос: Я неплохо программирую на pl/sql и на BC.Но запускать exe-приложения для доступа к базе данных как то некрасиво.Я хочу сделать так чтобы к базе можно было обратиться через браузер набрав адрес.Возможно это сделать с помощью Java .Или надо еще что то учить?
kellny

Ответ: Конечно можно используя платформу J2EE.

Вопрос: У меня как у новичка первое что приходит в голову при использовании классов библиотеки AWT , это использовать их напрямую , т. е. создавать на их основе объекты и послать им сообщения . Например что-бы вывести окно я пишу следующий код:


import java.awt.*; 
class Программа 
{ 
 public static void main(String a[])
 { 
  Frame окно=new Frame("Окно"); 
  окно.setSize(400,300); 
  окно.setVisible(true); 
 } 
} 
И во всех своих пока ещё не очень сложных программах я использую именно этот подход . Однако почти во всех примерах во многих книгах (да и здесь на сайте )при создании оконных программ исползуют наследование от класса Frame . Почему?

Ответ: Смотря что вы будете делать с этим окошком. Если нем будет куча элементов интерфейса, то лучше наследовать от Frame и прописывать туда элементы, чем делать это динамически.

Программный код…

Предлагаю вам ознакомиться со статьей, в которой вы вместе с автором напишите игру крестики-нолики для мобильного телефона.
/mobiljava/articles/javamobile.html

JavaScript

В разделе «JavaScript» на ваши вопросы отвечает Чайник

Вопрос: Есть альбом с уменьшенными картинками. При нажатии на них должно открываться новое окно (с параметрами toolbar=no, menubar=no, status=no, location=no)с соответствующими размерами (картинки имеют разные размеры). Как это можно сделать с помощью JavaScript, что бы окно динамически изменяло свои размеры под размеры соответствующей картинки.
lynx

Ответ:


 <html>
 <head>
  <title>Sample</title>
  <meta http-equiv="Content-type" content="text/html;charset=Windows-1251">
  <script language="JavaScript" type="text/javascript">
  <!--
    function view( ob, wid, hei )
    {     
      var name = ob.src;
      var z = name.lastIndexOf( "." );
      var ext = name.substr( z ); 
      name = name.substr( 0, z );
      name = name + "Full" + ext;
      window.open( name, "", "width="+wid+",height="+hei+",toolbar=no,menubar=no,statusbar=no,location=no" );
    }
  </script>
 </head>
 <body>
  <a href="javascript:void(0)"><img src="both.jpg" onClick="view( this, 20, 40 )"></a>
 </body>
</html>

Вопрос: Как заставить выполняться функцию на нажатие клафиши Enter? Причём, так, чтобы она выполнялась только при нажатии. Есть два поля ввода. При нажатии Enter, когда курсор находитьтся в первом поле, выскакивает сообщение "Один". Когда курсор во втором поле - сообщение "Два"....

Ответ:

Простейший пример для IE:


<html>
 <head>
  <title>RE: question from PLOFFF</title>
  <meta http-equiv="Content-type" content="text/html; charset=Windows-1251">
  <script language="JavaScript" type="text/javascript">
  <!--
   function keyEv( evt, child )
   {
     if( event.keyCode == 13 )
       child.name == "field1" ? alert( "field1" ) : alert( "field2" );  
   }
  //-->
  </script>
 <body>
  <form name="myForm">
   Поле 1:<input type="text" size="20" name="field1" onKeyPress="keyEv( event, this )"><br>
   Поле 2:<input type="text" size="20" name="field2" onKeyPress="keyEv( event, this )"><br>
  </form>
 </body>
</html>
p>Вопросы присылайте на E-mail [email protected] с пометкой "Вопрос по Java".
А лучше задавайте их на форуме.

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

Юрий Ладик.



"Программирование на персональном компьютере. Практическое руководство с примерами по языкам программирования высокого уровня - специальное издание"
Подробнее>>
Заказать>>


Марк Гранд
"Шаблоны проектирования в JAVA. Каталог популярных шаблонов проектирования, проиллюстрированных при помощи UML"
Подробнее>>
Заказать>>

Узнай о чем ты на самом деле сейчас думаешь тут.


[an error occurred while processing this directive]



Apache Struts 2.0.11
Apache MyFaces Trinidad Core 1.2.3.
Sun переводит мобильные устройства с Java ME на Java SE
Хакерская атака!



Выпуск 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-й