需求
在整个程序的运行过程中,有且只能有一个当前类的类对象存在,单例思想!
方案
在整个程序的运行过程中,有且只调用一个构造方法
问题
你知道只能调用一次,但是别人不知道
这里除了你自己别人都不会这么认为,任何一个调用者都可以非常简单的通过new 关键字
借助于当前类的构造方法,创建一个新的对象,违背当前情况
解决
让类外无法轻松的调用构造方法,私有化构造方法
问题
私有化之后的构造方法,在类外无法使用,如何在类外创建对象或者说获取对象?
环境
构造方法不能用
类外没有对象
所有和对象有关的方法,都不能使用
现在能够使用的方法只能是静态(static)的方法
方案
借助于静态(static)获取或者创建对象,所以返回值应该是当前类对象类型【SingleDemo】
方法名字:【getInstance()】
参数要和类内私有化的构造方法所需参数一致:【int num】
问题:
创建对象麻烦了,但是效果是一样的
需求:
如果能判断一下当前的程序当中有没有SingleDemo的类对象。如果没有,调用私有化的构造方法;如果有,不再创建
需要一个变量来保存创建对象的地址
变量数据类型 SingleDemo
放哪?
假设:1,用局部变量保存对象地址,不行,每一次调用时,之前的局部已经被销毁
2,用非静态成员变量,也不行,静态方法中不能使用非静态的成员变量
3,用静态成员变量
解决:
用静态成员变量来保存之前创建的对象地址
问题:
发现类外可以直接通过类名来修改静态成员变量的数据
解决:
private修饰
class SingleDemo {
int num;
private static SingleDemo s = null;
private SingleDemo(int num) {
this.num = num;
}
public void test() {
System.out.println(this.getClass() + "的test方法");
}
public static SingleDemo getInstance(int num) {
if (s == null) {
s = new SingleDemo(num);
}
//私有化的构造方法可以在类内使用
return s;
}
}
public class Demo1 {
public static void main(String[] args) {
//
//SingleDemo s = new SingleDemo(5);
SingleDemo s1 = SingleDemo.getInstance(5);
System.out.println(s1);
SingleDemo s2 = SingleDemo.getInstance(5);
System.out.println(s2);
//SingleDemo.s = null;
SingleDemo s3 = SingleDemo.getInstance(5);
System.out.println(s3);
SingleDemo s4 = SingleDemo.getInstance(5);
System.out.println(s4);
SingleDemo s5 = SingleDemo.getInstance(5);
System.out.println(s5);
SingleDemo s6 = SingleDemo.getInstance(5);
System.out.println(s6);
SingleDemo s7 = SingleDemo.getInstance(5);
System.out.println(s7);
SingleDemo s8 = SingleDemo.getInstance(5);
System.out.println(s8);
SingleDemo s9 = SingleDemo.getInstance(5);
System.out.println(s9);
SingleDemo s10 = SingleDemo.getInstance(5);
System.out.println(s10);
}
}