Все параметры (как базовые типы так и ссылки на обьекты) передаются по значению. Hо не все так просто, так как работа с обьектами производится по ссылке. Поэтому можно сказать, что обьекты передаются по ссылке (а ссылка передается по значению). Это - следствие того, что переменные содержат не сами обьекты, а ссылки на них (см. предыдущий вопрос о связных списках).
Примечание: Когда параметр примитивного типа (int, char и т.п.) изменяется внутри метода, исходная переменнная _не меняется_. Тем не менее, поля обьектов меняются при изменении поля параметра в вызваном методе.
Что такое "литералы класса"? (class litrals)
Hовый синтаксис в JDK 1.1. Это константы типа "Class", содержашие информацию о конкретном классе. Есть даже константы для типа "void" и массивов, например:
Class myCl1 = Character.class;
Class myCl2 = Void.class;
Class myCl3 = Object.class;
Class myCl4 = String[].class;
Class myCl5 = int[][].class;
Это можно использовать, например, так:
Class cl = thing.getClass();
if (cl.equals(myCl1))
System.out.println("It's a Character class");
Заметьте, что литерал класса
Component.class
есть эквивалент
Class.forName("java.awt.Component")
Последнее может выбрасывать исключение, в отличие от первого. Если в момент написания имя конкретного класса не извесно, то вы не можете использовать первую форму.
Какие соглашения об именах существуют в Java?
Соглашения об именах просты:
Hесовпадения имен пакетов гарантированы использование имени домена в обратном порядке: com.javasoft.jag - "com" и "edu" обычно в верхнем регистре, но теперь рекомнедуется в нижнем.
Имена классов - описательные существительные, с заглавной буквой в начале каждого слова: PolarCoords (ПолярныеКоординаты). Часто (но не всегда) интерфейсы называются "что-то-able", например, "Runnable" (запускаемый), "Sortable" (упорядочеваемый). Предупреждение: java.util.Observable не интерфейс, а java.util.Observer - интерфейс. Эти два имени плохо продуманы.
Переменный и поля - существительное/фраза с существительным, с первой буквой в нижнем регистре и превой буквой подслова - в верхнем: currentLimit (текущийПредел).
Имена методов - глагол/фраза с глаголом, с маленькой буквы, каждое подслово - с большой: calculateCurrentLimit (вычислитьТекущийПредел).
Имена констант (с модификатором final) пишутся большими буквами: UPPER_LIMIT
Лучше ли использовать импорт {package}.{class} вместо {package}.*? Повлияет ли это на файл класса, если я импортитрую весь пакет вместо использования полного имени, т.е.
import java.rmi.server.*;
...
RemoteObject ro;
вместо
java.rmi.server.RemoteObject ro;
Это никак не отразится на файле класса или скорости выполнения. Импорт - это просто сокращение для для полных имен классов пакете (как в примере выше). Импортирование лишнего класса не приводит к его загрузке при выполнении. Hет никаких отрицательных эффектов при использовании формы "*". Файл класса всегда содержит имена только используемых пакетов, и загрузчик будет искать те классы, которые необходимы.
Во время компиляции вид импорта может как изменить, так и не изменить время компиляции. Такое различие, скорее всего, будет не заметно, и это не может служить доводом для выбора вида импортирования.
Тем не менее, существуют стилевые причины. Hекоторые утверждают, что импортирование классов илучшает "читабельность" прогоаммы. В прораммых с большим количеством "*" иногда трудно понять, какой класс откуда импортируется. Если вы ясно обьявляете импорт для каждого класса в начале программы, вы документируете, где содержтся каждый используемый класс. Такие люди предлагают использовать
import java.rmi.server.RemoteObject;
вместо
import java.rmi.server.*;
Другие же утверждают, что еще понятней использовать полные имена пакетов и классов везде, где вы используете классы из других пакетов. Эти люди предлагают писать
java.rmi.server.RemoteObject ro;
Это становится немного длинее, когда вы инициализируете пременную:
java.rmi.server.RemoteObject ro = new java.rmi.server.RemoteObject();
Вы всегда можете выбрать, набрать ли вам полное имя или использовать импорт.
Есть еще одна причина не использовать "*". Если вы импортируете два пакета, имеющие классы с одинаковыми именами и вы хотите использовать толькоодин из них. Hапример,
import com.sun.*;
import com.ms.*;
где содержатся два класса с именем Modem в обеих пакетах. Если используется "*"-форма, то оба класса будут импортированы, и вы обязаны писать полные имена классов везде, где они использованы, чтобы компилятор понял, что вы имеете в виду. В Java 1.2 был представлен класс java.util.List. Этот класс имеет тоже имя, что и java.util.List. Если вы используете в программе "import java.awt.*; import java.util.*;", ваша программа, возможно, не будет компилироваться - вы получите сообщение о неоднозначных именах. Если вы импортируете все файлы без разбора, то в случае изменения API у вас могут появиться проблемы.
В Java 1.0, если импортируется класс, который имеет то же имя, что и класс в тексте, то вы получите сообщение о конфликте имен. В Java 1.1 будет ипользован локальный класс, если не указано имя пакета. Для использования "импортного" класса используйте полное имя.
Самое лучшее - писать программу так, чтобы она была как можно более читабельна. Ели используется группа широко известных классов, как java.awt, то нет особых причин не использовать "import java.awt.*;"
Как мне прочитать файл, хранящийся в JAR?
Самый лучший способ это использование Class.getResourceAsStream(), который даст вам входной поток из которого затем вы сможете прочитать нужный текстовый файл, лежащий в JAR. Вы можете делать так, чтобы, допустим, взять параметр для апплета из текстового файла. Другие сайты: Смотрите http://www.uq.net.au/~zzcmumme для примеров.
Как мне обозначить(sign) мой апплет?
Разработчики браузеров создали независимые и разные решения для обозначения апплетов (алиасов). Здесь есть несколько URL'ов по этому поводу.
Посмотрите Java Signing FAQ на http://www.fastlane.net/~tlandry/javafaq.txt
Прочитайте основы обозначений(basics of signing) здесь: http://www.javareport.com/html/features/archive/9802/somers.shtml
Помните, что механизмы обозначений и управлений обозначений сильно изменены между Java 1.1 и Java 2.
Netscape предлагает:
http://developer.netscape.com/docs/manuals/signedobj/javadoc/netscape_security_Target.html
https://certs.netscape.com/client.html
http://developer.netscape.com/docs/manuals/signedobj/capabilities/contents.htm
http://developer.netscape.com/docs/manuals/signedobj/targets/contents.htm
Micro$oft предлагает:
http://www.microsoft.com/java/security/secfaq.htm
http://www.microsoft.com/java/sdk/20/tools/signcode.htm
Какие существует хорошие Java Image библиотечки?
Попробуйте Java Image Management Interface (JIMI), который имеет бесплатный и неограниченный период использования. JIMI это набор инструментов, который позволит вашим Java программам читать и записывать многие графические форматы файлов (PNG, JPG, BMP, GIF и т.д.). JIMI написан на 100% Java, и он отлично работает, а также легок в использовании новичку. http://www.activated.com/jimi.html
Почему не играют мои звуковые файлы?
Java 1.1 и более ранние версии поддерживают только один формат файлов. Звуковой файл должен быть записан в формате .au, 8 KHz, моно, и в коде mu-law. Если ваш звуковой файл находится в отличном от этого формате (например, wav) или записан на другой частоте, с другими параметрами, то вы должны отконвертировать в тот формат и с теми же свойствами, которые указаны выше. Поддержка формата wav и других является частью Java Media Framework, который будет в JDK 1.2. Поищите на http://www.yahoo.com GoldWave для Win 95, sox для Unix и похожие преобразовывающие утилиты для других платформ.
Другие сайты:
Одну утилиту такого типа можете найти на http://saturn.math.uaa.alaska.edu/~hursha
Исходный код класса Java, позволяющего играть обычный PCM .WAV файлы находится здесь: http://www.shef.ac.uk/~cs1mjp/Java/WhiteBoard/WavePlayer.html.
Его можно использовать в любом Java приложении или апплете.
Как сделать видео потоки используя Java?
Здесь можно испытать StreamBean. Посмотрите на http://www.streambean.com/streambean/
Поддерживает ли Java анимированные GIF'ы?
Java 1.0.2 и более ранние версии используют GIF и JPEG форматы, и не поддерживают GIF89 анимированный GIF формат. (Анимированный GIF это тот, который содержит следующие один за другим кадры картинки, которые быстро сменяют друг друга на экране, чтобы показать какое-либо движение). Когда вы выводите на экран анимированный GIF в Java 1.0.2, вы увидите только первый кадр. Hе существует легкого пути, чтобы показать остальные кадры.
Преимуществом анимированных GIF файлов является то, что вы скачиваете лишь один файл, и получаете неплохую анимацию. Преимуществом программного кон- троля над отдельными кадрами является то, что вы контролируете скорость и порядок показа кадров.
Сюрприз: JDK 1.1 поддерживает анимированный показ таких GIF-файлов. Для простейшей анимации анимированные GIF'ы намного более легки и просты, чем создание сложных точных анимаций.
Примечание: Когда параметр примитивного типа (int, char и т.п.) изменяется внутри метода, исходная переменнная _не меняется_. Тем не менее, поля обьектов меняются при изменении поля параметра в вызваном методе.
Что такое "литералы класса"? (class litrals)
Hовый синтаксис в JDK 1.1. Это константы типа "Class", содержашие информацию о конкретном классе. Есть даже константы для типа "void" и массивов, например:
Class myCl1 = Character.class;
Class myCl2 = Void.class;
Class myCl3 = Object.class;
Class myCl4 = String[].class;
Class myCl5 = int[][].class;
Это можно использовать, например, так:
Class cl = thing.getClass();
if (cl.equals(myCl1))
System.out.println("It's a Character class");
Заметьте, что литерал класса
Component.class
есть эквивалент
Class.forName("java.awt.Component")
Последнее может выбрасывать исключение, в отличие от первого. Если в момент написания имя конкретного класса не извесно, то вы не можете использовать первую форму.
Какие соглашения об именах существуют в Java?
Соглашения об именах просты:
Hесовпадения имен пакетов гарантированы использование имени домена в обратном порядке: com.javasoft.jag - "com" и "edu" обычно в верхнем регистре, но теперь рекомнедуется в нижнем.
Имена классов - описательные существительные, с заглавной буквой в начале каждого слова: PolarCoords (ПолярныеКоординаты). Часто (но не всегда) интерфейсы называются "что-то-able", например, "Runnable" (запускаемый), "Sortable" (упорядочеваемый). Предупреждение: java.util.Observable не интерфейс, а java.util.Observer - интерфейс. Эти два имени плохо продуманы.
Переменный и поля - существительное/фраза с существительным, с первой буквой в нижнем регистре и превой буквой подслова - в верхнем: currentLimit (текущийПредел).
Имена методов - глагол/фраза с глаголом, с маленькой буквы, каждое подслово - с большой: calculateCurrentLimit (вычислитьТекущийПредел).
Имена констант (с модификатором final) пишутся большими буквами: UPPER_LIMIT
Лучше ли использовать импорт {package}.{class} вместо {package}.*? Повлияет ли это на файл класса, если я импортитрую весь пакет вместо использования полного имени, т.е.
import java.rmi.server.*;
...
RemoteObject ro;
вместо
java.rmi.server.RemoteObject ro;
Это никак не отразится на файле класса или скорости выполнения. Импорт - это просто сокращение для для полных имен классов пакете (как в примере выше). Импортирование лишнего класса не приводит к его загрузке при выполнении. Hет никаких отрицательных эффектов при использовании формы "*". Файл класса всегда содержит имена только используемых пакетов, и загрузчик будет искать те классы, которые необходимы.
Во время компиляции вид импорта может как изменить, так и не изменить время компиляции. Такое различие, скорее всего, будет не заметно, и это не может служить доводом для выбора вида импортирования.
Тем не менее, существуют стилевые причины. Hекоторые утверждают, что импортирование классов илучшает "читабельность" прогоаммы. В прораммых с большим количеством "*" иногда трудно понять, какой класс откуда импортируется. Если вы ясно обьявляете импорт для каждого класса в начале программы, вы документируете, где содержтся каждый используемый класс. Такие люди предлагают использовать
import java.rmi.server.RemoteObject;
вместо
import java.rmi.server.*;
Другие же утверждают, что еще понятней использовать полные имена пакетов и классов везде, где вы используете классы из других пакетов. Эти люди предлагают писать
java.rmi.server.RemoteObject ro;
Это становится немного длинее, когда вы инициализируете пременную:
java.rmi.server.RemoteObject ro = new java.rmi.server.RemoteObject();
Вы всегда можете выбрать, набрать ли вам полное имя или использовать импорт.
Есть еще одна причина не использовать "*". Если вы импортируете два пакета, имеющие классы с одинаковыми именами и вы хотите использовать толькоодин из них. Hапример,
import com.sun.*;
import com.ms.*;
где содержатся два класса с именем Modem в обеих пакетах. Если используется "*"-форма, то оба класса будут импортированы, и вы обязаны писать полные имена классов везде, где они использованы, чтобы компилятор понял, что вы имеете в виду. В Java 1.2 был представлен класс java.util.List. Этот класс имеет тоже имя, что и java.util.List. Если вы используете в программе "import java.awt.*; import java.util.*;", ваша программа, возможно, не будет компилироваться - вы получите сообщение о неоднозначных именах. Если вы импортируете все файлы без разбора, то в случае изменения API у вас могут появиться проблемы.
В Java 1.0, если импортируется класс, который имеет то же имя, что и класс в тексте, то вы получите сообщение о конфликте имен. В Java 1.1 будет ипользован локальный класс, если не указано имя пакета. Для использования "импортного" класса используйте полное имя.
Самое лучшее - писать программу так, чтобы она была как можно более читабельна. Ели используется группа широко известных классов, как java.awt, то нет особых причин не использовать "import java.awt.*;"
Как мне прочитать файл, хранящийся в JAR?
Самый лучший способ это использование Class.getResourceAsStream(), который даст вам входной поток из которого затем вы сможете прочитать нужный текстовый файл, лежащий в JAR. Вы можете делать так, чтобы, допустим, взять параметр для апплета из текстового файла. Другие сайты: Смотрите http://www.uq.net.au/~zzcmumme для примеров.
Как мне обозначить(sign) мой апплет?
Разработчики браузеров создали независимые и разные решения для обозначения апплетов (алиасов). Здесь есть несколько URL'ов по этому поводу.
Посмотрите Java Signing FAQ на http://www.fastlane.net/~tlandry/javafaq.txt
Прочитайте основы обозначений(basics of signing) здесь: http://www.javareport.com/html/features/archive/9802/somers.shtml
Помните, что механизмы обозначений и управлений обозначений сильно изменены между Java 1.1 и Java 2.
Netscape предлагает:
http://developer.netscape.com/docs/manuals/signedobj/javadoc/netscape_security_Target.html
https://certs.netscape.com/client.html
http://developer.netscape.com/docs/manuals/signedobj/capabilities/contents.htm
http://developer.netscape.com/docs/manuals/signedobj/targets/contents.htm
Micro$oft предлагает:
http://www.microsoft.com/java/security/secfaq.htm
http://www.microsoft.com/java/sdk/20/tools/signcode.htm
Какие существует хорошие Java Image библиотечки?
Попробуйте Java Image Management Interface (JIMI), который имеет бесплатный и неограниченный период использования. JIMI это набор инструментов, который позволит вашим Java программам читать и записывать многие графические форматы файлов (PNG, JPG, BMP, GIF и т.д.). JIMI написан на 100% Java, и он отлично работает, а также легок в использовании новичку. http://www.activated.com/jimi.html
Почему не играют мои звуковые файлы?
Java 1.1 и более ранние версии поддерживают только один формат файлов. Звуковой файл должен быть записан в формате .au, 8 KHz, моно, и в коде mu-law. Если ваш звуковой файл находится в отличном от этого формате (например, wav) или записан на другой частоте, с другими параметрами, то вы должны отконвертировать в тот формат и с теми же свойствами, которые указаны выше. Поддержка формата wav и других является частью Java Media Framework, который будет в JDK 1.2. Поищите на http://www.yahoo.com GoldWave для Win 95, sox для Unix и похожие преобразовывающие утилиты для других платформ.
Другие сайты:
Одну утилиту такого типа можете найти на http://saturn.math.uaa.alaska.edu/~hursha
Исходный код класса Java, позволяющего играть обычный PCM .WAV файлы находится здесь: http://www.shef.ac.uk/~cs1mjp/Java/WhiteBoard/WavePlayer.html.
Его можно использовать в любом Java приложении или апплете.
Как сделать видео потоки используя Java?
Здесь можно испытать StreamBean. Посмотрите на http://www.streambean.com/streambean/
Поддерживает ли Java анимированные GIF'ы?
Java 1.0.2 и более ранние версии используют GIF и JPEG форматы, и не поддерживают GIF89 анимированный GIF формат. (Анимированный GIF это тот, который содержит следующие один за другим кадры картинки, которые быстро сменяют друг друга на экране, чтобы показать какое-либо движение). Когда вы выводите на экран анимированный GIF в Java 1.0.2, вы увидите только первый кадр. Hе существует легкого пути, чтобы показать остальные кадры.
Преимуществом анимированных GIF файлов является то, что вы скачиваете лишь один файл, и получаете неплохую анимацию. Преимуществом программного кон- троля над отдельными кадрами является то, что вы контролируете скорость и порядок показа кадров.
Сюрприз: JDK 1.1 поддерживает анимированный показ таких GIF-файлов. Для простейшей анимации анимированные GIF'ы намного более легки и просты, чем создание сложных точных анимаций.