Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1

Как передавать объекты в функцию по ссылке, как в C++?

30.12.2012, 21:10. Показов 4670. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. После программирования на C++ решил попробовать на java написать мобильное приложение, но возникла тупиковая ситуация с основами java.

Хочу передавать объекты в функцию по ссылке. Почитав в интернете, ничего хорошего не нашел.
Пока что, если я правильно понял, с объектом происходит взаимодействие через указатель, т.е. например, в объявлении
Java
1
private List main_list = null;
main_list - это указатель на объект типа List (хотя в интернете написано, что понятия указателя в java нет, и что это вовсе не указатель).
И следовательно в функцию передаётся этот указатель по значению.

Можно ли передать ссылку на этот указатель в функцию?
Проблему выделил в коде ниже

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestMidlet
{
    private List main_list = null;
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(List l)
    {
        if (l == null)
        {
            l = new List("Главное меню", List.IMPLICIT);
            // с этого момента l указывает на новый объект, а main_list до сих пор равен null
            l.setCommandListener(new MyCommandListener());      
            l.append("Начать", null);
            l.append("Настройки", null);
            l.append("Справка", null); 
            l.append("Выход", null);
        }
    }
}
Добавлено через 11 минут
Или хотя бы указатель на указатель?

Добавлено через 35 минут
Что это за ссылки в java, если их можно изменять (заставить указывать на другой объект)?
Java
1
l = new List("Главное меню", List.IMPLICIT);
Только с указателями можно такой вытворять.

Добавлено через 59 секунд
Всё в кашу собрали эти разработчики java

Добавлено через 1 час 0 минут
Нашел только такой способ, но он уродский:
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
public class TestMidlet
{
    private List []main_list = new List[1];
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(List []l)
    {
        // даже нельзя что-то типо такого написать: 
        // List ll = l[0], т.к. опять же l[0] - это не ссылка и не объект, а указатель на объект
        if (l[0] == null)
        {
            l[0] = new List("Главное меню", List.IMPLICIT);
            l[0].setCommandListener(new MyCommandListener());      
            l[0].append("Начать", null);
            l[0].append("Настройки", null);
            l[0].append("Справка", null); 
            l[0].append("Выход", null);
        }
    }
}
Добавлено через 12 минут
Немного переправил, теперь более лучше выглядит, но все равно недочет: чтобы использовать main_list, теперь нужно писать main_list[0]
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
public class TestMidlet
{
    private List []main_list = new List[1];
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(Object []obj)
    {       
        List l = (List)obj[0];
        if (l == null)
        {
            l = new List("Главное меню", List.IMPLICIT);     
            l.setCommandListener(new MyCommandListener());      
            l.append("Начать", null);
            l.append("Настройки", null);
            l.append("Справка", null); 
            l.append("Выход", null);
            obj[0] = l;
        }       
    }
}
Немного поковырявшись, я уже твердо понял, что понятие ссылки в java - это указатель на C++
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.12.2012, 21:10
Ответы с готовыми решениями:

