2015-05-02 178 views
3

我寫了這段代碼來清除我的疑惑,我對此有點困惑。不能改變實例變量的值

class Client{ 
    int a=80; 

    public void setA(int a) { 
     this.a = a; 
    } 

    public int getA() 
    { 
     return a; 
    } 

    public static void add(int b) 
    { 
     b=15; 
     System.out.println(b); 
    } 

    public static void main(String[] args) { 
     int b=10; 
     System.out.println(b); //Output 10; that's Ok with me 
     add(b); //Output 15; that's Ok 
     System.out.println(b); // Expected output 15 but still 10 
     new Client().a=56; 
     System.out.println(new Client().a); //Expected output 56 but prints 80 
     new Client().setA(98); 
     System.out.println(new Client().a); //Expected output 98 but prints 80 
     System.out.println(new Client().getA()); //Expected output 98 but prints 80 
    } 
} 

輸出:

10 
15 
10 
80 
80 
80 

Q A.在addb值被設置爲15的方法。最初它是10。所以b的最終值現在應該是15。它仍在打印爲10

問題B.我有一個實例變量a用值80初始化。我創建一個Client對象&嘗試更改該值,如代碼中所示。但a的值每次都打印一次。 a的值應該改變。

+0

一種方法,使您的誤解明確:申報'了'字段'private'。 – jdphenix

+1

不要混淆你自己,用'local'和'instance'變量,這裏變量'b'是'local'到'main',另一個變量'b'是'local'到'add'方法,它們都是不同的。而且,'Client'類的每個對象都會有不同的變量'a',你在輸出中看到的基本上是'a'的不同值,因爲變量'a'不是靜態的,因此,它不會被每個實例共享,因此每個實例都會擁有它自己的變量'a'的副本:-) –

回答

3

您每次都在創建新對象。將對象引用存儲到變量中。

Client client = new Client(); 
client.setA(56); 
System.out.println(client.getA()); 

client.setA(98); 
System.out.println(client.getA()); 

當你調用new Client()你正在製作類客戶端的新對象,並且它們並不相互連接既不共享數據。

要存儲b變量的值並使其在靜態方法調用之間保持不變,請將其聲明爲靜態類字段。

class Client{ 
    int a=80; 
    static int b; 

,不要在你的方法,以防止局部變量類變量聲明的陰影與名b的變量。

當您的方法完成執行時,局部變量(在您的情況下,在您的方法中聲明)不會持久。

2

所以B的最終值應該是15,現在它仍然打印爲10

這是一個不同的B,作爲參數是按值傳遞。

public static void add(int b) 
{ 
    b=15; 
    System.out.println(b); 
} 

你可以重寫代碼這樣

public static void add(int anotherB) 
{ 
    b=15; 
    System.out.println(b); 
} 

,它不會編譯,加強在這個方法的變量是一個比主聲明不同。

再次重寫它作爲

public static void add(int anotherB) 
{ 
    anotherB=15; 
    System.out.println(anotherB); 
} 

,它會再次編譯,並且應該清楚的是,這是一個不同的變量比在main()。

但是每次打印的價值都一樣。 a的值應該改變。

同樣的問題。你有兩個不同的變量,不同的範圍,同名a。你有一個額外的問題,你不斷創建Client()的新實例。

1

答:

public static void add(int b) 
{ 
    b=15;  // <---- This is changing the local parm 
    System.out.println(b); 
} 

public static void main(String[] args) { 
    int b=10; // <---- This is in the scope of main and will not be altered 
    System.out.println(b); //Output 10; that's Ok with me 
    add(b); //Output 15; that's Ok 
    System.out.println(b); // Expected output 15 but still 10 

B::您正在改變傳遞給add()方法的參數的值,而不是變量在main()宣稱你創建一個匿名對象和分配56到a,未命名的對象立即超出範圍。

new Client().a=56; // <-- changed to 56 and then gone 

然後你再創建一個打印80,它消失了瞬間太...

System.out.println(new Client().a); //Expected output 56 but prints 80 

創建另一個匿名對象,並指定98到

new Client().setA(98); 

它消失...

您創建兩個無名稱的對象,它們被初始化爲80

System.out.println(new Client().a); //Expected output 98 but prints 80 
    System.out.println(new Client().getA()); //Expected output 98 but prints 80 
} 

試試這個:

Client c = new Client(); 

    c.a=56;  // It is now 56 
    System.out.println(c.a); //prints 56 
    c.setA(98); 
    System.out.println(c.a); //prints 98 
    System.out.println(c.a); //prints 98 
    System.out.println(c.getA()); //prints 98 
}