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

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

代码是这样的:

单例类:

[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个回答

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

qq_21210473
桃九酒 你好,非常感谢你的回答,关于你说的问题一,我有疑问的是,第一次拿出来的i是被修改过的,为什么之后拿出来的i不是被修改的值而是变成了初始状态的值,疑惑的是单例只有一个实例,变量的值和是否有没有static没有关系的话,i不是应该一直是被修改过的值吗?求解惑
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问