第一个需求:在整个程序运行过程中,要求有且仅有一个这个类的类队象存在
解决一:在这个程序运行过程中,有且只调用一次构造方法。
问题一:方案一不够严谨,存在一个问题就是就我自己知道只能调用一次构造方法,但是别人不知道,别人都可以通过new关键字创建这个类的对象
解决二:我们可以不让类外调用这个构造方法,通过private对构造方法进行私有化。
private SingleDemo(int num) {
this.num = num;
}
问题二:私有化构造方法之后,在类外不能使用,但是我还想用这个类,怎么能够在类外创建对象或者是获取对象呢?
目前环境:一,构造方法不能用。二,类外没有对象。
解决二:现在能够使用的只能是静态方法,
借助于静态(static)获取或者创建类对象。
该方法要提供给类外使用:权限修饰符为【public】
调用时不能通过对象来调用,需要类名对象,使用【static】修饰该方法是要获取当前类的类对象,所以 返回值应该是当前类对象类型 【SingleDemo】
方法名字:【getInstance()】
参数要和类内私有化的构造方法所需参数一致:【int num】
public static SingleDemo getInstance(int num) {
SingleDemo s = new SingleDemo(num);
//私有化的构造方法可以在类内使用
return s;}
第二个需求:
如果能判断一下当前的程序当中有没有SingleDemo的类对象,
如果没有,创建,调用私有化的构造方法
如果有,不再创建
public static SingleDemo getInstance(int num) {
if (s == null) {
s = new SingleDemo(num);
}
//私有化的构造方法可以在类内使用
return s;
}
需要一个变量来保存创建对象的地址
public static SingleDemo s = null;
放哪?
假设:
1. 用局部变量保存对象地址
不行!!!每一次调用时,之前的局部已经被销毁
2. 用非静态成员变量
不用想,静态方法中不能使用非静态的成员变量!!!
3. 用静态成员变量
解决:
用静态的成员变量来保存之前创建的对象地址
public static SingleDemo s = null;
发现类外可以直接通过类名来修改静态成员变量的数据
解决:
private修饰
private static SingleDemo s = null;
下面是代码:
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);