Здравствуйте дорогие читатели!
Представляю вашему вниманию пятый номер рассылки Java programming. Номер на редкость получился полный дискуссий, и я думаю, те, кто не вступил ещё в них, после прочтения номера не останется в стороне.
Сегодня рассылка пережила некоторую трансформацию, и теперь будет выглядеть следующим образом:
· Первая часть, - так же будет посвящена азам программирования на Java (раздел для начинающих).
· Вторая часть - в ней будет размещаться "тема на заказ", то есть будет рассмотрен тема которая, по вашему мнению, заслуживает внимания, детального рассмотрения, какого либо дополнительного обсуждения или будет нуждаться в дополнительных примерах.
· Третья часть - будет состоять всё из тех же ответов на вопросы.
· Четвёртая часть - будет состоять из советов специалистов, из интересных программных кодов.
· Пятая часть - в ней будут рассмотрены ваши предложения по реструктуризации рассылки, будут рассмотрены ваши предложения. Также в этой части будут проводиться некоторые опросы, конечно посвящённые данной тематике и данной рассылке.
Содержание
1. Начинающим2. Тема "на заказ"
3. Вопрос - ответ
4. Программный код…
5. JavaScript?
Начинающим
Базовые типы данных
В языке Java определено восемь базовых типов данных. Для каждого базового типа данных отводится конкретный размер памяти. Этот размер не зависит от платформы, на которой выполняется приложение Java:
Тип данных | Размер занимаемой области памяти | Значение по умолчанию |
boolean | 8 | false |
byte | 8 | 0 |
char | 16 | 'x0' |
short | 16 | 0 |
int | 32 | 0 |
long | 64 | 0 |
float | 32 | 0.0F |
double | 64 | 0.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 и наткнулся на такой вопрос Вот моё решение:Mimport 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