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




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


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

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

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

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

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




Rambler's Top100

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

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

Содержание

1. Начинающим
2. Тема "на заказ"
3. Вопрос - ответ
4. Программный код…
5. JavaScript

Начинающим

Сегодня в номере мы рассмотрим простые типы и их приведение.

Простые типы

В Java имеется восемь простых типов: byte, short, int, long, char, float, double и boolean.
byte, short, int и long - целые типы, предназначены для целых чисел со знаком.
float и double - типы с плавающей точкой, служат для представления чисел с дробной частью.
сhar - символьный тип, предназначен для представления элементов из таблицы символов.
boolean - логический тип, используется для представления логических величин.

В Java, в отличие от некоторых других языков, отсутствует автоматическое приведение типов. Несовпадение типов при трансляции приводит не к предупреждению, а к сообщению об ошибке.

Целые числа

byte

Тип byte - знаковый 8-битовый тип, его диапазон: от -128 до 127. Он лучше всего подходит для хранения произвольного потока байтов, загружаемого из сети или из файла.


byte a;
byte b = 0х11;
short

short - 16-битовый тип, его диапазон: от -32768 до 32767.


short a;
short b = 0x11aa;
int

Тип int служит для представления 32-битных целых чисел. Диапазон допустимых для этого типа значений: от -2147483648 до 2147483647. Этот тип данных используется для хранения обычных целых чисел со значениями, достигающими двух миллиардов. Этот тип прекрасно подходит для использования при обработке массивов и для счетчиков.


int a;
int b = 0x11aa0000;
long

Тип long предназначен для представления 64-битовых чисел со знаком. Его диапазон допустимых значений: от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807.


long a;
long b = Ох11аа000011аа0000;

На заметку: В Java не надо отождествлять разрядность целочисленного типа с занимаемым им количеством памяти та как исполняющий код Java может использовать для переменных то количество памяти, которое сочтет нужным.

Числа с плавающей точкой

Числа с плавающей точкой используются при вычислениях, в которых требуется использование дробной части. В Java реализован стандартный (IEEE-754) набор типов для чисел с плавающей точкой - float и double и операторов для работы с ними.

float

В переменных с обычной, или одинарной точностью, объявляемых с помощью ключевого слова float, для хранения вещественного значения используется 32 бита. Диапазон допустимых значений: от 32 3. 4е-038 до 3. 4е+ 038


float f1;
float f2 = 3. 14F;
double

В случае двойной точности, задаваемой с помощью ключевого слова double, для хранения значений используется 64 бита. Диапазон допустимых значений: от 64 1. 7е-308 до 1. 7е+ 308


double d;
double pi = 3. 14159265358979323846;

Приведение типа

Иногда возникают ситуации, когда у вас есть величина какого-то определенного типа, а вам нужно ее присвоить переменной другого типа. Для некоторых типов это можно проделать и без приведения типа, в таких случаях говорят об автоматическом преобразовании типов. В Java автоматическое преобразование возможно только в том случае, когда точности представления чисел переменной-приемника достаточно для хранения исходного значения. Такое преобразование происходит, например, при занесении литеральной константы или значения переменной типа byte или short в переменную типа int. Это называется расширением (widening) или повышением (promotion), поскольку тип меньшей разрядности расширяется (повышается) до большего совместимого типа. Размера типа int всегда достаточно для хранения чисел из диапазона, допустимого для типа byte, поэтому в подобных ситуациях оператора явного приведения типа не требуется. Обратное в большинстве случаев неверно, поэтому для занесения значения типа int в переменную типа byte необходимо использовать оператор приведения типа. Эту процедуру иногда называют сужением (narrowing), поскольку вы явно сообщаете транслятору, что величину необходимо преобразовать, чтобы она уместилась в переменную нужного вам типа. Для приведения величины к определенному типу перед ней нужно указать этот тип, заключенный в круглые скобки.


int a = 100;
byte b = (byte) a;

Автоматическое преобразование типов в выражениях

Когда вы вычисляете значение выражения, точность, требуемая для хранения промежуточных результатов, зачастую должна быть выше, чем требуется для представления окончательного результата.


byte a = 40;
byte b = 50;
byte с = 100;
int d = a* b / с;

Результат промежуточного выражения (а* b) вполне может выйти за диапазон допустимых для типа byte значений. Именно поэтому Java автоматически повышает тип каждой части выражения до типа int, так что для промежуточного результата (а* b) хватает места.

