Как я могу использовать метод для изменения значения?

class Trial {
static void main() {
    int i = 0;
    change(i);
    System.out.println(i);
}
static void change(int n) {
    n = n + 2;
    }
}

Вывод, который я получаю - 0 Вывод, который я хочу - 2

Пожалуйста, помогите мне изменить мой код.


person user3908654    schedule 05.08.2014    source источник
comment
Пожалуйста, не забудьте пометить свои вопросы языком, который вы используете.   -  person Barmar    schedule 05.08.2014
comment
Нет ничего, что называется function в Java, кроме methods   -  person Ruchira Gayan Ranaweera    schedule 05.08.2014
comment
@RuchiraGayanRanaweera, а как насчет лямбда-выражений Java 8?   -  person Alnitak    schedule 05.08.2014


Ответы (1)


В Java все передается по значению: http://www.javaranch.com/campfire/StoryPassBy.jsp

Попробуйте это вместо этого:

class Trial {
    static void main() {
        int i = 0;
        i = change(i);
        System.out.println(i);
    }
    static int change(int n) {
        return n + 2;
    }
}

Изменить

Параметру метода присваивается копия значения. Это значение будет либо исходным значением (примитивом), либо ссылкой на объект (объект).

Для объектов копия ссылки означает, что вы можете изменить состояние объекта в методе. Чего вы не можете сделать, так это изменить состояние, изменив то, на что ссылается параметр.

Пример 1:

class Person {
    private String name;
    public Person() {
    }

    public Person(String name) {
        this.name = name;
    }
    public String getName() {
        return this.name;
    }
    public void setName(final String name) {
        this.name = name;
    }
}

Person p = new Person("James");
changeName(p);
System.out.println(p.getName()); // This will output Changed
...
public void changeName(Person person) {
    person.setName("Changed");
}

Пример 2:

Person p = new Person("James");
changeName(p);
System.out.println(p.getName()); // This will output James
...
public void changeName(Person person) {
    person = new Person(); // person is now referring to new object, not the one passed
    person.setName("Changed");
}
person JamesB    schedule 05.08.2014
comment
это не совсем верно. Объекты передаются по копии ссылки, поэтому вы можете изменить объект, переданный в качестве параметра. Чего вы не можете сделать, так это изменить ссылку, которая уже была у вызывающего объекта, чтобы она указывала на другой объект. - person Alnitak; 05.08.2014
comment
@Alnitak Хотя ваш комментарий действителен, ничто из того, что я сказал в своем ответе, не соответствует действительности. Передача по значению в Java означает, что вы получаете копию значения в вызове метода — это значение будет либо примитивным значением, либо ссылкой на объект. - person JamesB; 05.08.2014
comment
и без оговорок читатель может понять, что передача по значению означает, что значения объектов копируются, когда они передаются в качестве параметров. - person Alnitak; 05.08.2014
comment
@Alnitak Я обновил свой ответ. - person JamesB; 05.08.2014