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 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 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

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

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

    К. Гепперт и К. Пат:

    "Центральный банк — это банк, при помощи которого государство вмешивается в дела частных банков и который, в отличие от них, может сам печатать нужные ему деньги."

    Опрос

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

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