Автоматическое преобразование типа иногда может оказаться причиной неожиданных сообщений транслятора об ошибках. Например, показанный ниже код, хотя и выглядит вполне корректным, приводит к сообщению об ошибке на фазе трансляции. В нем мы пытаемся записать значение 50* 2, которое должно прекрасно уместиться в тип byte, в байтовую переменную. Но из-за автоматического преобразования типа результата в int мы получаем сообщение об ошибке от транслятора - ведь при занесении int в byte может произойти потеря точности.


byte b = 50;
b = b* 2;
^ Incompatible type for =. Explicit cast needed to convert int to byte. (Несовместимый тип для =. Необходимо явное преобразование int в byte)

Исправленный текст :


byte b = 50;
b = (byte) (b* 2);
что приводит к занесению в b правильного значения 100.

Если в выражении используются переменные типов byte, short и int, то во избежание переполнения тип всего выражения автоматически повышается до int. Если же в выражении тип хотя бы одной переменной - long, то и тип всего выражения тоже повышается до long.

Если выражение содержит операнды типа float, то и тип всего выражения автоматически повышается до float. Если же хотя бы один из операндов имеет тип double, то тип всего выражения повышается до double. По умолчанию Java рассматривает все литералы с плавающей точкой, как имеющие тип double.

Приведенная ниже программа показывает, как повышается тип каждой величины в выражении для достижения соответствия со вторым операндом каждого бинарного оператора.


class Promote 
{
 public static void main (String args []) 
 { 
  byte b = 42;
  char с = 'a';
  short s = 1024;
  int i = 50000;
  float f = 5.67f;
  double d =.1234;
  double result = (f* b) + (i/ c) - (d* s);
  System. out. println ((f* b)+ "+ "+ (i / с)+ " - " + (d* s));
  System. out. println ("result = "+ result);
 }
} 

Подвыражение f* b - это число типа float, умноженное на число типа byte. Поэтому его тип автоматически повышается до float. Тип следующего подвыражения i / с ( int, деленный на char) повышается до int. Аналогично этому тип подвыражения d* s (double, умноженный на short) повышается до double. На следующем шаге вычислений мы имеем дело с тремя промежуточными результатами типов float, int и double. Сначала при сложении первых двух тип int повышается до float и получается результат типа float. При вычитании из него значения типа double тип результата повышается до double. Окончательный результат всего выражения - значение типа double.

Символы

Поскольку в Java для представления символов в строках используется кодировка Unicode, разрядность типа char в этом языке - 16 бит. В нем можно хранить десятки тысяч символов интернационального набора символов Unicode. Диапазон типа char - 0..65536. Unicode - это объединение десятков кодировок символов, он включает в себя латинский, греческий, арабский алфавиты, кириллицу и многие другие наборы символов.


char c;
char c2 = Oxf132;
char c3 = ' a';
char c4 = '\n';

Хотя величины типа char и не используются, как целые числа, вы можете оперировать с ними так, как если бы они были целыми. Это дает вам возможность сложить два символа вместе, или инкрементировать значение символьной переменной. В приведенном ниже фрагменте кода мы, располагая базовым символом, прибавляем к нему целое число, чтобы получить символьное представление нужной нам цифры.


int three = 3;
char one = '1';
char four = (char) (three+ one);

В результате выполнения этого кода в переменную four заносится символьное представление нужной нам цифры - '4'. Обратите внимание - тип переменной one в приведенном выше выражении повышается до типа int, так что перед занесением результата в переменную four приходится использовать оператор явного приведения типа.

Тип boolean

В языке Java имеется простой тип boolean, используемый для хранения логических значений. Переменные этого типа могут принимать всего два значения - true (истина) и false (ложь). Значения типа boolean возвращаются в качестве результата всеми операторами сравнения, например (а < b).


boolean done = false;

В следующем номере мы рассмотрим массивы и многомерные массивы.

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

Создание и использование архивов Java

Предпосылкой для открытия данной темы послужило письмо Сергея Семенихина:
Хотелось бы поподробнее узнать на счет подписания jar файлов (в том числе и для аплетов, зачем нужны подписанные аплеты). Использование javakey утилиты, генерация ключей, их размещение, что есть MANIFEST что дает это подписание (какие новые возможности) и в конце концов, зачем оно все это надо. Я думаю, это будет интересно. Заранее спасибо.
Да действительно интересная, да и объёмная тема, но я попытаюсь рассказать вам как можно больше, но и постараюсь уложиться в два - три выпуска.

Зачем нужны JAR-архивы?

