powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача параметров по сслыке и значению
13 сообщений из 13, страница 1 из 1
Передача параметров по сслыке и значению
    #39388970
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня господа !

Вопрос прост - необходимо выполнить процедуры и вернуть набор параметров
В частности tbMark,tmMark которые являются полями объекта и созданные внутри
процедуры конструктором.

Но возврат не происходит, пришлось дополнить ключом и кодом
if(Key==0) tmMark=Model; else tmCalc=Model;
if(Key==0) tbMark=Table; else tbCalc=Table;

Это неверно...
Насколько помню передача параметров по значению только для ПРОСТЫХ типов
(используем массив если ссылка) остальные типы в Jave передаются ссылке.
JTable, TableMark (польз. тип) - не есть простыми, но возврат не происходит
Подскажите как реализовать правильно .

Заранее благодарен !


CreateTable(0,tbMark,tmMark,rcMark);
CreateTable(1,tbCalc,tmCalc,rcCalc);

Код: java
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.
    private void CreateTable(int Key,JTable Table,TableMark Model,ArrayList<Mark> Record)
	{
   		Model = new TableMark(Record);
        Table = new JTable(Model) 
        {
        	MarkEditing cbCell = new MarkEditing(this);
        	public TableCellEditor getCellEditor(int row, int col)
            {
        		return (cbCell.mListEdit.get(row)==null)?super.getCellEditor(row,col):cbCell.mListEdit.get(row);
            }
        	{
                getTableHeader().setPreferredSize(new Dimension(25, 50));
        		getColumnModel().getColumn(4).setCellRenderer(new MarkRenderer());
            	for(int i=0;i<=2;i++)
            	{
            		TableColumn column=getColumnModel().getColumn(i);
            		column.setMinWidth(0);
            		column.setMaxWidth(0);
            		column.setWidth(0);
            		column.setPreferredWidth(0);
            	};
        	}
        };
		if(Key==0) tmMark=Model; else tmCalc=Model;  
		if(Key==0) tbMark=Table; else tbCalc=Table;  
	};
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39388992
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что вы похоже не очень понимаете, что в java нет такого понятия, как out параметр (как например в PL/SQL).
То что в метод передается значение по ссылке, означает что внутри метода параметр будет ссылаться на тот же объект, на который ссылается аргумент в вызове (ссылка будет скопирована в параметр). Если параметру внутри метода присвоить другое значение, то это никак не повлияет на вызывающий метод, т.к. значение параметра это всего лишь копия переданного аргумента
На простом примере:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class MyClass {

    private Object obj;

    public void create(Object param) {
        // здесь param и obj ссылаются на один и тот же объект (или null)

        // после следующего вызова param ссылается на вновь созданный объект, а
        // obj не изменилась
        param = new Object();

        // после этого вызова obj будет тоже ссылаться на созданный в предыдущей
        // строке объект.
        obj = param;
    }

    public void test() {
        create(obj);
    }

}
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389001
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_X,

https://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/mutable/Mutable.html] Interface Mutable<T> - Provides mutable access to a value

Class SummaryMutableBoolean A mutable boolean wrapper.MutableByte A mutable byte wrapper.MutableDouble A mutable double wrapper.MutableFloat A mutable float wrapper.MutableInt A mutable int wrapper.MutableLong A mutable long wrapper.MutableObject<T> A mutable Object wrapper.MutableShort A mutable short wrapper.
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389047
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Параметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)

Как можно выйти из положения ?
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389054
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)С этим согласен. (см. ответ Kripke)
HOME_XКак можно выйти из положения ?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package ru.sql.example;

import org.apache.commons.lang3.mutable.MutableObject;

public class MutableObjects {
    
    public static void function(MutableObject<Object> obj) {
        obj.setValue("{" + obj.getValue() + "}");
    }

    public static void main(String[] args) {
        MutableObject<Object> obj = new MutableObject<>();
        Object[] arguments = { 
            "Hello, World!!!", Math.PI, Integer.MAX_VALUE, 'a' 
        };
        for (Object argument: arguments) {
            obj.setValue(argument);
            System.out.println("Before: " + obj.getValue());
            function(obj);
            System.out.println("After: " + obj.getValue());
        }
    }
}

вывод:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Before: Hello, World!!!
After: {Hello, World!!!}
Before: 3.141592653589793
After: {3.141592653589793}
Before: 2147483647
After: {2147483647}
Before: a
After: {a}
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389056
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XUsman,

Параметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)

Как можно выйти из положения ?
По ссылке они передаются, просто "по ссылке" в широком смысле - через указатель. То есть референсные параметры метода при вызове метода содержат адреса объектов, а не являются ссылками в их определении как именованная часть памяти. Соответственно, при записи меняется только значение самого указателя. Решается это очень просто и много как, например, передачей уже созданных объектов в вызов метода и тд.
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389063
no56892
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не точно выразился в предыдущем посте, по факту в джава происходит следующее:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
void doSmth(Object localRef) {

}

и вызов:

Object ref = new Object();
doSmth(ref);

при вызове doSmth - неявное копирование параметров во внутренние для этого метода, тоесть:
localRef = ref;
далее выполняется само тело метода


Но это все-равно передача по ссылке, передача по значению - объект целиком бы копировался, а здесь копируется только указатель на него в локальную переменную метода. Вот так.
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389064
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)Для примитивов - это реальное значение, а для ссылочных типов -
значением является ссылка, которое мы тоже не можем изменить.

Из примера:
Код: java
1.
MutableObject<Object> obj

мы не можем изменить значение аргумента obj . Но мы можем изменить значение поля, которое определено в классе MutableObject<T> :
Код: java
1.
2.
/** The mutable value. */
private T value;

что мы и делаем при помощи методов:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    @Override
    public T getValue() {
        return this.value;
    }

    @Override
    public void setValue(final T value) {
        this.value = value;
    }
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389082
Kripke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

По-моему автору стоит разобраться с основами java и переписать свой код в нормальном виде. А не добавлять в это ад еще и MutableObject
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389114
HOME_X
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за пояснения господа
Учту в дальнейшей разработке

Usman - благодарен за конкретный пример !

P.S. в своем случае изменил сигнатуру класса
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389292
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)
Вы немного заблуждаетесь.
Объект в java это всегда ссылка.
Соответственно строите обертку в виде объекта (хоть массива из одного элемента) и вуаля.
Правда и вызывающий должен оперировать этим объектом, а не прямой ссылкой.
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389348
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевHOME_XПараметры в Jave реально передаются только по значению
(другие утверждения ложны !!!!!!!)
Вы немного заблуждаетесь.
Объект в java это всегда ссылка.
Соответственно строите обертку в виде объекта (хоть массива из одного элемента) и вуаля.
Правда и вызывающий должен оперировать этим объектом, а не прямой ссылкой.

Ну в том же PHP можно передать ссылку по ссылке, чтобы заменить ссылку из тела метода.

Код: php
1.
2.
3.
function test(&$class) {
    $class = new a('2');
}



Но это, мне кажется, не очень хорошо
...
Рейтинг: 0 / 0
Передача параметров по сслыке и значению
    #39389371
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Передача параметров по сслыке и значению
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]