2017-03-12 13 views
0

メンバー変数がiで、クラスの3つの異なるメソッドで値を変更しています。メンバのデータをグローバル変数と異なるメソッドに変更する方法

だから毎回、開始値はiですか?これはグローバル変数を持つこととはどのように違いますか?これは強いノー・ノーであり、ぶつかることはありませんか?

public class ChangingMember { 
int i = 1; 
public static void main(String[] args) { 
    ChangingMember obj = new ChangingMember(); 
    System.out.println(obj.i); 
    obj.test(); 
    obj.test1(); 
    obj.test2(); 
    System.out.println(obj.i); 
} 

public void test() { 
    i++; 
} 

public void test1() { 
    i++; 
} 

public void test2() { 
    i++; 
} 

}

+0

「ChangingMember」の別のインスタンスを作成することができ、その「i」フィールドが異なるため、グローバル変数とは異なります。 – Andreas

答えて

1

これらのメソッドを呼び出すには、オブジェクトにアクセスする必要があります。つまり、あなたはそれに明確な依存関係があります。それを使用するどのクラスにも渡す必要があります。このオブジェクトへのアクセス権を明示的に与えるコードだけが変数を変更できます。これはグローバル変数とは異なります。

void foo(ChangeingMember member) { // <-- dependency 
    member.test1();  
} 

void bar() { // <-- no dependency 
    SomeGlobal.someMethod(); 
} 

あなたがオブジェクトを作成した場合:

ChangingMember obj = new ChangingMember(); 

をあなたはまだそれは状態だ制御します。オブジェクトに他のコードアクセス権を与えた場合のみ、状態を変更することができます。

foo(obj); // Giving 'foo' access to 'obj' 

しかし、何かがグローバル変数にアクセスできます。カプセル化はありません。

0

変数が静的ではないのでいいえ、それは常に同じになります。

ChangingMemberクラスの新しいオブジェクトを作成した場合、iの開始値は同じ(1)になります。新しいオブジェクトに常に最後の値を設定したい場合は、このプロパティを静的にする必要があります。

static int i = 1;

+0

'i ++'、 '++ i'、' i + = 1'はすべて 'i'の値を1だけインクリメントします。 – Andreas

+0

はい、そうです、値を再割当てしなければなりません! –

0

クラスのインスタンスを1つだけ使用するため、そのメソッドを使用して変数を変更できます。変数をグローバルにするか、そのクラスの他のインスタンスと共有するには、static修飾子を追加します。あなたがstatic修飾子を削除するのであれば、コードを出力し、同じ結果を

static int i = 1; 

public static void main(String[] args) { 
    ChangingMember obj = new ChangingMember(); 

    System.out.println(obj.i); 

    new ChangingMember().test(); 
    new ChangingMember().test1(); 
    new ChangingMember().test2(); 

    System.out.println(obj.i); 
} 

は今、結果が異なることになるでしょう。

0

すべてのグローバル変数の値は、クラスの初期化時に割り当てられます。

コードを1行ずつトラバースします。

ChangingMember obj = new ChangingMember(); 

作成されたオブジェクト、今から1

obj.test(); 

試験()によって呼び出されているオブジェクト(OBJ)に割り当てられたすべてのグローバル変数の値object objのスコープ内に既に値1を持つ変数iのインクリメンタルプロシージャを実行します。

public void test() { 
    i++; 
} 

..従ってそれは増分される。残りの2つの方法にも同じことが適用されます。

注:コードを書く際には、naming conventionsをよく使うようにしてください。

関連する問題