单例模式简介及由它引出的JAVA局部静态变量问题
来源:互联网 发布:菜鸟网络2017校园招聘 编辑:程序博客网 时间:2024/05/11 20:08
单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供实例。
单例模式类的特点:
- 只能有一个实例;
- 自己创建这个实例;
- 整个系统都使用这个实例。
先看一般的单例模式类,类名为SingletonClass,定义如下:
public class SingletonClass { private static SingletonClass singleton; private SingletonClass(){ } public static SingletonClass getInstance(){ if(singleton == null){ singleton = new SingletonClass(); } System. out.println(singleton); return singleton ; }}
在类中定义了一个SingletonClass类对象引用singleton,注意它前面的关键字static,表明他是静态变量。同时,注意类的构造函数的作用域是private,这样做的目的是使得要得到该类的实例只能通过后面的静态方法getInstance()得到。
下面定义一个测试类Test,其定义如下:
public class Test { public static void main(String[] args) { System. out.println("singletoninstance1" ); SingletonClass. getInstance(); System. out.println("singletoninstance2" ); SingletonClass. getInstance(); }}
测试结果如下:
singletoninstance1com.learning.singleton.SingletonClass@c17164singletoninstance2com.learning.singleton.SingletonClass@c17164
注意两次得到的对象是同一个。
我们可以做些尝试,修改下类,比如将对象引用定义为 private SingletonClass singleton,这样得到的结果是:在getInstance方法中会报错Cannot make a static reference to the non-static field singleton,大概的意思是不能将静态引用赋值给飞静态变量singleton。但问题是在方法中语句new SingletonClass();返回的是静态引用吗?这个咱们再做个测试,在方法中定义一个对象,然后将其引用赋给singleton:
还是报同样的错误Cannot make a static reference to the non-static field singleton,这是什么原因呢?难道说在静态方法中创建的对象引用也是静态的吗?
在网上查的些资料说静态方法中的变量只是局部变量,从上面的例子看似乎没那么简单。也有说静态方法中的变量就是静态的,这种说法有点符合上面的测试结果,但是在方法外部又访问不了该变量。那到底静态方法中的变量到底是什么呢?只能说它是局部静态变量了。也不知道这样讲是否正确,希望大家指正。
最后注意下getInstance()方法中的if判断语句,在这个例子中如果少了该判断那就会产生多个实例了,也违背了单例模式的思想了。
0 0
- 单例模式简介及由它引出的JAVA局部静态变量问题
- 解析 Java 类和对象的初始化过程 由一个单态模式引出的问题谈起
- 遇到的问题一:单例模式及由此引发的静态方法与静态变量的问题
- C++单例模式下,静态变量的问题。
- 静态局部变量的问题
- Singleton模式的静态局部变量的问题
- 由遇到的问题引出抽象工厂模式
- java基础---静态变量,成员变量,局部变量及类的初始化顺序
- JAVA学习笔记--- 静态变量、成员变量、局部变量及类的初始化顺序
- 由单页应用引出的胡言乱语
- Java:由Object.clone()而引出的protected权限问题
- 由一个简单示例 引出java继承中父子类成员变量共享问题 以及super的使用
- 单例模式实现版本1——用局部静态变量
- 成员变量、局部变量、静态变量的区别及
- Java静态变量以及非标准单态模式的坑
- 单例模式中静态类成员变量初始化问题
- 全局静态变量及局部静态变量
- Java 成员变量 局部变量 静态变量的比较
- 添加最少括号使得给定括号字符串匹配
- summary: share nothing architecture VS share everything architecture
- 用GruntJS合并、压缩JS文件
- hdu 1002 A + B Problem II
- C语言编程--爱因斯坦的阶梯问题
- 单例模式简介及由它引出的JAVA局部静态变量问题
- 时钟中断hook
- HTML5开发学习:本地存储Web Sql Database
- 动态规划索引
- Extjs4 ajax请求超时页面跳转
- 观察者模式
- 线段树讲义
- ubuntu小结
- 文件操作函数fseek设置文件指针的位置,第三个参数是起始地址,有0,1,2三个值,分别指首地址,当前地址,文件尾地址EOF;第二个参数是偏移地址正为右,负为左