package com.study; public class Study { public static void main(String[] args) { GirFriend girFriend01 = GirFriend.getInstance(); GirFriend girFriend02 = GirFriend.getInstance(); //注意此处不是new对象,是直接调用静态方法,把结果赋给对象 System.out.println(girFriend01); System.out.println(girFriend02); System.out.println(girFriend01 == girFriend02);//是同一个对象(静态) System.out.println(Cat.len);//9 Cat instance01 = Cat.getInstance(); System.out.println(instance01); //再次调用 Cat instance02 = Cat.getInstance(); System.out.println(instance02); System.out.println(instance01 == instance02); } } /* 单例模式:饿汉式(只要类加载对象就创建了) 1.私有化构造器(添加private不让外部new) 2.在内部创建对象(添加static) 3.提供一个公共的static方法,返回friend对象 4.浪费资源 */ class GirFriend{ private String name; //GirFriend friend = new GirFriend("xh"); private static GirFriend friend = new GirFriend("xh"); //这里直接创建好了静态对象,会随着类加载而加载 //此处好像可以不加private //添加static是因为需要被静态方法调用(静态只能调静态) private GirFriend(String name){//私有化构造器,加private是不让外面new System.out.println("构造器GirFriend被调用..."); this.name = name; } //创建这个方法的目的是为了不用创建对象也可以调用此方法 public static GirFriend getInstance(){//getInstance获取实例 return friend; } @Override public String toString() { return "GirFriend{" + "name='" + name + '\'' + '}'; } } /* 单例模式:懒汉式(对象在使用时创建) 1.私有化构造器(添加private不让外部new) 2.定义一个静态属性对象 3.提供一个public static方法,可以返回一个Cat对象 4.只有当用户调用getInstance(),才返回cat对象,后面再次调用时会返回上次创建的对象,从而保证了单例 5.存在线程安全问题 希望在程序创建中只创建一个Cat对象,使用单例模式 */ class Cat{ private String name; public static int len = 9;//这里创建静态属性len,测试类加载发现cat对象并没有创建 private static Cat cat;//cat对象没有赋值默认为null private Cat(String name) { System.out.println("构造器Cat被调用..."); this.name = name; } public static Cat getInstance(){//此处存在线程安全问题,需要加锁 if (cat == null){//如果没用创建cat对象则直接创建 cat = new Cat("wy"); } return cat; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + '}'; } }