2016-04-18 6 views
0

バックボタンを押してもう一度アクティビティを開始すると(2回)、ハッシュコードは異なりますが、割り当てられた静的変数は保持されます。 2つの異なるオブジェクトを作成します。これはどのように作動しますか?どのように静的変数は保持されますが、Object.toStringハッシュコードは異なりますか?

public class MainActivity extends AppCompatActivity { 

private static int myStatic = 1; 
private int my = 1; 
private Button button = null; 
private MyStaticClz myStaticClz = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if(myStaticClz == null) { 
     myStaticClz = new MyStaticClz(); 
     Log.v("myStaticClz: ", myStaticClz.toString()); 
    } 

    button = (Button) findViewById(R.id.button); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      myStatic = 2; 
      my = 2; 
      myStaticClz.checkStatic = 2; 
      myStaticClz.check = 2; 
     } 
    }); 

    Log.v("myStatic: ", String.valueOf(myStatic)); 
    Log.v("my: ", String.valueOf(my)); 
    Log.v("checkStatic: ", String.valueOf(myStaticClz.checkStatic)); 
    Log.v("check: ", String.valueOf(myStaticClz.check)); 
} 

public static class MyStaticClz { 
    public static int checkStatic = 1; 
    public int check = 1; 
} 
} 

出力:

04-18 18:10:42.599 3357-3357/com.xyz.state V/myStaticClz:: [email protected] 
04-18 18:10:42.599 3357-3357/com.xyz.state V/myStatic:: 2 
04-18 18:10:42.599 3357-3357/com.xyz.state V/my:: 1 
04-18 18:10:42.599 3357-3357/com.xyz.state V/checkStatic:: 2 
04-18 18:10:42.599 3357-3357/com.xyz.state V/check:: 1 
04-18 18:10:55.738 3357-3357/com.xyz.state V/myStaticClz::  [email protected] 
04-18 18:10:55.738 3357-3357/com.xyz.state V/myStatic:: 2 
04-18 18:10:55.738 3357-3357/com.xyz.state V/my:: 1 
04-18 18:10:55.738 3357-3357/com.xyz.state V/checkStatic:: 2 
04-18 18:10:55.738 3357-3357/com.xyz.state V/check:: 1 
+3

[Java Static vs Instance](http://stackoverflow.com/questions/11906913/java-static-vs)の可能な複製-instance) – azurefrog

+0

はい。申し訳ありませんが、それはまだAndroidの開発者を助けるかもしれません。 – powder366

答えて

3

これは静的(クラス)変数とインスタンス変数との間の差です。その宣言にstatic修飾子を持って https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

フィールドは、静的フィールドやクラス変数と呼ばれます。それらはどんなオブジェクトでもなくクラスに関連付けられています。クラスの各インスタンスは、クラス変数を共有します。これは、メモリ内の固定された場所にあります。

+0

実際、私はそれについて考えている答えを知っていました。素早く尋ねると、ちょっと愚かな感じがする:-)舞台裏でどのように詳しい情報が得られるのですか? – powder366

+0

良い読み込み:http://stackoverflow.com/questions/708012/how-to-declare-global-variables-in-android?rq=1 – powder366

+1

@ powder366 JVMのシーンの背後には、特別なメモリ領域(別名PermGen )は、静的変数のようなクラスとその関連データを格納するために使用されます。 Dalvikには、LinearAllocという同様の領域があります。 http://stackoverflow.com/questions/22299403/whats-the-data-in-dalvik-linearalloc-dalvik-aux-structure-dalvik-bitmap-1da – Evgeny

関連する問題