------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、概述
1.设计模式
解决的问题:保证一个类在内存中的对象唯一性。
比如:多程序读取一个配置文件的时候,建议配置文件封装成对象,会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。
2.如何保证对象唯一性呢?
思想:
1.不让其他程序创建该对象
2.在本类中创建一个本类对象
3.对外提供方法,让其他程序获取这个对象
步骤:
1.将构造函数私有化
2.就在类中创建一个本类对象
3.定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。
二:实现
//饿汉式 public class SingleDemo{ public static void main(String args[]){ Single ss = Single.getinstance(); } } class Single{ private Single(){}//私有化构造函数 private static Single s = new Single();//创建私有并静态本类对象 public static Single getinstance(){//定义公有并静态的方法,返回该对象 return s; } } //懒汉式 public class SingleDemo{ public static void main(String args[]){ Single ss = Single.getinstance(); } } class Single{ private Single(){} private static Single s = null;//先初始化为null public static Single getinstance(){ if(s == null){ //判断是否为空 s = new Single();//创建新类 return s; } } 懒汉式会出现问题,就是在前一个对象进入后,cpu中断了对他的操作,以后的就进不去 解决办法: class Single{ private Single(){} private static Single s = null;//先初始化为null public static synchronized Single getinstance(){//用synchronized上锁 if(s == null){ //判断是否为空 s = new Single();//创建新类 return s; } }//但这样执行效率很差 class Single { private static Single s = null; private Single(){} public static Single getInstance() { if(s==null) { synchronized(Single.class) { if(s==null)//进行双重判断 s = new Single(); } } return s; } }
三:创建对象详解
Person p = new person();
创建对象都在内存中做了什么事情?
1.先将硬盘上指定位置的person.class文件加载进内存
2.执行main方法时,在占内存中开辟main方法的空间,然后再main方法的栈区分配了一个变量p
3.在堆内存开辟一个实体空间,分配一个内存的首地址new
4.在该实体空间中进行属性的空间分配,并进行默认初始化
5.对空间中的属性进行显示初始化
6.进行实体的构造代码块初始化
7.调用该实体对应的构造函数,进行构造函数初始化
8.将首地址赋给p,p变量就引用了该实体(也就是指向了该对象)
时间: 2024-11-03 21:34:07