桃九酒 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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)