25 / 26 / 16
Регистрация: 27.09.2015
Сообщений: 110
1

Передача переменных в функцию

24.04.2018, 18:10. Показов 634. Ответов 6
Метки нет (Все метки)

Некоторую заминку у меня вызвала следующая ситуация.

Предположим, есть класс С:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class C {
 
    private int v1;
    private int v2;
 
    C()
    {
        this.v1 = 0;
        this.v2 = 0;
    }
 
    public void getString()
    {
        System.out.printf("v1 = %d, v2 = %d\n", v1, v2);
    }
 
    public void set(int v1, int v2)
    {
        this.v1 = v1;
        this.v2 = v2;
    }
}
Если я создам его инстанс и передам в функцию, то изменения, которые будут произведены в функции с экземпляром данного класса, отразятся на переданном классе, когда мы выйдем из функции:

Java
1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
        //------------------------------------
        C newC = new C();
        newC.getString(); //вывод v1 = 0, v2 = 0
        changeC(newC);
        newC.getString();//вывод v1 = 5, v2 = 5
}
 
private static void changeC(C classC)
    {
        classC.set(5,5);
    }
То есть экземпляр класса передаётся в функции по ссылке (ну или данная передача скрыто имитируется).

Далее, подобное мы можем наблюдать у массивов:
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
public static void main(String[] args) {
        //------------------------------------
      
        int[] arr = new int[10];
        printArr(arr); //вывод 0000000000
        System.out.println();
        changeArr(arr);
        System.out.println();
        printArr(arr);//вывод 5555555555
        System.out.println();
 
private static void printArr(int Arr[])
   {
 
        for (int i:Arr) {
            System.out.print(i);
        }
   }
 
private static void changeArr(int Arr[])
    {
        for (int i=0; i < 10; i++) {
            Arr[i] = 5;
        }
    }
 
 
   }
То есть, передача в функцию также идёт по ссылке.

Однако, когда в функцию передаётся обычная переменная, то:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
      
        //------------------------------------
        int x = 0, y = 1;
        System.out.printf("x = %d, y = %d\n", x, y);//вывод x = 0, y = 1
        swap(x,y);
        System.out.printf("x = %d, y = %d\n", x, y);//вывод x = 0, y = 1
 
   }
 
private static void swap(int x, int y)
    {
        int temp = x;
        x = y;
        y = temp;
    }
она передаётся, как показано, по значению. Собственно вопрос, а как в Java передавать переменные по ссылке, чтобы сделать тот же простейший swap. Ну и может я где-то ошибся, также можете указать на ошибки.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.04.2018, 18:10
Ответы с готовыми решениями:

Передача 2х переменных в функцию
2 приватных переменных х и y есть void метод А вычисляет свои вопросы принимает, передает и...

Передача переменных в функцию
У меня в программе компилятор жалуется что не столько указателей я передаю как это исправить...

Передача переменных в функцию
Какой из следующих вариантов передачи переменных в функцию лучше всего использовать? Так сказать...

Передача переменных в функцию
Привет Пацаны :) Немогу понять работу функции. Ниже пример. &lt;?php function...

6
1549 / 915 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
24.04.2018, 18:13 2
в джава все типы данных делятся на примитивные и ссылочные. Первые передаются по значению, вторые - по ссылке. Открывайте гугол и читайте подробнее.
1
474 / 346 / 228
Регистрация: 31.05.2016
Сообщений: 963
24.04.2018, 18:19 3
примитивные типы (например int) передаются по значению. ]
1
75 / 61 / 29
Регистрация: 20.04.2015
Сообщений: 415
24.04.2018, 19:32 4
эмм вообще то всё в джава передаётся по значению будь то примитив или ссылочный тип, все параметры будут передаваться по значению - это правильное утверждение.

другой вопрос если ты передашь объект в метод и там будешь делать что-то с его полями то да они изменятся у объекта, если ты просто передашь туда Integer ссылочный тип данных то основа то не изменится а если передашь в метод к пример массив то массив не изменится но можно при этом поменять значения его ячеек
1
1549 / 915 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
24.04.2018, 19:37 5
WinniPuh, о хоспади. Ну да, ссылка на объект передается по значению, создается копия, т.е. новая ссылка, которая указывает на тот же объект. Только нафига эта путаница? Передача по ссылке вполне нормальная формулировка
1
TotalUSE
24.04.2018, 20:00
  #6

