Архив Java programming
Выпуск 5-й
Здравствуйте дорогие читатели!
Представляю вашему вниманию пятый номер рассылки 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 и наткнулся на такой вопрос Вот моё решение: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



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


