单例(Singleton)设计模式
只有一个实例(实例化对象)。
在整个软件系统运行过程中,这个类只被实例化一次,以后不论在哪只调用这一个实例。
例如,实例化对象创建要消耗大量的时间和资源。
饿汉式的单例模式
public class Single{
//私有的构造,构造方法私有化,调用这个类不能直接使用new来创建对象
private Single(){
}
//私有的Single类型的类变量
private static Single single = new Single();
public static Single getInstance(){
return single;
}
}
//在main调用
Single s = Single.getInstance();
无论在main中调用多少个Single.getInstance()方法,都指向同一个single对象,所以从头到尾只会new一个Single对象。
懒汉式
最开始对象是null,直到有第一个人调用我,才new一个对象,之后所有调用我的都用这个对象。
public class Single1{
//先私有化构造方法,让外边不能直接new对象
private Single1(){
}
private static Single1 s1 = null;
public static Single1 getInstance(){
if(s1 == null){
s1 = new Single1();
}
return s1;
}
}
//在main调用
Single1 s = Single1.getInstance();
懒汉式和饿汉式的区别,就是什么时候new这个对象。
懒汉式,是在第一次有人调用getInstance方法时来new对象,以后再有人调用getInstance方法直接就返回之前第一次new好的对象。
饿汉式,是在类加载之后,还没有人调用时,就先new好一个对象,以后无论谁来调用getInstance方法,就是直接返回之前new好的那个对象。
类的成员之四:初始化块
作用:对java对象进行初始化。
public class Test{
{
......
}
static{
......
}
例:
public class Person{
String name;
static int age;
public Person(){
this.name = "zhangsan";
System.out.println("执行构造方法");
}
//非静态的代码块
{
System.out.println("执行的是非静态代码块");
}
结果:先 执行的是非静态代码块
再 执行构造方法
//静态代码块
static{
//这里只能使用静态修饰的属性和方法
age = 1;
showAge();
}
public static void showAge(){
System.out.println(age);
}
静态代码块只执行一次
执行步骤:在new Person()执行的时候
1、类的属性的默认初始化和显示初始化
2、执行代码块的代码
3、执行构造器的代码
在程序的运行过程中,非静态代码块每次new对象都有重新执行,静态代码块只执行一次。
在实际开发中,static静态代码块用在初始化类的静态属性(static类型属性)。
例:
构建了一个没有类名的Person的子类,也就是匿名的Person的子类。
Person p = new Person(){
{//在匿名内部类中,用代码块代替构造方法
不想动原本Person代码,就在这里更改
super.+++ = "+++";
}
public void test(){
.....
}
};
这种类没有类名,就不能显示的new的方法创建对象,如果要是还有在构造器中初始化属性就没有办法了,这种情况就要用{}初始化。
关键字:final
final标记的类不能被继承;
final标记的方法不能被子类重写;
final标记的的变量(成员变量或局部变量)即称为常量。
final static
一起修饰变量,就是全局常量。
常量最好写成大写,如果多个单词组成名称,用_连接。