为什么保留了一个静态变量,但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::    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

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

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

最新更新