package demos3;
public class Demo01 {
public static void main(String[] args) {
//使用类型调用静态方法,获取类中提供好的对象
//不管调用多少次,返回的都是同一个对象
Sun s1 = Sun.getSun();
Sun s2 = Sun.getSun();
System.out.println(s1 == s2);
}
}
//太阳类型的对象,只能创建一个(提供一个)
class Sun{
//1、为了防止在其他类中随意创建对象
// 将类中的构造方法私有化
private Sun(){}
//2、要在类中提供一个共有的对象
private static Sun s = new Sun();
//3、提供一个获取该对象的方式
public static Sun getSun(){
return s;
}
}
1.3 单例设计模式之:老汉式设计(饿汉式的一种)
package demos3;
public class Demo02 {
public static void main(String[] args) {
Sun2 s1 = Sun2.s;
Sun2 s2 = Sun2.s;
System.out.println(s1 == s2);
}
}
//保证该类对象只有一个
class Sun2{
//将构造方法私有化
private Sun2(){}
//提供一个共用的对象
//将该对象定义为公共的,静态的,最终修饰的
//可以多次使用这一个对象,通过类名调用即可,但是不能更改
public static final Sun2 s = new Sun2();
public void show(){
System.out.println("太阳发光发热");
}
}
1.4 单例设计模式之懒汉式
package demos3;
public class Demo03 {
public static void main(String[] args) {
Thread t1 = new Thread(){
public void run(){
Sun3 s1 = Sun3.getSun();
}
};
Thread t2 = new Thread(){
public void run(){
Sun3 s2 = Sun3.getSun();
}
};
}
}
//问题:第一种和第二种,都是静态定义该对象,都是在类型加载之后就已经创建成功(浪费空间)
// 提供的对象,什么时候需要使用,什么时候再提供
class Sun3{
//构造私有化
private Sun3(){}
//提供一个共有的对象使用
private static Sun3 s;
//一旦给该方法加上同步代码块之后,每次执行该方法,都需要先获取锁对象,降低了程序的运行效率
public static Sun3 getSun(){
//同步代码块之前加上一个判断:为了防止每次执行该方法都获取锁对象
if(s == null){
//为了保证多线程情况下,只创建一个对象,需要将判断语句同步
synchronized (Sun3.class){
//为了防止创建多次对象,如果s没有创建过,就创建
//如果有创建过,就不需要再次创建
if (s == null){
s = new Sun3();
}
}
}
return s;
}
}
2 枚举类型
2.1 概述
概述:如果某个类型的对象是有限个,可以使用枚举来定义该类型。
2.2 定义枚举类型的第一种形式
定义枚举使用enum关键字来定义,定义的也是一个类型(和class同一个级别)
该类需要几个对象,就定义几个对象名(正常给对象起名即可)
每个对象使用逗号分隔,最后一个分号结束
枚举类型中的对象都必须在第一行定义
枚举类型中定义的对象一般称为:枚举项
如果使用枚举定义一个类型,前提是:该类的对象是有限个
如果在类中没有定义任何构造方法,默认提供一个私有的空参构造
代码
package demos4;
public class Demo01 {
public static void main(String[] args) {
WeekDay111 w1 = WeekDay111.w1;
WeekDay111 w2 = WeekDay111.w2;
WeekDay111 w3 = WeekDay111.w3;
System.out.println(w1==w2);
System.out.println(w1==w3);
System.out.println(w3==w2);
w1.show();
w2.show();
w3.show();
}
}
//定义一个类型,要求该类型的对象只有三个
//使用单例设计模式的思想来定义该类型
class WeekDay{
//构造方法私有化
private WeekDay(){}
//提供共有的对象
public static final WeekDay w1 = new WeekDay();
public static final WeekDay w2 = new WeekDay();
public static final WeekDay w3 = new WeekDay();
public void show(){
System.out.println("该类是一个星期类型");
}
}
//使用枚举的方式定义该类型
enum WeekDay111{
//定义的名字,其实就是一个个对象
w1,w2,w3;
public void show(){
System.out.println("这是一个枚举类型");
}
}