3.静态代码块通常用于对类的成员变量进行初始化,只加载一次,因此静态代码块只执行一次。4.单例模式主要保证在整个程序运行期间类,只存在一个实例对象。比如世间只有一个月亮,就只能说是一个,说有两个就违背了事实
//3.静态代码块
class Example8{
static{
System.out.println("静态代码块执行了"); //静态代码块,在虚拟机加载(有且只加载一次)时便会执行,然后才去调用后面的main方法
}
public static void main(String[] args){ //
Person p1=new Person();
Person p2=new Person();//这里创建了两个对象,如果是非静态代码块,会分别执行一次,一共2次,但静态的代码块的类加且只加载一次,执行一次,所以只打印一次
}
}
class Person{
static String country;
static{
country="china";
System.out.println("Person 类中的静态代码块也执行了,创建了两个对象,但类只会被加载一次,因此只打印一次!");
}
}
/**静态代码块通常用于对类的成员变量进行初始化,只加载一次,因此静态代码块只执行一次*/
//4.单例模式
class Single{
private static Single INSTANCE=new Single();//单例特性1:构造方法类用private修饰,外部就不能用new创建对象了 特性2:使用静态变量INSTANCE引用对象
private Single(){}//私有化构造方法
public static Single getInstance(){//提供一个方法供外部调用
return INSTANCE;
}
}
//以上也可以写为如下形式,多了个final,个人不知有何妙处
/*
class Single{
public static final Single INSTANCE=new Single();//public允许外部调用,static让外部可以用类名.变量名调用,final禁止外部修改,INSTANCE唯一途径
private Single(){}
public static Single getInstance(){//提供一个方法供外部调用
return INSTANCE;
}
}
*/
class Example9{
public static void main(String[] args){
Single s1=Single.getInstance();
Single s2=Single.getInstance();
System.out.println(s1==s2);//正常情况,s1和s2是不可能相等的(至少对象名称不同),但单例模式则会相等,不论调用多少次,都是同一个对象
}
}
/**
单例模式主要保证在整个程序运行期间类,只存在一个实例对象。比如世间只有一个月亮,就只能说是一个,说有两个就违背了事实
*/