java 单例中的变量

反派大叔 2015-11-18 05:54:24

package com;

public class Singleton {

private static int num = 20;

private static Singleton singleton = new Singleton();

public static Singleton getInstance(){
return singleton;
}

private Singleton() {
}

public void meth(){
num = num - 1;
System.out.println(num);
}
}



测试类1:

package com;

public class TestMain {
public static void main(String[] args) {
System.out.println(Singleton.getInstance());
Singleton.getInstance().meth();
}
}


测试类2:

package com;

public class TestMain2 {
public static void main(String[] args) {
System.out.println(Singleton.getInstance());
Singleton.getInstance().meth();
}
}



问题:2个测试类Singleton.getInstance()得到的结果一样,是不是表明2个获得的实体类是同一个?如果是,为什么里面的num没改变,理应一个是19,一个是18才对,求解
...全文
218 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cx_轩 2015-11-18
  • 打赏
  • 举报
回复
我的哥 你用的是main程序入口启动的啊,你每次启动完之后,到执行结束是一次操作。。。这时值是会改变的 但是你第二次又用了一次main入口这时的她已经不是当年的她了!
飏飏一蝶 2015-11-18
  • 打赏
  • 举报
回复
两个main两个jvm进程,互不相关的。至于hashCode数组native方法,不知道咋算的,值一样可能不是按内存地址。
反派大叔 2015-11-18
  • 打赏
  • 举报
回复
引用 5 楼 sinat_31535993 的回复:
只有在同一内存中才有效,不同的main中测试,运行结束内存就释放了,结果当然一样了
竟然同一个内存有效,为什么2个运行输出的hash地址一样,之前也试了很多次,都一样,肯定不是巧合。
sinat_31535993 2015-11-18
  • 打赏
  • 举报
回复
只有在同一内存中才有效,不同的main中测试,运行结束内存就释放了,结果当然一样了
反派大叔 2015-11-18
  • 打赏
  • 举报
回复
引用 2 楼 sdjkjkjjk 的回复:
这两个方法是分别执行的,里面的代码一样,结果一样,如果放在同一个main里面,就和你的结果一样,static的声明只在内存中有效。
竟然是分开执行的,为什么2个的hash地址一样
反派大叔 2015-11-18
  • 打赏
  • 举报
回复
引用 1 楼 injuer 的回复:
Singleton singleton ==> 全局 int num ==> Singleton singleton的局部
这个全局指的是一个main函数里面的全局?
erstens 2015-11-18
  • 打赏
  • 举报
回复
这两个方法是分别执行的,里面的代码一样,结果一样,如果放在同一个main里面,就和你的结果一样,static的声明只在内存中有效。
injuer 2015-11-18
  • 打赏
  • 举报
回复
Singleton singleton ==> 全局 int num ==> Singleton singleton的局部
妖斩 2015-11-18
  • 打赏
  • 举报
回复
此它非彼它。
Cx_轩 2015-11-18
  • 打赏
  • 举报
回复
楼主有用hashcode去验证是否是同一个对象的想法是很不错的。, 但是你却没有懂hashcode的真正来因。。所以才会进入误区 对象的hashcode是根据它的内存地址处理后得到的一串内容。 我们知道不同的对象内存地址不同,它的hashcode也不同。 但是!某个类生成的不同对象是根据其的地址获取的,第一个对象的hashcode和第二个对象的hashcode是不一样的, 但是我们下次在去初始化,重新从第一个对象开始获取hashcode,这时我们获取的值和之前获取的第一个对象的hashcode是一样的。也就是说,在内存地址分配的时候,初始化从第一个开始分配,他就是已经固定了一个地址,获取的hashcode也是固定的。 所以我们每次重新开始创建第一个对象的hashcode是一样的,但是由于启动的是2次JVM所以它们并不是一个对象。 记住要在同一个操作里面,也就是同一个jvm里面的操作,我们获取到的hashcode一样才能证明是同一个对象
  • 打赏
  • 举报
回复
你看一下Object的toString方法 Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode()) 这说明2者的hashCode值相同而已 ========================= hashCode public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。 hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) 这说明hashCode返回的并不一定是内存地址,具体应当取决于运行时JTM的实现。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