饿汉式
“立即加载”,随着类的加载,当前的唯一实例就创建了
(优点)写法简单,由于内存中更早加载,使用方便快捷 线程安全
(缺点)内存中占用时间较长
懒汉式
“延迟加载”,在需要使用的时候进行创建实例
(优点)在需要的时候进行创建,节省内存空间
(缺点) 线程不安全
//饿汉式单例模式
class Bank {
//1、类的构造器私有化
private Bank() {
}
//2、在类的内部创建当前类的实例,声明为static类型
private static Bank instance = new Bank();
//3、使用get方法获得当前类的实例
public static Bank getInstance() {
return instance;
}
}
//懒汉式单例模式
class Friend {
//1、类的构造器私有化
private Friend() {
}
// 2、声明当前类的实例
private static Friend friend = null;
//3、使用get方法获得当前类的实例,如果未创建对象,则在方法内部创建对象
public static Friend getFriend() {
if (friend == null) {
friend = new Friend();
}
return friend;
}
}
public class SingletonTest {
public static void main(String[] args) {
Bank instance1 = Bank.getInstance();
Bank instance2 = Bank.getInstance();
System.out.println(instance1 == instance2); //true
Friend friend1 = Friend.getFriend();
Friend friend2 = Friend.getFriend();
System.out.println(friend1 == friend2); //true
}
}
main()方法的理解
视为普通的静态方法,视为程序的入口
JVM需要调用类的main()方法,所以该方法访问权限必须是public,又因为JVM在执行main()方法时不必创建对象,所以该方法是static的,该方法接收一个String类型的数组参数,保存执行Java命令时传递给所运行的类的参数。
因为main()方法是静态的,不能直接访问该类中的非静态成员,必须创建该类的一个实例对象后才能通过这个对象访问类中的非静态成员。