2016-03-20 32 views
-1

I次のコードのsnipet持っている:それは、メソッドsetNumberのようなものです を「123456789」を取得した結果として「987654321」を期待しJavaの結果が期待されていないよう

class Phone { 
    String phoneNumber = "123456789"; 
    void setNumber() { 
     String phoneNumber; 
     phoneNumber = "987654321"; 
    } 
} 
class TestPhone { 
    public static void main(String[] args) { 
     Phone p1 = new Phone(); 
     p1.setNumber(); 
     System.out.println (p1.phoneNumber); 
    } 
} 

イムが、イムを何も効果がありません 誰も私を理解するのに役立ちます

答えて

9

メソッド内のphoneNumber変数を再宣言し、クラス内のフィールドをシャドーイングして、ローカル変数に加えられた変更はシャドーイングされていませんクラスフィールド。これをしないでください。反復変数の宣言を取り除いて、メソッド内で行われた変更がフィールドに表示されるようにします。

例えば、これを変更:

void setNumber() { 
    String phoneNumber; // *** this is a local variable, visible ONLY in the method! 
    phoneNumber = "987654321"; // this has no effect on the field 
} 

をこれに:

void setNumber() { 
    // String phoneNumber; 
    phoneNumber = "987654321"; // this will change the field! 
} 
0

メソッド内であなたの変数はクラス変数をシャドウイングされた...奇妙な理由である

ベア...

+0

これはホバーの回答と同じですか?詳細なし... –

2

@Hovercraft Full Of Eels

void setNumber() { 
    String phoneNumber; 
    phoneNumber = "987654321"; 
    this.phoneNumber = "9876"; //this will change your field and give expected result 
} 

は、フィールドの値を設定するもう1つの方法です。長い方法で

は常にthisを使用して、ローカル変数やない、があるかもしれないので、 意識することなく、フィールドの影ができ、ローカル変数は

0

をシャドウイングすでに他で答えとして避けるために 良い点ですユーザーはshadowingであり、変数phoneNumberによってと再度宣言されています。setNumberメソッドの範囲内にあります。

setNumber内部変数phoneNumberは、その範囲外で知られていないが、それを変更クラスメンバーとして宣言異なるphoneNumber変数に影響を及ぼしません。

これは、明示的にthisを使用してクラスメンバを参照することをお勧めします。

サイドノート:アクセス修飾子は、裸にする代わりに使用してください(no modifierはクラスとパッケージのアクセスレベルがあります)。経験則として、常に最も制限の厳しいアクセス修飾子から始め、必要なときにのみ展開してください。

関連する問題