当前位置: 首页 > 知识库问答 >
问题:

为什么静态变量被保留,但Object.to字符串哈希代码不同?

俞子实
2023-03-14

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

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个答案

谭修竹
2023-03-14

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

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

 类似资料:
  • 请考虑以下代码: 首次运行: 139068974 第二次运行: -263623806 现在考虑用科特林写的同样的东西: 首次运行: 1498789909 第二次运行: 1498789909 为什么的哈希码每次在. NET中执行都会更改,但在JVM等其他运行时不会更改?

  • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

  • 问题内容: 我是一位Java程序员,对公司领域来说是新手。最近,我已经使用Groovy和Java 开发了一个应用程序。我编写的所有代码都使用了大量的静态变量。高级技术人员要求我减少使用的静电数量。我已经在谷歌上搜索了相同的内容,并且发现许多程序员都反对使用静态变量。 我发现静态变量更易于使用。而且我认为它们也是有效的(如果我错了,请纠正我),因为如果我必须对一个类中的一个函数进行10,000次调用

  • 主要内容:静态哈希的操作,1.打开散列,2.关闭哈希在静态哈希中,结果数据桶地址将始终相同。 这意味着如果使用散列函数生成地址,那么它将始终产生相同的桶地址。这里,桶地址不会有任何变化。 因此,在这种静态散列中,内存中数据桶的数量始终保持不变。 在这个例子中,在内存中有五个数据桶用于存储数据。 静态哈希的操作 搜索记录 - 当需要搜索记录时,相同的哈希函数检索存储数据桶的地址。 插入记录 - 当一个新记录插入表中时,将根据哈希键为新记录生成一个地址

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应

  • 问题内容: 我不明白为什么这个简单的代码行不起作用: 它正在输出“ SomeVariable is $ someVariable”,而不是数字0。是否缺少某些内容或必须启用某些配置选项? 问题答案: 那是因为您需要使用双引号来代替。当用单引号引起来时,php不会将变量转换为它们的值