Как можно передать массив по ссылке в функцию?
Привет всем! приведу пример вот функция fill заполняет массив a и извлекает 3-элемент public static int fill(int a){ ...

Как лучше передавать аргумент в функцию - по ссылке или по указателю?
Предположим, что нам нужно в функцию передать значение переменной чтобы по окончанию работы функции значение переменной изменилось. Меня...

Как правильно передавать ссылки на объекты ?
Я чутка запутался, подскажите, если знаете, какой вариант лучше? 1. Как-то глобально, на примере форм ...

2
Эксперт функциональных языков программированияЭксперт по математике/физике
4313 / 2105 / 431
Регистрация: 19.07.2009
Сообщений: 3,205
Записей в блоге: 24
30.12.2012, 21:22
Ну по-другому и не получится. Вы же объект передаёте.
У нас есть объект, мы объект передаём. Если мы объект меняем, то он меняется всюду. Это значит, что если объект меняется внутри процедуры, то он изменится и снаружи.
А есть понятие переменной, у которой есть имя и значение. Имя мы менять не можем. Значение мы можем изменить.
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestMidlet
{
    private List main_list = null;
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(List l)
    {
        if (l == null)
        {
            l = new List("Главное меню", List.IMPLICIT); // изменили значение переменной
            // посему отныне все манипуляции никак не связаны с фактическим аргументом main_list
            l.setCommandListener(new MyCommandListener());      
            l.append("Начать", null);
            l.append("Настройки", null);
            l.append("Справка", null); 
            l.append("Выход", null);
        }
    }
}
Кликните здесь для просмотра всего текста
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
public class TestMidlet
{
    private List []main_list = new List[1];
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(List []l)
    {
        List ll = l[0]; 
        // если бы здесь мы поменяли состояние ll, то оно бы сохранилось и снаружи, и l[0]
        if (ll == null)
        {
            ll = new List("Главное меню", List.IMPLICIT);
            // теперь ll и l[0] не связаны
            ll.setCommandListener(new MyCommandListener());      
            ll.append("Начать", null);
            ll.append("Настройки", null);
            ll.append("Справка", null); 
            ll.append("Выход", null);
        }
    }
}
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestMidlet
{
    private List []main_list = new List[1];
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(List []l)
    {
        if (l[0] == null)
        {
            l[0] = new List("Главное меню", List.IMPLICIT);
            // само значение l не меняется, мы меняем его состояние
            l[0].setCommandListener(new MyCommandListener());      
            l[0].append("Начать", null);
            l[0].append("Настройки", null);
            l[0].append("Справка", null); 
            l[0].append("Выход", null);
        }
    }
}


Кликните здесь для просмотра всего текста
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
27
public class TestMidlet
{
    public class Wrapper { public List v; }
    private List main_list = null;
 
    public TestMidlet() 
    {
        Wrapper w = new Wrapper();
        w.v = main_list;
        CreateMainMenuIfNecessary(w); 
        main_list = w.v;
    }
 
    private void CreateMainMenuIfNecessary(Wrapper w)
    {
        if (w.v == null)
        {
            w.v = new List("Главное меню", List.IMPLICIT);
            List ll = w.v;
            ll.setCommandListener(new MyCommandListener());      
            ll.append("Начать", null);
            ll.append("Настройки", null);
            ll.append("Справка", null); 
            ll.append("Выход", null);
        }
    }
}
1
 Аватар для kzru_hunter
1124 / 795 / 101
Регистрация: 01.02.2011
Сообщений: 1,887
Записей в блоге: 1
31.12.2012, 09:17  [ТС]
Можно еще так, но при этом чтобы достучаться до List, нужно прописывать (List)main_list.get() (в этот раз код стал более привычней, чем в случае с main_list[0]):
Кликните здесь для просмотра всего текста
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class TestMidlet
{
    private Wrapper main_list = new Wrapper(null);
 
    public TestMidlet() 
    {
        CreateMainMenuIfNecessary(main_list); 
    }
 
    private void CreateMainMenuIfNecessary(Wrapper w)
    {       
        List l = (List)w.get();
        if (l == null)
        {
            l = new List("Главное меню", List.IMPLICIT);     
            l.setCommandListener(new MyCommandListener());      
            l.append("Начать", null);
            l.append("Настройки", null);
            l.append("Справка", null); 
            l.append("Выход", null);           
        }
        w.set(l);
    }
 
    private class Wrapper
    {       
        public Wrapper(Object obj) 
        {
             m_obj = obj;
        }   
        public Object get() 
        {
             return m_obj;
        }
        public void set(Object obj)
        {
            m_obj = obj;
        }
        
        private Object m_obj = null;
    }
}

или так (но это по-моему неправильный подход, т.к. может возникнуть ситуация, когда нужно будет возвращать код ошибки; с исключениями пока не особо разобрался, они еще добавляют много лишнего кода):
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestMidlet
{
    private List main_list = null;
 
    public TestMidlet() 
    {
        main_list = СreateMainMenuIfNecessary(main_list); 
    }
 
    private List CreateMainMenuIfNecessary(List l)
    {
        if (l == null)
        {
            l = new List("Главное меню", List.IMPLICIT);
            l.setCommandListener(new MyCommandListener());
            l.append("Начать", null);
            l.append("Настройки", null);
            l.append("Справка", null); 
            l.append("Выход", null);
        }
        return l;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.12.2012, 09:17
Помогаю со студенческими работами здесь

Нужно ли передавать итератор в функцию по ссылке?
Добрый день ! Итератор это тот же обьект но с поведением указателя. Нужно ли его в функцию передавать как ссылку ? void...

Как передавать массив по ссылке, чтобы не работала копия массива?
#include "stdafx.h" #include <iostream> using namespace std; int Min (int a,const int size); int _tmain(int argc, _TCHAR* argv) ...

Как создать функцию с текстбоксом и передавать такие параметры как номер текстбокса
Здравствуйте! Можете подсказать как написать функцию? Например, есть условие If (textBox2->Text == " ") { ...

Как передавать в функцию указатели на двумерный массив и как с помощью указателя двигаться по массиву?
Добрый день, уважаемые знатоки С++! Я долгое время работал в С#, но недавно перешел на С++, и у меня возникла следующая проблема. Задание...

Как передавать указатель на функцию в функцию для ее выполнения?
Здравствуйте! Вопрос следующий: Как передавать указатель на функцию в функцию для ее выполнения? Например: <хедер> ... ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru