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




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


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

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

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

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

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




Rambler's Top100

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

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

Представляю вашему вниманию пятый номер рассылки Java programming. Номер на редкость получился полный дискуссий, и я думаю, те, кто не вступил ещё в них, после прочтения номера не останется в стороне. Сегодня рассылка пережила некоторую трансформацию, и теперь будет выглядеть следующим образом:
· Первая часть, - так же будет посвящена азам программирования на Java (раздел для начинающих).
· Вторая часть - в ней будет размещаться "тема на заказ", то есть будет рассмотрен тема которая, по вашему мнению, заслуживает внимания, детального рассмотрения, какого либо дополнительного обсуждения или будет нуждаться в дополнительных примерах.
· Третья часть - будет состоять всё из тех же ответов на вопросы.
· Четвёртая часть - будет состоять из советов специалистов, из интересных программных кодов.
· Пятая часть - в ней будут рассмотрены ваши предложения по реструктуризации рассылки, будут рассмотрены ваши предложения. Также в этой части будут проводиться некоторые опросы, конечно посвящённые данной тематике и данной рассылке.

Содержание

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

Начинающим

Базовые типы данных

В языке Java определено восемь базовых типов данных. Для каждого базового типа данных отводится конкретный размер памяти. Этот размер не зависит от платформы, на которой выполняется приложение Java:

Тип данныхРазмер занимаемой области памятиЗначение по умолчанию
boolean8false
byte80
char16'x0'
short160
int320
long640
float320.0F
double640.0D

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

int i= 8;
или
int i;
i = 8;

Переменные типа boolean могут находиться только в двух состояниях - true и false, причем эти состояния никаким образом нельзя соотнести с целыми значениями. Вы не можете, как это было в языке С, выполнить преобразование типа boolean, например, к типу int - компилятор выдаст сообщение об ошибке.
Переменная типа byte занимает восемь бит памяти и про нее больше нечего сказать. Что же касается типа char, то он используется для хранения символов в кодировке UNICODE. Эта кодировка позволяет хранить национальные наборы символов, что очень удобно для интернациональных приложений, предназначенных для работы в Internet. Переменные типа byte, short, int и long являются знаковыми. В языке Java нет без знаковых переменных, как это было в языке С.
Приложение Java может оперировать числами в формате с плавающей точкой, определенным в спецификации IEEE 754. Тип float позволяет хранить числа с одинарной точностью, а формат double - с двойной.

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

Данная часть рассылки была введена, благодаря Simon. Он предложил просто рассмотреть интересующую его тему - RMI. И я с ним вынужден был согласиться, так как дожидаться этой темы в разделе "начинающим" пришлось бы долго. В этом выпуске я лишь только объясню, что такое RMI, а в последующих выпусках мы детально рассмотрим этот вопрос и попробуем написать программу сервер и программу клиент.

Что такое RMI?

При использовании Java программ в Internet может возникнуть необходимость вызвать из приложения, работающего на одном компьютере, метод, который принадлежит объекту, расположенному на другом компьютере.
Вызов удаленных методов (RMI - Remote Method Invocation) обеспечивает средства коммуникации между Java программами.
Важная особенность RMI заключается в том, что он представляет программируемый интерфейс для работы с сетями в отличие от сокетов TCP. Главное преимущество его в том, что он предлагает вам интерфейс более высокого уровня, основанный на вызовах методов, так, как если бы удаленный объект обрабатывался локально. RMI более удобен и более естественен, чем интерфейс, основанный на сокетах, но он требует выполнения Java-программ на обоих концах соединения. Сетевое соединение, тем не менее, достигается использованием все того же TCP/IP протокола.

Как работает RMI

Вы определяете Java-интерфейс, чтобы описать каждый объект, который будет дистанционно разделяем, и перечисляете общие методы, которые могут быть вызваны для объекта. Сервер будет использовать RMI-интерфейс и создаст объекты для вызова, специальным образом зарегистрированные и доступные для вызова по URL-основанной схеме, например:
rmi://localhost/LookupServer
Клиент, используя эту запись, будет пытаться отыскать объект с данным именем, и получить удаленную ссылку к нему. Затем вызванный метод будет обработан с помощью RMI компилятора и преобразован из пользовательского кода в последовательную форму объекта, который передается пользователю с помощью TCP/IP.

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

Вопрос:
Возможна ли в Java перегрузка операторов?Если да, то как это можно сделать?
Lipin Dmitry

