WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Как предаются параметры - по значению или по ссылке?

Как предаются параметры - по значению или по ссылке?


Дата публикации: 17-03-2013

Все параметры (как базовые типы так и ссылки на обьекты) передаются по значению. 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'ы намного более легки и просты, чем создание сложных точных анимаций.
Домен продается

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Июль 2025 (1)
Август 2024 (1)
Май 2024 (1)
Апрель 2024 (1)
Октябрь 2018 (14)
Февраль 2017 (3)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта



Случайная цитата

Неизвестный автор:

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

Опрос

Какой антивирус Вы используете?

Kaspersky Antivirus
NOD32
Norton Antivirus
Dr.Web
Panda
Аvast!
ClamWin
Другой...