Не по теме:

Цитата Сообщение от neske Посмотреть сообщение
WinniPuh, о хоспади.
можно просто - Винни )

0
Эксперт Java
3946 / 2556 / 462
Регистрация: 28.04.2012
Сообщений: 8,323
24.04.2018, 22:05 7
Цитата Сообщение от neske Посмотреть сообщение
Только нафига эта путаница?
Это не путаница, а корректность. Уже сто раз обсуждалось.

Цитата Сообщение от neske Посмотреть сообщение
Передача по ссылке вполне нормальная формулировка
Только не корректная.

Осторожно! Паскаль
Pascal
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
program ideone;
 
{$MODE OBJFPC}
 
type
    Val = record
        id:   Integer;
        name: String;
    end;
    Ref = class
    public
        id:   Integer;
        name: String;
    end;
 
function NewVal(id: Integer; name: String): Val;
begin
    Result.id   := id;
    Result.name := name;
end;
 
function NewRef(id: Integer; name: String): Ref;
begin
    Result := Ref.Create;
    Result.id   := id;
    Result.name := name;
end;
 
procedure PrintVal(const s: String; const v: Val);
begin
    WriteLn('ValBy' + s, v.id, ' ', v.name);
end;
 
procedure PrintRef(const s: String; const r: Ref);
begin
    WriteLn('RefBy' + s, r.id, ' ', r.name);
end;
 
procedure ValByVal(v: Val);
begin
    v.name := 'Foo';
    v := NewVal(123, 'Bar');
end;
 
procedure RefByVal(r: Ref);
begin
    r.name := 'Foo';
    r := NewRef(123, 'Bar');
end;
 
procedure ValByRef(var v: Val);
begin
    v.name := 'Foo';
    v := NewVal(123, 'Bar');
end;
 
procedure RefByRef(var r: Ref);
begin
    r.name := 'Foo';
    r := NewRef(123, 'Bar');
end;
 
procedure DemoValByVal;
var v: Val;
begin
    v := NewVal(456, 'Val');
    PrintVal('Val Before: ', v);
    ValByVal(v);
    PrintVal('Val After:  ', v);
end;
 
procedure DemoRefByVal;
var r: Ref;
begin
    r := NewRef(456, 'Ref');
    PrintRef('Val Before: ', r);
    RefByVal(r);
    PrintRef('Val After:  ', r);
end;
 
procedure DemoValByRef;
var v: Val;
begin
    v := NewVal(456, 'Val');
    PrintVal('Ref Before: ', v);
    ValByRef(v);
    PrintVal('Ref After:  ', v);
end;
 
procedure DemoRefByRef;
var r: Ref;
begin
    r := NewRef(456, 'Ref');
    PrintRef('Ref Before: ', r);
    RefByRef(r);
    PrintRef('Ref After:  ', r);
end;
 
begin
    DemoValByVal;
    WriteLn;
    DemoRefByVal;
    WriteLn;
    DemoValByRef;
    WriteLn;
    DemoRefByRef;
end.


https://ideone.com/yck5sF

Код
ValByVal Before: 456 Val
ValByVal After:  456 Val

RefByVal Before: 456 Ref
RefByVal After:  456 Foo

ValByRef Before: 456 Val
ValByRef After:  123 Bar

RefByRef Before: 456 Ref
RefByRef After:  123 Bar
Так вот, *ByRef, как не сложно догадаться, в Java нет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2018, 22:05
Помогаю со студенческими работами здесь

Передача переменных в функцию
#include &lt;iostream&gt; int fun(int x, int y, int z); int main() { int x, y, z;

Передача значений переменных в функцию()
int main() Братья программисты! Вот занимаюсь немножко... возник вопрос, но но книжке его ведь не...

Передача значений двух переменных в основную функцию
Доброго дня! Господа, поставлена задача: передать в функцию массив, найти минимальное и...

Для чего используеться передача структурных переменных в функцию?
Вообщем прошу помощи. 1) Для чего используеться передача структурных переменных в функцию? Как...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru