一、单例设计模式
1.作用
确保某个类只能创建一个对象,避免浪费内存,产生无效的资源占用
2.写法/实现步骤
eg1------饿汉式单例(预制)
拿对象时对象已经提前创建好
- 把类的构造器私有化
- 定义一个类变量记住类的一个对象
- 定义一个类方法,返回对象
java
public class A{
//2.定义一个类变量记住类的一个对象
private static(final) A a=new A();
//1.私有化构造器
private A(){}
//3.定义一个 类对象返回方法
public static A getObject(){return a;}
}
eg2------懒汉式单例(用才创建)
需要用对象时才开始创建
- 私有构造器
- 定义静态变量用于存储对象
- 提供静态方法,保证返回的是同一个对象
java
public class A{
//2.定义一个类变量记住类的一个对象
private static(final) A a;//null
//1.私有化构造器
private A(){}
//3.定义一个 类对象返回方法
public static A getObject(){
if(a==null){a=new A();}
return a;
}
}
二、枚举类enum
1.作用
- 做信息分类和标志
- 限制传入参数范围,实现类型安全;普通常量只是数值,编译器无法校验传入的值是否合法,枚举可以
- 统一管理一组固定有限的常量,可读性更强
2.写法
枚举类第一行只能写枚举类的对象名称,且要用逗号隔开
- 这些名称本质是常量,每个常量(static final)都记住了枚举类的一个对象
java
修饰符 enum 枚举类名{
名称1,名称2,名称3; // 分号:如果后面有成员变量、构造、方法,分号不能省略
其他成员...
}
3.特点

(图注:右侧是反编译的代码)
- 枚举类都是最终类,不可以被继承,枚举类都是继承java.lang.Enum类的,所以也不能继承其他类
- 枚举类的第一行只能罗列一些名称,这些名称是常量,并且每个常量会记住枚举类的一个对象
- 枚举类的构造器都是私有的(写不写都只能是私有的),因此枚举类对外不能创建对象
- 编译器会为枚举类增添几个方法(比如 name()名字,ordinal()索引/位置)
三、抽象类abstract
1.作用
作为特殊的父类让子类继承并实现,即为了更好地支持多态(非必须,优化需要)
但是需要注意的是,一个类继承抽象类之后,必须要重写继承的所有抽象方法,否则这个类也必须要定义成抽象类
2.写法
java
修饰符 abstract class 类名{
修饰符 abstract 返回值类型 方法名称(形参列表);
//抽象方法:只能abstract修饰,只有方法签名没有方法体
}
- 抽象类中不一定要有抽象方法,但有抽象方法的一定是抽象类
- 类有的成员:成员变量、方法、构造器、抽象类都可以有,只不过多了一个可以有抽象方法
- 缺:抽象类不能够创建对象,进作为一个特殊的父类,让子类继承并实现
3.应用场景(最佳实践)
当所有子类都需要这个功能,但是每个子类用法都不一样时,便可以使用抽象方法,虽然空方法也可以,但是抽象方法更符合最佳实践的思想(更简洁更高级)
- 模板方法设计模式
简单来说就是提供了一个方法作为某类功能的模板,模板方法封装了每个实现步骤,但允许子类提供特定步骤的实现
这样可以提高代码的复用、并简化子类的设计

这里其实可以为write方法加上final关键字,防止子类更改模板方法(注意不可以添加static关键字,因为静态方法并不支持多态,已知静态方法想要调用常态方法需要通过对象,但抽象类没有对象,所以会发生编译错误)
四、接口
1. 作用
- 定义行为规范(标准),对外暴露能力;
- 实现多实现,弥补 Java 类单继承的局限;
- 用于解耦,面向接口编程
2. 基础写法
java
修饰符 interface 接口名{
//抽象方法(JDK8之前唯一成员)
public abstract void run();
}
类实现接口使用关键字 implements
java
public class Student implements 接口名{
//必须重写所有抽象方法
@Override
public void run(){}
}
3. 核心特点
- 接口不能创建对象;
- JDK8 版本划分:
- JDK7 及以前:接口只能有全局常量、抽象方法
- 常量默认:
public static final(可以省略) - 抽象方法默认:
public abstract(可以省略)
- 常量默认:
- JDK8 新增:默认方法 (default)、静态方法 (static)
- JDK9 新增:私有方法 private
- 一个类可以同时实现多个接口 :
class A implements B,C{} - 接口与接口之间可以使用
extends继承,支持多继承
java
interface A extends B,C{}
- 接口没有构造器!
4. 重要规则
普通类实现接口:必须重写接口全部抽象方法; 抽象类实现接口:可以不重写抽象方法,交给子类完成。
5. 抽象类和接口的区别
- 抽象类:用
class,单继承;可以有实例变量、构造器;侧重模板、公共代码复用 - 接口:用
interface,多实现;只能定义常量;侧重行为规范、能力标准
6. 拓展接口
① 默认方法 default(JDK8)
作用:接口升级时,不用强迫所有实现类重写新增方法; 只能通过实现类对象调用,子类可以选择重写。
java
default void test(){}
② 静态方法 static(JDK8)
只能通过 接口名。方法名 () 调用,实现类对象不能继承、不能调用。
java
static void test(){}
③ 私有方法 private(JDK9)
供接口内部的默认方法互相调用,外部无法访问