Примитивы Java в передаче параметров типа класса - PullRequest
0 голосов
/ 15 декабря 2011

Я знаю, что если вы передадите тип Class в качестве параметра для метода, указатель будет передан, и если вы отредактируете параметр в методе, вы также отредактируете исходный экземпляр объекта, который вы передали (например, если метод с именем public void changeColor(Color color) делает следующий код:

public void changeColor(Color color)
{
    color = new Color(20, 100, 50);
}

и вы назвали значение следующим образом:

Color color = new Color(10, 20, 30);
System.out.println(color.toString());
changeColor(color);
System.out.println(color.toString());

обе строки консоли должны быть разными (java.awt.Color[r=10,g=20,b=30] и java.awt.Color[r=20,g=100,b=50]), поэтому значение изменяется и указатель передается. С другой стороны, если вы используете значение типа int, которое является примитивом, вы получите другой результат:

public void changeNumber(int i)
{
    i = 10;
}

и вы назвали значение следующим образом:

int n = 5;
System.out.println(n);
changeNumber(n);
System.out.println(n);

Консоль не печатает 5 и 10, но в обеих строках написано 5. С учетом сказанного, если бы я имел это:

public class A
{
    public int i;
    public Color c;

    public A(int n, Color color)
    {
        i = n;
        c = color;
    }
}

А в беговом классе ...

public static void main(String[] args)
{
    A a = new A(10, new Color(10, 40, 23));
    changeA(a);
}

public static changeA(A varA)
{
    varA.i = 54;
    varA.c = new Color(40, 30, 264)
}

Будет ли i внутри класса A действовать также, как если бы он был частью указателя на A, или будет значение, если a.i в методе main не изменится после того, как я запущу changeA (a); Если нет, что я могу сделать, чтобы он изменился?

Ответы [ 3 ]

1 голос
/ 15 декабря 2011

Вы хотите передать по ссылке в Java.Это невозможноСм. Ответы на этот вопрос для получения более подробной информации.

0 голосов
/ 15 декабря 2011

Это было объяснено так много раз прежде, и дважды выше, но мне нравится это объяснять:

(Обратите внимание, что я скрываю «внутренние детали»: я считаю, что они не нужны для обсуждения семантики, но их следует понять в конце дня. На самом деле, я Я даже не собираюсь обсуждать стратегии оценки, используемые , за исключением того, чтобы сказать, что Java использует call-by-value и что переданные объекты имеют семантику call-by-object-sharing, что достигается внутренне, передавая ссылку объект как значение.)

  • Когда передано примитивное значение , создается копия . (Хотя это не имеет никакого отношения к следующему пункту, потому что примитивные значения не могут быть изменены.)

  • Когда объект передается (или назначается), этот же объект передается (или назначается). Копирование объекта не происходит : если не назначить заново соответствующую переменную параметра, то будет оцениваться с тем же объектом , что и переданный (или, возможно, null). Так как объект сам по себе , то мутирует объект в одном месте - независимо от того, какое «переменное имя» у него есть в настоящее время - изменяет один и тот же объект везде.

Если вам нужен новый, независимый объект, затем создайте его:)

Счастливого кодирования.

0 голосов
/ 15 декабря 2011

Будет ли я внутри класса A действовать так же, как если бы он был частью указателя на A, или будет значение, если ai в основном методе не изменится после того, как я выполню changeA (a)

Значение i в экземпляре A, переданном в качестве параметра A, изменится.

Но я бы не сказал, что он действует ", как если бы он был частьюуказателя А ".Ссылка на A является единственным неизменным значением.Вы изменяете состояние объекта, на который он ссылается.

Кстати, это не то, что означает «передача по ссылке», и это не аналог передачи по ссылке, как это реализовано в таких языках, как C # иC ++, или C взломать передачу адреса переменной / member / любой другой.

...