2012-02-20 2 views
1

Почему переменная s не изменяется 2переменная не может быть изменена

public class Test { 
    static void getVal(int s) { 
    s= 2; 
    } 

    public static void main(String arg[]) { 
    int s = 0; 
    getVal(s); 
    System.out.println(s); 
    } 
} 
+1

Поскольку аргументы передаются по значению, а не по ссылке. См. Также http://en.wikipedia.org/wiki/Evaluation_strategy –

+0

@FelixKling Как я могу решить эту проблему (обновление s) – sprabhakaran

+0

@ dangerous проверить мой ответ .. –

ответ

2

s является локальной переменной в getVal() и это делает изменение - но только в scope из getVal().

Значение s передано getVal()by value - при этом изменяется только копия, а не оригинал.

6

Как отмечает Феликс в комментарии, аргументы Java передаются по значению.

Это понятнее, если мы используем различные имена переменных:

public static void main(String arg[]) { 
    int x = 0; 
    method(x); 
    System.out.println(x); // Prints 0 
} 

static void method(int y) { 
    y = 2; 
} 

При вызове method(x), значение x вычисляется, и это значение становится начальным значением y. Это только связь между двумя переменными. Изменение значения y не меняет значение x.

Теперь с переменными ссылочного типа может появиться, как будто это не так:

public static void main(String arg[]) { 
    StringBuilder x = new StringBuilder(); 
    method(x); 
    System.out.println(x); // Prints "appended" 
} 

static void method(StringBuilder y) { 
    y.append("appended"); 
} 

Это выглядит немного, как вы изменили значение x - но вы действительно не , Значения x и y - это всего лишь ссылки объекту ... и x, и y относятся к одному и тому же объекту, а вызов append изменил данные внутри объекта. Аналогию, которую я хотел бы использовать здесь, это дома: в качестве вызывающего метода я могу дать вам лист бумаги с моим адресом, написанным на нем. Этот адрес является эквивалентом ссылки , тогда как мой дом является объектом .

Вы можете изменить две вещи:

  • Вы можете пойти и покрасить входную дверь красный, который делает изменения в объекте. Я увижу это изменение в следующий раз, когда посмотрю на свой дом.
  • Вы можете изменить адрес, указанный на листе бумаги.

Ни один из них не вносит изменения в «где я живу» - моя копия ссылки на «мой дом» такая же, как и прежде, независимо от того, что вы сделали.

Поведение, когда дело доходит до занятий, приводит к обычно заявляемому мифу о том, что «Java передает примитивы по значению и объектам по ссылке» - это просто неверно. Java передает все аргументы по значению - но вам нужно понять, что значение выражения равно всегда либо примитивное значение, либо ссылка, а не объект.

+0

Очень хорошее объяснение! –

1

Аргумент передается по значению. В методе getVal s - другая переменная, сгенерированная. Изменения не влияют на другую переменную s.Для этого эффекта вы можете:

public class Test { 
     static int getVal(int s) { 
     s= 2; 
     return s; 
     } 

    public static void main(String arg[]) { 
    int s = 0; 
    s = getVal(s); 
    System.out.println(s); 
    } 
} 
+0

+1 для пройденного значением – AlexS

2

Вы передаете значение s, которое имеет значение 0; Затем, поскольку он передается по значению, новая переменная создается внутри getVal, которая инициализируется до 0. Она получает присвоенное значение 2. Затем переменная удаляется с окончанием функции.

+0

+1 для пройденного значением – AlexS

1

аргумент передается по значению, поэтому в getVal создается новая локальная переменная. для этого вы должны вернуть значение и назначить переменной в методе вызова. попробуйте это

public class Test{ 
    static int getVal(int s){ 
     s= 2; 
    return s; 
    } 

    public static void main(String arg[]){ 
     int s = 0; 
     s = getVal(s); 
     System.out.println(s); 
    } 
} 
+0

ум pls, дающий причину для downvote ... –

+0

У меня есть слишком много аргументов. возврат не решает мою проблему. – sprabhakaran

+0

@spk: Вы не представили свою проблему - вы спросили, почему один бит кода работает так, как он делает. Почему многие объясняют это. Возможно, если бы вы задали вопрос, связанный с тем, что вы пытались достичь, вы будете дальше ... –

0

Java манипулирует объектами по ссылке, а все переменные объекта являются ссылками. Однако Java не передает аргументы метода по ссылке; он передает их по значению.

Возьмите метод fun(), например:

public void fun(int var1, int var2) 
{ 
    int temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

Когда весело() возвращает переменные, передаваемые как аргументы будут по-прежнему держать свои первоначальные значения. Метод также будет терпеть неудачу, если мы изменим тип аргументов от int до Object, так как Java также передает ссылки на объекты по значению.

1

Это связано с тем, что java передает значения методам в качестве параметров. Поэтому при вызове функции GETVAL (s) вместо того, чтобы с его передает значение, которое с 0.

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Этот документ расскажет вам историю.

Смежные вопросы