为什么保留静态变量但Object.toString哈希码是不同的?

时间:2016-04-18 16:19:52

标签: android

如果按下后退按钮并再次启动活动(两次),则哈希码不同,但保留分配的静态变量。它创建了两个不同的对象。这是如何工作的?

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::    com.xyz.state.MainActivity$MyStaticClz@fbd3691
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::     com.xyz.state.MainActivity$MyStaticClz@c1666fb
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

1 个答案:

答案 0 :(得分:3)

这是静态(类)变量和实例变量之间的区别。 https://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

  

在声明中包含static修饰符的字段称为静态字段或类变量。它们与类相关联,而不是与任何对象相关联。该类的每个实例共享一个类变量,该变量位于内存中的一个固定位置