2016-03-01 3 views
2

В результате следующего снайпера я получил «1 0 1», но я не знаю, почему, ожидая «1 1 1». пожалуйста, может кто-нибудь объяснить мне, как идут дела ArroundНеожиданный результат вычисления java

public class Qcb90 { 
int a; 
int b; 
public void f() { 
    a = 0; 
    b = 0; 
    int[] c = { 0 }; 
    g(b, c); 
    System.out.println(a + " " + b + " " + c[0] + " "); 
} 
public void g(int b, int[] c) { 
    a = 1; 
    b = 1; 
    c[0] = 1; 
} 
public static void main(String[] args) { 
    Qcb90 obj = new Qcb90(); 
    obj.f(); 
} 
} 
+3

в '' b' в G' является параметром функции, то '' b' в f' является членом. используйте 'this.b' в' g' для назначения члену. – BeyelerStudios

+1

this.a = 1; this.b = 1; – Damiano

+2

Возможный дубликат [Является ли Java «сквозной ссылкой» или «передачей по значению»?] (Http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass -by-value) –

ответ

6

Изменить

b = 1; 

в

this.b = 1; 

так, как вы сейчас, вы изменяете параметр (локальной) переменной не переменная класса.

+1

И * локальная переменная * вы имеете в виду * параметр *. – Andreas

+0

Обновлено для уточнения. Хорошее предложение. – JustinKSU

+0

спасибо ù, сейчас штраф –

0

Это потому, что int не является ссылочным объектом, например, это не объект, который создается словом new, поэтому внутри метода, когда вы передаете метод b, для этой цели будет создана новая переменная, и это может быть справедливым в этом методе. Если объект, созданный словом new, тогда это повлияет, если он изменится каким-либо другим способом.

0

Параметр имени b в функции g(int b, int[] c)кожевенного переменной член класса b, поэтому вы устанавливаете локальный параметр, называемый b 1 в g(int b, int[] c). Это не влияет на переменную-член вообще, и новое значение отбрасывается после выхода g.

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

+0

спасибо ù, сейчас штраф –

0
public class Qcb90 { 
    int a; 
    int b; 
    public void f() { 
     a = 0; 
     b = 0; 
     int[] c = { 0 }; 
     g(b, c); 
    // so here b is your instance variable 
     System.out.println(a + " " + b + " " + c[0] + " "); 
    } 
    public void g(int b, int[] c) { 
     a = 1; 
     //b = 1; this b is a parameter of your method 
this.b=1; //now run your program 


     c[0] = 1; 
    } 
    public static void main(String[] args) { 
     Qcb90 obj = new Qcb90(); 
     obj.f(); 
    } 
    } 

Если вы хотите напечатать b значение, которое нужно писать this.b внутри g()

+0

поблагодарить ù, сейчас штраф –

+0

Я хотел бы проголосовать за вас, но им не разрешено это делать, я новичок здесь. Мне нужно заработать больше очков репутации, чтобы сделать это. Извини чувак –

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