一、单例类
大部分时候都把类的构造方法定义成public访问权限,允许任何类自由创建该类的对象。但在某些时候,允许其他类自由创建该类的对象没有任何意义,还可能造成系统性能下降。如果一个类始终只能创建一个实例,则这个类被称为单例类。
1、单例类的创建要求:
①该类的构造方法使用private修饰,将该类的所有构造方法隐藏起来;
②需要提供一个public方法作为该类的访问点,用于创建该类的对象,且该方法必须使用static修饰;(因为调用该方法之前还不存在对象,因此调用该方法的不可能是对象,只能是类)
③该类还必须缓存已经创建的对象,否则该类无法知道是否曾经创建过对象,也就无法保证只创建一个对象。该成员变量需要被上面的静态方法访问,故该成员变量必须也使用static修饰。
例:
public class Singleton {// 使用一个类变量来缓存曾经创建的实例
private static Singleton instance;
// 对构造方法使用private修饰,隐藏该构造方法
private Singleton() {
}
// 提供一个静态方法,用于返回Singleton实例
// 该方法可以加入自定义控制,保证只产生一个Singleton对象
public static Singleton getInstance() {
// 如果instance为null,则表明还不曾创建Singleton对象
// 如果instance不为null,则表明已经创建了Singleton对象
// 将不会重新创建新的实例
if (instance == null) {
// 创建一个Singleton对象,并将其缓存起来
instance = new Singleton();
}
return instance;
}
}
public class SingletonTest {
public static void main(String[] args) {
// 创建Singleton对象不能通过构造方法,只能通过getInstance方法来得到实例
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2);//将输出true
}
}
正是通过上面getInstance方法提供的自定义控制(这也是封装的优势:不允许自由访问类的成员变量和实现细节,而是通过方法来控制合适暴露),保证Singleton类只能产生一个实例。所以,在SingletonTest类的main()方法中,看到两次产生的Singleton对象实际上是同一个对象。
二、final成员变量
在编写程序时,用final修饰的成员变量必须由程序员显式地指定初始值。final修饰的类变量,要么在定义该类变量时指定初始值,要么在初始化块中为该类变量指定初始值,要么在构造方法中指定初始值,以上三个地方不能重复赋值。(注意:程序在编译的时候,不会对成员变量进行默认初始化)
三、final局部变量
如果final修饰的局部变量在定义时没有指定默认值,则可以在后面代码中对该final变量赋初始值,但只能一次,不能重复赋值;如果final修饰的局部变量在定义时已经指定默认值,则后面代码中不能再对该变量赋值。(如果在形参中用了final,则不能在形参构造方法中对该变量赋值)