类的初始化顺序以及单例模式

1.类的初始化顺序:
静态变量,静态块,实例变量,实力块,构造方法

class Test{
    public Test(){
        System.out.println("实例变量");
    }
}
class TestStatic{
    public TestStatic(){
        System.out.println("静态变量");
    }
}
public class People {
    private Test name = new Test();
    private static TestStatic a = new TestStatic();

    static {
        System.out.println("静态块");//静态块(不能提供this引用)初始化静态变量
    }

    {
        System.out.println("实例块");//实例块初始化实例变量
    }
    public People(String name,int age){
        System.out.println("构造方法");//构造方法(可以提供this引用)里静态变量和实例变量都可初始化
    }
}
public class TestDemo {
    public static void main(String[] args) {
        People p = new People("zs",10);
    }
}

运行结果
另外对于这个初始化顺序,我们暂且不管静态部分,很明显在构造方法之前先对实例变量初始化,也就是先为其分内存,内存里放的是它的默认值,如果我们的构造方法里什么都不填没有对name赋初值,那在外面打印name的结果是空,也就是说JVM中默认如果不赋初值会自动给name赋一个空值,给整型静态a赋一个默认值0,结合打印的初始化顺序我们可以推断出其赋值的时机,已经事先为实例变量分配好默认值内存后,如果你不想要默认值,在构造方法里this.name = name;进行赋值操作调用构造方法,再把之前分配好的内存里默认值更改为现在你所赋的值zs或者lisi。

常见的两种单例模式

要解释单例模式,我想说一个很表明也很常见的现象,就是我们的电脑桌面,我们电脑桌面上有很多图标文档,就相当于一个个的对象,右键选中某个文档,我们可以选择复制并且粘贴出新的内容一样的文档,也就是产生了新的对象,当然名字是不同的,我需要几个副本就可以复制粘贴几次,就相当于我new了很多次,开了很多内存,这些都是多例的,但是总有几个是不能复制粘贴的,比如回收站,我的电脑等等,这就是我们所要表达的单例模式的意思,即不能产生多个对象。在代码上不能多次实例化即不能多次调用new,再说白点,就是外面主程序里面只能new一次,再new就new不了。
你说如果把类里面的有参构造改成private,你吧就一个也new不了了,你要写成public就想new随时都能new,两个极端但是相比之下肯定还是private,但凡用public,一new肯定会调用有参构造,粘贴一次,你说给里面加个count计数器吧,让 if(count == 1){return;}终止,但你前面压根private根本调用不了,对于刚学习的小白来说这些应该是最先能想到的,但也是最low的方式,那我们能不能可以让它new很多次,但是让它每个new出来的新对象的地址是一样的,我们定义一个public static People getInstance(){ return new People(); },但是通过对象名.访问根本访问不出来,利用上面我们所得出的JVM默认为空的结论,在里面给一个private static People p,如果不对它赋初值那它就是默认为空,那我们在public static People getInstance()里面加条件if( p == null)让p = new People(name);否则return p,思路就是这样,其实单例模式很简单,但是作为一个伟大的Java语言学习者,我们还是有必要靠自己的思路一步步思考而来!
1.快加载单例模式

public class People{//快是在静态变量部分是最先初始化
   private String name;
   private static People p = new People();//类的加载过程
   private People(){
   }
   public static People getInstance(){
       return p;
   }
}

2.慢加载单例模式

public class People{
   private String name;
   private static People p;
   private People(String name){
       this.name = name;
   }
   public static People getInstance(String name){//慢是在普通方法里,你调用的时候它才会new,不调用不new,比构造方法还慢,构造方法new的时候把前四部分连同构造方法五部分一起都建立好了
       if(p == null){
           p = new People(name);
       }
       return p;
   }
}

快慢加载单例模式的快慢不是说运行速度的快慢,跟类的初始化顺序有关,类的初始化谁先谁快,谁后谁慢。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值