Использование JAR-архивов предоставляет разработчикам аплетов (а также и автономных приложений) ряд преимуществ.

  • Повышение эффективности загрузки. Вместо нескольких файлов отдельных классов загружается единственный файл JAR-архива.
  • Улучшенное хранилище файлов, так как файлы классов хранятся в одном сжатом файле архива.
  • Повышение защищённости. В JAR-файл можно поместить цифровую подпись, дающею конечному пользователю гарантии, что файл архива не изменился с момента её внесения. Если конечный пользователь доверяет вашей фирме, он может предоставить подписанным вами аплетам право доступа к его жестким дискам или другим важным ресурсам системы.
  • Независимость от платформы. Построение JAR-архивов базируется на использовании популярной программы PKZIP сжатия файлов. Однако JAR-файлы могут создаваться и сохраняться на любой компьютерной платформе.
  • Расширяемость. В спецификацию JAR-файлов внесены некоторые дополнения, обеспечивающие возможность дальнейших расширений.

Одно только повышение эффективности загрузки даёт какое преимущество! Если вы знакомы с работой протокола HTTP, то должны понимать насколько неэффективно, с его помощью, выполнять передачу нескольких небольших файлов. В каждом случае потребуется установить новое соединение TCP/IP, которое после передачи данного файла будет разорвано. Установка каждого соединения связана с дополнительной нагрузкой на сервер и сеть. При использовании коммутируемых линий связи среднее время установки TCP/IP-соединения может составлять около 0,5 c. Если для работы аплета необходимо 16 файлов, общее время затрачиваемое только на установку соединений - 8 с.

Создание JAR-архива

Для создания и модификации JAR-архивов можно использовать любую поддерживающую формат PKZIP программу. JAR-файл отличается от zip-файла наличием дополнительного текстового файла, называемого файлом описания (manifest file). Этот файл содержит сведения обо всех помещённых в данный архив файлах. В состав файла описания должны входить определённые элементы, в частности он должен включать следующие.

  • Номер версии стандарта JAR. В соответствии, с которым построен данный архив. Этот номер задаётся параметром Manifest-Version и является обязательным. В SDK 1.2 значение этого параметра должно быть равно 1.0
  • Минимальный номер версии утилиты JAR, которая сможет прочитать этот архив. Этот параметр необязателен и имеет название Required-Version.
  • Отдельная запись для любого, помещённого в архив файла. Необязательно перечислять все помещённые в архив файлы, достаточно указать только файлы главных классов.

Фирма Sun предоставила, для создания JAR архивов, специализированный инструмент для всех поддерживаемых платформ. Рассмотрим создание JAR-архива с помощью этой утилиты под названием jar.

Предположим, что у нас имеется каталог, содержащий несколько файлов типа .class и подкаталог с именем images содержащий несколько файлов типа .gif. Пусть имя создаваемого архива будет archive.jar

Общий формат команды вызова утилиты jar: jar параметры имена_файлов

Параметр имена_файлов представляет собой список имён файлов, первым в котором всегда указывается имя самого архивного файла. Назначение остальных имён файлов зависит от ключей:

c
- создать новый архив.
m
- использовать внешний файл описания, имя которого указано вторым в списке имена_файлов.
M
- не создавать файл описания.
t
- вывести содержание указанного архивного.
x
- извлечь файлы, указанные в списке имена_файлов. Если имена не указаны, то извлечь все файлы.
f
- указывает, что имя архивного файла помещено первым в списке имена_файлов.
v
- указывает, что утилита должна сопровождать сообщениями выполнение всех действий, заданных другими параметрами.
0
- сохранение файлов в архиве выполняется без их сжатия.
u
- указывает, что нужно обновить указанные файлы. Или в случае команды jar umf manifest имя_архива указывает что нужно обновить информацию в файле описания.
-i
- указывает, что необходимо сгенерировать файл INDEX.LIST содержащий информацию о всех файлах архива.

И так для создания нового архива введите:
jar cf archive.jar .class images/.gif

В следующим номере мы рассмотрим помещение в JAR-архив цифровой подписи.

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

Вопрос:
1. Где можно скачать компилятор Java? Или он очень большой?
2. Можно ли на Java сделать такие вещи, как форум, рассылка, почтовый робот и т.п. Или все кончится только красивыми всплывающимися меню и часами?
Achkasov

Ответ:
1. Насчет JDK(или SDK) я говорил в шестом номере, но на всякий случай привожу ссылку для Microsoft Windows
. j2sdk-1_3_1_02-win.exe = 44,495,461 байт.
2. Конечно, на Java можно написать всё что душе угодно. Java мощнейший язык программирования с огромными возможностями.