Ответ:
Java не поддерживает перегрузки операторов. Разработчики просто не сочли эту возможность достаточно важной, но перегрузка методов в Java осталась.

Вопрос:
Перечислите события мышки……???
Tatiana.

Ответ:
protected MouseListener sMouseL;
protected MouseMotionListener sMouseML;
sMouseL=new MouseAdapter()
{
public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseClicked(MouseEvent e){} }; sMouseML= new MouseMotionAdapter() {
public void mouseMoved(MouseEvent e){} public void mouseDragged(MouseEvent e){} };

Вопрос:
Я слышал что существуют процессоры с вшитой виртуальной машиной Java, так ли это?

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

Вопрос:
В номере 4 был такой ответ:
Runtime r = Runtime. getRuntime();
Process p = null;
String cmd[] = {"notepad.exe"};
try {p = r.exec(cmd);}
catch (Exception ee) {}
Разве String cmd[] = new String[] {"notepad.exe"}; в место String cmd[] = {"notepad.exe"};будет не правильнее?
SMS.

Ответ:
Возможен и такой вариант, всё зависит от вашего стиля.

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

Как-то раз я бродил по конференции посвящённой Java и наткнулся на такой вопрос Вот моё решение:M
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.util.*;
public class Applet1 extends Applet {
  boolean isStandalone = false;
  JButton jButton1 = new JButton("Открыть всплывающее окно");
  TransparentPanel tp = new TransparentPanel(0.5f,Color.red);
  JPanel p=new JPanel();
  XYLayout xYLayout1 = new XYLayout();
  JButton jButton2 = new JButton("Закрыть всплывающее окно");
  public String getParameter(String key, String def) {
    return isStandalone ? System.getProperty(key, def) :
      (getParameter(key) != null ? getParameter(key) : def);
  }
  public Applet1() {
  }
  public void init() {
    try {
      jbInit();
    }
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  private void jbInit() throws Exception {
    jButton1.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jButton1_actionPerformed(e);
      }
    });
    jButton2.addActionListener(new java.awt.event.ActionListener() {
      public void actionPerformed(ActionEvent e) {
        jButton2_actionPerformed(e);
      }
    });
    this.setLayout(xYLayout1);
    tp.setVisible(false);
    add(tp,new XYConstraints(0, 0,200,200));
    add(jButton1,  new XYConstraints(0,0, -1, -1));
    this.add(jButton2,   new XYConstraints(0,210,-1,-1));
    this.add(p);
  }
  public String getAppletInfo() {
    return "Applet Information";
  }
  public String[][] getParameterInfo() {
    return null;
  }
  void jButton1_actionPerformed(ActionEvent e) {
   tp.setVisible(true);
  }
  void jButton2_actionPerformed(ActionEvent e) {
   tp.setVisible(false);
  }
}
class TransparentPanel extends JComponent
{
 private  float transparentPercent=1;
 private  Color colorPanel=Color.blue;
 public TransparentPanel(float transparentPercent,Color colorPanel)
 {
  this.colorPanel=colorPanel;
  this.transparentPercent=transparentPercent;
  addMouseListener(new MouseAdapter(){});
 }
 public void paintComponent(Graphics g)
 {
  Graphics2D g2=(Graphics2D)g;
  g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,transparentPercent));
  g2.setColor(colorPanel);
  g2.fillRect(0,0,getWidth(),getHeight());
 }
}
class XYConstraints implements Cloneable, java.io.Serializable
{
  int x;
  int y;
  int width;       // <= 0 means use the components's preferred size
  int height;      // <= 0 means use the components's preferred size
  public XYConstraints() {
    this(0, 0, 0, 0);
  }
  public XYConstraints(int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
  }
  public int  getX() { return x; }
  public void setX(int x) { this.x = x; }
  public int  getY() { return y; }
  public void setY(int y) { this.y = y; }
  public int  getWidth() { return width; }
  public void setWidth(int width) { this.width = width; }
  public int  getHeight() { return height; }
  public void setHeight(int height) { this.height = height; }
  public int hashCode() {
    return x ^ (y*37) ^ (width*43) ^ (height*47);
  }
  public boolean equals(Object that) {
    if (that instanceof XYConstraints) {
      XYConstraints other = (XYConstraints)that;
      return other.x == x && other.y == y && other.width == width && other.height == height;
    }
    return false;
  }
  public Object clone() {
    return new XYConstraints(x, y, width, height);
  }
  public String toString() {
    return "XYConstraints[" + x + "," + y + "," + width + "," + height + "]";
  }
}
class XYLayout implements LayoutManager2, java.io.Serializable
{
  private static final long serialVersionUID = 200L;

