JavaSE基础语法:特殊类(特殊情景下的设计模式)

一、单例设计模式

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. 核心特点

  1. 接口不能创建对象
  2. JDK8 版本划分:
  • JDK7 及以前:接口只能有全局常量、抽象方法
    • 常量默认:public static final(可以省略)
    • 抽象方法默认:public abstract(可以省略)
  • JDK8 新增:默认方法 (default)、静态方法 (static)
  • JDK9 新增:私有方法 private
  1. 一个类可以同时实现多个接口class A implements B,C{}
  2. 接口与接口之间可以使用 extends 继承,支持多继承
java 复制代码
interface A extends B,C{}
  1. 接口没有构造器!

4. 重要规则

普通类实现接口:必须重写接口全部抽象方法; 抽象类实现接口:可以不重写抽象方法,交给子类完成。

5. 抽象类和接口的区别

  1. 抽象类:用class,单继承;可以有实例变量、构造器;侧重模板、公共代码复用
  2. 接口:用interface,多实现;只能定义常量;侧重行为规范、能力标准

6. 拓展接口

① 默认方法 default(JDK8)

作用:接口升级时,不用强迫所有实现类重写新增方法; 只能通过实现类对象调用,子类可以选择重写。

java 复制代码
default void test(){}

② 静态方法 static(JDK8)

只能通过 接口名。方法名 () 调用,实现类对象不能继承、不能调用。

java 复制代码
static void test(){}

③ 私有方法 private(JDK9)

供接口内部的默认方法互相调用,外部无法访问

相关推荐
不正经学生1 小时前
C语言大小端字节序:内存里字节的排列顺序
c语言·开发语言·arm开发·c++·算法·c#
黑泽明*1 小时前
LVS-Keepalived-全解析
服务器·开发语言·笔记·学习·php
动词ing1 小时前
【C语言】命名规范
c语言·开发语言
大可-1 小时前
Go Air 热重载安装配置指南
开发语言·后端·golang
2401_894915531 小时前
Geo 优化源码部署避坑指南:解决访问异常、定位失效、收录卡顿问题
java·服务器·后端·缓存·开源
Dovis(誓平步青云)1 小时前
《 固井工程软件 Cemsol 的数据管理与国产化适配实践》
android·java·开发语言·人工智能
大模型码小白1 小时前
AI安全前沿:AI大模型安全防护的前沿技术
java·网络·人工智能·python·深度学习·学习·安全
evans在进步1 小时前
LeetCode 34:在排序数组中查找元素的首尾位置——Java 两次二分查找详解
java·python·leetcode
@卓越俊逸_角立杰出@1 小时前
java实现Agent+ReAct demo(Spring Boot + Spring AI Alibaba ReAct Agent)
java·spring·react.js