桃九酒 2015-08-31 03:39 采纳率: 0%
浏览 1832

在学习单例模式关于单例数据更新遇到个问题!求解

最近在学习单例模式,在写代码关于单例模数据更新的时候遇到了问题,求大师解惑!

代码是这样的:

单例类:

[java] view plaincopy
public class SingletonTest {

private static SingletonTest instance = null;    
private  int i= 0;  


public int getNum(){  
    return i;  
}  
public void setNum(int a){  

    i=a;  
    System.out.println("Set i ----->"+i);  
}  
private SingletonTest() {    
}    


private static class HolderSingleton{  
    private static  SingletonTest instance = new SingletonTest();//这里用不用关键字final没有什么影响,static fianl修饰的对象加强了instance只能是Singleton对  
}  
public static SingletonTest getInstance (){  
    return HolderSingleton.instance;  
}  




public void updateNum(){  

    System.out.println("i="+i);  
    SingletonTest shadow = new SingletonTest();    
    i=shadow.getNum();  
}  

}

测试类:

[java] view plaincopy
public class TestP {

public static void main(String[] args) {  
    // TODO Auto-generated method stub  
    SingletonTest ss = SingletonTest.getInstance();  
    SingletonTest ww = SingletonTest.getInstance();  

    ss.setNum(8);  
//  ss.updateNum();  
    ww.updateNum();  
    ww.updateNum();  
    ww.setNum(2);  
    ss.updateNum();  
    ww.updateNum();  
    ww.updateNum();  
}  

}

当需要更新的变量i 定义没有加static修饰符的时候,控制台输出结果是:
Set i ----->8
i=8
i=0
Set i ----->2
i=2
i=0
i=0

问题一:
觉得奇怪的地方就是,按道理 i 没有static修饰符, 打印出来的“i=?”应该全部都是“i=0”,为什么在设置了i 第一次跟新i的时候可以更新到。

给变量i加了static修饰符以后,数据可以更新到,没有问题,下边是加了static后的打印结果:
Set i ----->8
i=8
i=8
i=8
Set i ----->2
i=2
i=2
i=2

问题二:
所以还想问下,如果在单例模式的单例类中有需要更新的数据变量都必须用static修饰吗?

  • 写回答

1条回答

  • 毕小宝 博客专家认证 2015-08-31 05:12
    关注

    问题一:因为你的updateNum操作的i和showNum是同一个成员变量i,所以,你先修改了i后再取到的就是修改后的值了。
    问题二:static修饰的变量是类变量,即所有的类只有一份值,而非static成员变量则是实例变量,由类的各个实例操作的。
    单例类的成员变量不一定要用static修饰的,单例也是有一个实例的,可以定义非static成员变量的。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名