  int width;           // <= 0 means use the container's preferred size
  int height;          // <= 0 means use the container's preferred size
  public XYLayout() {}
  public XYLayout(int width, int height) {
    this.width  = width;
    this.height = height;
  }
  public int getWidth() { return width; }
  public void setWidth(int width) { this.width = width; }
  public int getHeight() { return height; }
  public void setHeight(int height) { this.height = height; }
  public String toString() {
    return "XYLayout" + "[width=" + width + ",height=" + height + "]";
  }
  public void addLayoutComponent(String name, Component component) {
  }

  public void removeLayoutComponent(Component component) {
    info.remove(component);
  }
  public Dimension preferredLayoutSize(Container target) {
    return getLayoutSize(target, true);
  }
  public Dimension minimumLayoutSize(Container target) {
    return getLayoutSize(target, false);
  }
  public void layoutContainer(Container target) {
    Insets insets = target.getInsets();
    int count = target.getComponentCount();
    for (int i = 0 ; i < count; i++) {
      Component component = target.getComponent(i);
      if (component.isVisible()) {
        Rectangle r = getComponentBounds(component, true);
        component.setBounds(insets.left + r.x, insets.top + r.y, r.width, r.height);
      }
    }
  }
  public void addLayoutComponent(Component component, Object constraints) {
    if (constraints instanceof XYConstraints)
      info.put(component, constraints);
  }
  public Dimension maximumLayoutSize(Container target) {
    return new Dimension(Integer.MAX_VALUE, Integer.MAX_VALUE);
  }
  public float getLayoutAlignmentX(Container target) {
    return 0.5f;
  }
  public float getLayoutAlignmentY(Container target) {
    return 0.5f;
  }
  public void invalidateLayout(Container target) {}
  Hashtable info = new Hashtable();
  static final XYConstraints defaultConstraints = new XYConstraints();
  Rectangle getComponentBounds(Component component, boolean doPreferred) {
    XYConstraints constraints = (XYConstraints)info.get(component);
    if (constraints == null)
      constraints = defaultConstraints;
    Rectangle r = new Rectangle(constraints.x, constraints.y, constraints.width, constraints.height);
    if (r.width <= 0 || r.height <= 0) {
      Dimension d = doPreferred ? component.getPreferredSize() : component.getMinimumSize();
      if (r.width <= 0)
        r.width = d.width;
      if (r.height <= 0)
        r.height = d.height;
    }
    return r;
  }
  Dimension getLayoutSize(Container target, boolean doPreferred) {
    Dimension dim = new Dimension(0, 0);
    if (width <= 0 || height <= 0) {
      int count = target.getComponentCount();
      for (int i = 0; i < count; i++) {
        Component component = target.getComponent(i);
        if (component.isVisible()) {
          Rectangle r = getComponentBounds(component, doPreferred);
          dim.width  = Math.max(dim.width , r.x + r.width);
          dim.height = Math.max(dim.height, r.y + r.height);
        }
      }
    }
    if (width > 0)
      dim.width = width;
    if (height > 0)
      dim.height = height;
    Insets insets = target.getInsets();
    dim.width += insets.left + insets.right;
    dim.height += insets.top + insets.bottom;
    return dim;
  }
}

Так как не у каждого, я думаю, есть JBuilder, было принято решение классы XYConstraints и XYLayout позаимствовать из JBuilder. Само решение как видите не ёмкое.

JavaScript?

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

< a href="#" 
  onClick="parent.нужный фрейм.location.href='1.html'  
  document.link1.src='image//b2_1.gif'">
< img name="link1" src="image//b1_1.gif" border="0">< /a>

Дорогие читатели я хотел бы спросить у вас нужно ли включить JavaScript в эту рассылку?
Если да, то пришлите письмо на E-mail [email protected] с пометкой "Да JavaScript нужен". И по возможности пришлите вопрос по JavaScript.
Если нет, то пришлите письмо на E-mail [email protected] с пометкой "JavaScript не нужен".
За ранее вам спасибо.

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

Жду вопросов и предложений.
Юрий Ладик.
Подписаться на эту рассылку можно тут /subs/subs.html



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


Р. Р. Мухамедзянов
"Серверные приложения на языке Java"
Подробнее>>
Заказать>>

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


[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-й