Вопрос:
1. Ваше толкование терминов ООП: инкапсуляция, полиморфизм, наследование. Особенно интересует полиморфизм. Никак не могу врубиться в суть этого термина.
2. Где можно найти пример кода на Java, реализующий раскрывающиеся списки, наподобие проводника Windows (вложенные папки раскрываются, когда нажимаешь на + и закрываются, при нажатии на -
3. Есть ли бесплатные среды разработки на Java (в том числе визуальные), и где их можно скачать.
Александр.

Ответ:
1. Полиморфизм - концепция, утверждающая, что экземпляры производных классов при необходимости могут представить себя как экземпляр их базового класса. То есть вместо родительского класса можно использовать любой производный от него класс.
Наследование - когда объявляется что один класс происходит от другого, класс потомка наследует все методы типа public и protected, а также экземпляры переменных предка.
Инкапсуляция - объединение данных и алгоритмов их обработки в общий скрытый объект, который содержит поля данных (определяющих свойства или атрибуты объекта) и описания процедур и функций (определяющих поведение объекта).
2. Код примера помещаю в раздел "Программный код".
3. Об инструментах разработки я упоминал уже в том же шестом номере, но всё же я посоветую для начинающих JCreator, его можно взять здесь http://www.jcreator.com

Вопрос:
Где можно скачать оригинальный хелп (сановский doc к jdk), с сайта сана никак не могу вообще ничего стянуть:( Буду очень благодарен за ссылку в зоне ру.
Vadim

Ответ:
В зоне ру оригиналов хелпа не встречал, но прямую ссылку на сайте Sun дать могу ftp://ftp.javasoft.com/docs/tutorial.zip Или вот страничка http://java.sun.com/docs/books/tutorial/information/download.html

Вопрос:
Мне интересно какой из Java-редакторов(если есть таковые) прост для начинающего и понятен, но в то же время мощный и с гибкими настройками, как для профессионалов? И где таковой можно достать?
Саня

Ответ:
JBuilder5

Хотя вот предлагаю список визуальных средст разработки выбирайте сами:

Был неплохой инструмент Java WorkShop 2.0 (SUN Microsystems) но сейчас проект прикрыли и бросили все силы на Forte for Java http://www.sun.com/forte/ffj/buy.html

JBuilder 6.0 http://www.borland.com/jbuilder/

VisualAge for Java 4.0 (IBM)http://www-3.ibm.com/software/ad/vajava/

Cosmo Code 2.5 (Cosmo Software) http://www.cosmo.sgi.com/products/studio/code/

Visual Cafe for Java (Symantec) http://www.symantec.com отдали WebGain http://www.webgain.com/products/visual_cafe/

Visual J++ 6.0 (Microsoft) или теперь Microsoft Visual J# .NET Правда у них проблемы с совместимостью. http://msdn.microsoft.com/downloads/default.asp?URL=/downloads/sample.asp?url=/msdn-files/027/001/898/msdncompositedoc.xml

PowerJ 2.0 (Sybase) http://www.sybase.com/products/internetappdevttools/powerj

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

Приведу два примера созданных с помощью двух инструментов разработки JBuilder 5 и JСreator при помощи имеющихся стандартных заготовок application.

В JBuilder 5

Создаются два файла: класс содержащий метод main - Application1 и класс FrameTree

Application1


package sampletree;
import javax.swing.UIManager;
import java.awt.*;
public class Application1
{
 boolean packFrame = false;
 public Application1()
 {
  FrameTree frame = new FrameTree();
  if (packFrame)
  {
   frame.pack();
  }
  else
  {
   frame.validate();
  }
  Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
  Dimension frameSize = frame.getSize();
  if (frameSize.height > screenSize.height)
  {
   frameSize.height = screenSize.height;
  }
  if (frameSize.width > screenSize.width)
  {
   frameSize.width = screenSize.width;
  }
  frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
  frame.setVisible(true);
 }
 public static void main(String[] args)
 {
  try
  {
   UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  new Application1();
 }
}

FrameTree


package sampletree;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class FrameTree extends JFrame
{
 DefaultMutableTreeNode level0 =  new DefaultMutableTreeNode("Корень дерева");
 JTree jt = new JTree(level0);

 public FrameTree()
 {
  enableEvents(AWTEvent.WINDOW_EVENT_MASK);
  try
  {
   init();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }
 private void init() throws Exception
 {
  this.setSize(new Dimension(400, 300));
  this.setTitle("Tree Sample");
  DefaultMutableTreeNode level1a;
  DefaultMutableTreeNode level1b;
  DefaultMutableTreeNode level1c;
  level1a = new DefaultMutableTreeNode("Первая ветвь");
  DefaultMutableTreeNode level1a_1=new DefaultMutableTreeNode("Ветвь первой ветви");
  level1a_1.add(new DefaultMutableTreeNode("Отросточек"));
  level1a.add(level1a_1);
  level1a.add(new DefaultMutableTreeNode("Отросточек"));
  level0.add(level1a);
  level1b = new DefaultMutableTreeNode("Вторая ветвь");
  DefaultMutableTreeNode level1b_1=new DefaultMutableTreeNode("Первая ветвь второй ветви");
  level1b_1.add(new DefaultMutableTreeNode("Первый отросточек"));
  level1b_1.add(new DefaultMutableTreeNode("Второй отросточек"));
  level1b.add(level1b_1);
  DefaultMutableTreeNode level1b_2=new DefaultMutableTreeNode("Вторая ветвь второй ветви");
  level1b_2.add(new DefaultMutableTreeNode("Отросточек"));
  level1b.add(level1b_2);
  level0.add(level1b);
  level1c = new DefaultMutableTreeNode("Отросточек");
  level0.add(level1c);
  this.getContentPane().add(jt);
 }
 protected void processWindowEvent(WindowEvent e)
 {
  super.processWindowEvent(e);
  if (e.getID() == WindowEvent.WINDOW_CLOSING)
  {
   System.exit(0);
  }
 }
}

В JСreator

Всё делается в одном файле:


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
class TreeSample extends JFrame
{
 DefaultMutableTreeNode level0 =  new DefaultMutableTreeNode("Корень дерева");
 JTree jt = new JTree(level0);
 public TreeSample() 
 {
  addWindowListener(new WindowAdapter()
  {
   public void windowClosing(WindowEvent e)
   {
    dispose();
    System.exit(0);
   }
  });
  init();
 }
 public static void main(String args[])
 {
  System.out.println("Starting TreeApplic...");
  TreeSample mainFrame = new TreeSample();
  mainFrame.setSize(400, 300);
  mainFrame.setTitle("Tree sample");
  mainFrame.setVisible(true);
 }
 public void init()
 {
  this.setSize(new Dimension(400, 300));
  this.setTitle("Tree Sample");
  DefaultMutableTreeNode level1a;
  DefaultMutableTreeNode level1b;
  DefaultMutableTreeNode level1c;
  level1a = new DefaultMutableTreeNode("Первая ветвь");
  DefaultMutableTreeNode level1a_1=new DefaultMutableTreeNode("Ветвь первой ветви");
  level1a_1.add(new DefaultMutableTreeNode("Отросточек"));
  level1a.add(level1a_1);
  level1a.add(new DefaultMutableTreeNode("Отросточек"));
  level0.add(level1a);
  level1b = new DefaultMutableTreeNode("Вторая ветвь");
  DefaultMutableTreeNode level1b_1=new DefaultMutableTreeNode("Первая ветвь второй ветви");
  level1b_1.add(new DefaultMutableTreeNode("Первый отросточек"));
  level1b_1.add(new DefaultMutableTreeNode("Второй отросточек"));
  level1b.add(level1b_1);
  DefaultMutableTreeNode level1b_2=new DefaultMutableTreeNode("Вторая ветвь второй ветви");
  level1b_2.add(new DefaultMutableTreeNode("Отросточек"));
  level1b.add(level1b_2);
  level0.add(level1b);
  level1c = new DefaultMutableTreeNode("Отросточек");
  level0.add(level1c);
  this.getContentPane().add(jt);
 }
}

JavaScript

Вопрос:
Как узнать размеры окна браузера?
Андрей

Ответ:


function getWindowWidth() 
{ 
if (document.all) return document.body.clientWidth; 
if (document.layers) return innerWidth; 
return 800 
}

function getWindowHeight() 
{ 
if (document.all) return document.body.clientHeight; 
if (document.layers) return innerHeight; 
return 800 
}

Вопрос:
Почему document.write() открывает новое окно вместо того, чтобы писать в текущем окне?

Ответ:
Как только документ завершает загрузку, вы не можете использовать document.write()

Вопрос:
Нужно сделать двойное выпадающее меню, в первом выбирается, скажем, месяц, во втором - в зависимости от выбора в первом - день. Таким образом, нужно как-то связать первое меню со вторым. И по нажатию кнопки переходить на нужную страничку. Как это реализовать наиболее изящно и просто?
ФуксЪ

Ответ:
Вот получилось /javascript/examples/dynamicmenu.html

Вопросы присылайте на E-mail [email protected] с пометкой "вопрос по Java".

Жду вопросов и предложений.
Юрий Ладик.

Подписаться на эту рассылку можно тут /subs/subs.html


Дирк Льюис, Петер Мюллер
"Java 2"
Подробнее>>
Заказать>>


Марк Гранд
"Шаблоны проектирования в 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-й